如何在Perl中获取POSIX组成员列表
有没有办法在Perl中获取如何在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 我可以
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"
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"
getgr*()
无法判断一个组是包含一个foo-bar
条目还是两个foo
和bar
(这就是您要问的),并且我不能使用shell的~name
语法来引用帐户的主目录。我可以使用其他方法获取这两条信息,但一开始避免创建这样的帐户要容易得多
如果你真的担心一些管理员愚蠢到创建这样一个帐户,那么你可以使用一些已经讨论过的替代方法。但正如我所说,我认为这不值得努力
(Perl本可以通过使用:
字符而不是空格来分隔列表来避免这个问题,因为这些字符实际上与/etc/passwd的格式不兼容<