Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中获取POSIX组成员列表_Perl_Posix - Fatal编程技术网

如何在Perl中获取POSIX组成员列表

如何在Perl中获取POSIX组成员列表,perl,posix,Perl,Posix,有没有办法在Perl中获取POSIX组的所有成员的列表 我不能使用和类似,因为它以空格分隔的字符串形式返回列表,并且一些用户名中可以有空格 我必须处理用户名和组名中的空格,因为我在一个其他组织可以在其中创建用户和组的广告环境中工作,所以我尝试考虑可能的边缘情况。如果我有/etc/group: ... postgres:x:26: fsniper:x:481: clamupdate:x:480: some spacey group:x:482:saml, some spacey user 我可以

有没有办法在Perl中获取
POSIX
组的所有成员的列表

我不能使用和类似,因为它以空格分隔的字符串形式返回列表,并且一些用户名中可以有空格


我必须处理用户名和组名中的空格,因为我在一个其他组织可以在其中创建用户和组的广告环境中工作,所以我尝试考虑可能的边缘情况。

如果我有
/etc/group

...
postgres:x:26:
fsniper:x:481:
clamupdate:x:480:
some spacey group:x:482:saml, some spacey user
我可以使用以下命令查看此组的成员:

% getent group
...
postgres:x:26:
fsniper:x:481:
clamupdate:x:480:
some spacey group:x:482:saml,some spacey user
或者如果您知道您感兴趣的特定群体:

% getent group "some spacey group"
some spacey group:x:482:saml,some spacey user
这些可以包装在Perl脚本中,如下所示:

#!/usr/bin/perl

use feature qw(say);
chomp (my $getent = `getent group "some spacey group" | sed 's/.*://'`);
my @users = split(/,/, $getent);
foreach my $i (@users) { say $i; }
运行它:

% ./b.pl 
saml
some spacey user
资源

    • 如果我有
      /etc/group

      ...
      postgres:x:26:
      fsniper:x:481:
      clamupdate:x:480:
      some spacey group:x:482:saml, some spacey user
      
      我可以使用以下命令查看此组的成员:

      % getent group
      ...
      postgres:x:26:
      fsniper:x:481:
      clamupdate:x:480:
      some spacey group:x:482:saml,some spacey user
      
      或者如果您知道您感兴趣的特定群体:

      % getent group "some spacey group"
      some spacey group:x:482:saml,some spacey user
      
      这些可以包装在Perl脚本中,如下所示:

      #!/usr/bin/perl
      
      use feature qw(say);
      chomp (my $getent = `getent group "some spacey group" | sed 's/.*://'`);
      my @users = split(/,/, $getent);
      foreach my $i (@users) { say $i; }
      
      运行它:

      % ./b.pl 
      saml
      some spacey user
      
      资源

      我想说的是,只需使用
      getgrent()
      ,而不用担心空格

      也许可以通过手动编辑
      /etc/passwd
      ,创建一个包含一个或多个空格的用户名,但这也会导致其他问题。例如,
      ~foo
      foo
      的主目录,但
      ~foobar
      不是
      foobar
      的主目录

      在Linux上,
      useradd
      adduser
      命令甚至不允许在文件名中使用空格。在Linux Mint 14上(基于Ubuntu 12.10):

      您的系统中是否有带空格的用户名

      更新:我发现实际上可以创建带有空格的用户名
      useradd
      adduser
      不允许这样做(您应该使用其中一个命令或类似命令来创建新帐户)。但是,如果我使用
      sudo vipw
      手动编辑
      /etc/passwd
      ,我可以创建一个名为
      foo bar
      的用户,我可以:

      • su-‘富吧’
      • 宋承福bar@localhost"
      等等,但这真的是个坏主意。Perl的
      getgr*()
      无法判断一个组是包含一个
      foo-bar
      条目还是两个
      foo
      bar
      (这就是您要问的),并且我不能使用shell的
      ~name
      语法来引用帐户的主目录。我可以使用其他方法获取这两条信息,但一开始避免创建这样的帐户要容易得多

      如果你真的担心一些管理员愚蠢到创建这样一个帐户,那么你可以使用一些已经讨论过的替代方法。但正如我所说,我认为这不值得努力

      (Perl本可以通过使用
      字符而不是空格来分隔列表来避免这个问题,因为这些字符实际上与系统所依赖的
      /etc/passwd
      /etc/group
      的格式不兼容。但是现在更改它已经太晚了。)

      更新2:

      正如您在评论中所说(我已将其编辑到您的问题中):

      我必须处理用户名和组名中的空格,因为我在一个其他组织可以在其中创建用户和组的广告环境中工作,所以我尝试考虑可能的边缘情况

      您的解决方案来自同一评论:

      map((getgrgrid($_))[0], split(/ /, `id -G $username`))
      
      这可能是最好的解决办法。(
      id-G
      打印数字组id;其中显然不能包含空格。)


      也许还值得检查一下,您是否真的有带有空格的用户名或组名(当然,这并不能防止将来添加此类名称)。我想知道您的POSIX系统实际上是如何处理这些名称的。如果他们能自动翻译,我也不会感到惊讶。即使如此,您的
      id-G
      解决方案仍然有效。

      我想说的是,只需使用
      getgrent()
      ,不要担心空格

      也许可以通过手动编辑
      /etc/passwd
      ,创建一个包含一个或多个空格的用户名,但这也会导致其他问题。例如,
      ~foo
      foo
      的主目录,但
      ~foobar
      不是
      foobar
      的主目录

      在Linux上,
      useradd
      adduser
      命令甚至不允许在文件名中使用空格。在Linux Mint 14上(基于Ubuntu 12.10):

      您的系统中是否有带空格的用户名

      更新:我发现实际上可以创建带有空格的用户名
      useradd
      adduser
      不允许这样做(您应该使用其中一个命令或类似命令来创建新帐户)。但是,如果我使用
      sudo vipw
      手动编辑
      /etc/passwd
      ,我可以创建一个名为
      foo bar
      的用户,我可以:

      • su-‘富吧’
      • 宋承福bar@localhost"
      等等,但这真的是个坏主意。Perl的
      getgr*()
      无法判断一个组是包含一个
      foo-bar
      条目还是两个
      foo
      bar
      (这就是您要问的),并且我不能使用shell的
      ~name
      语法来引用帐户的主目录。我可以使用其他方法获取这两条信息,但一开始避免创建这样的帐户要容易得多

      如果你真的担心一些管理员愚蠢到创建这样一个帐户,那么你可以使用一些已经讨论过的替代方法。但正如我所说,我认为这不值得努力

      (Perl本可以通过使用
      字符而不是空格来分隔列表来避免这个问题,因为这些字符实际上与
      /etc/passwd的格式不兼容<