我有一个以root用户身份运行的perl脚本,从内部我想要执行系统命令bar
作为较小的用户foo
。所以我将system
调用包装如下:
sub dosys
{
system(@_) == 0
or die "system @_ failed: $?";
}
所以我想说:
as user foo dosys("bar")
我可以使用perl或底层bash shell中的机制来执行此操作吗? (如果可能的话,我更喜欢不需要安装额外的cpan库的那个)
答案 0 :(得分:4)
POSIX
模块是Perl核心模块,它包含以下功能:
setuid()
setgid()
和相关的get*id()
函数,尽管这些值也可通过特殊变量获得:
$)
和$(
(有效且真实的GID)$<
和$>
(有效且真实的UID)答案 1 :(得分:1)
system('su www-data -c whoami')
> www-data
答案 2 :(得分:0)
您必须先更改组,记住要撤消补充组,然后更改用户。您需要在单独的进程中执行此操作,以便[UG] ID更改不会影响根进程上的priv。
sub su_system {
my $acct = shift;
my $gid = getgrnam $acct; # XXX error checking!
my $uid = getpwnam $acct;
if (fork) { # XXX error checking!
wait;
return $? >> 8;
}
# -- child
$( = $) = "$gid $gid"; # No supp. groups; see perlvar $)
$< = $> = $uid;
exec @_; # XXX not as safe as exec {prog} @argv
# oh, and what if $acct had [ug]id zero? darn
}
谨慎行事。