1

我有一个以 root 身份运行的 perl 脚本,我想在其中bar以较低特权用户的身份执行系统命令foo。所以我的system电话包装如下:

sub dosys
{
        system(@_) == 0
                or die "system @_ failed: $?";
}

所以我想说:

as user foo dosys("bar")

perl 或底层 bash shell 中是否有我可以用来执行此操作的机制?(如果可能的话,我更喜欢不需要安装额外的 cpan 库的那个)

4

3 回答 3

4

POSIX模块是 Perl 的核心模块,它包括以下功能:

  • setuid()
  • setgid()

和相关get*id()函数,尽管这些值也可以通过特殊变量获得:

  • $)$((有效和真实的 GID)
  • $<$>(有效且真实的 UID)

您也可以尝试直接设置这些(每个$EGID$UID)。

于 2013-04-10T00:23:33.380 回答
1
system('su www-data -c whoami')
> www-data
于 2013-04-10T00:22:52.363 回答
0

您必须先更改组,记住取消补充组,然后更改用户。您需要在单独的进程中执行此操作,以便 [UG]ID 更改不会影响您的根进程上的权限。

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
}

谨慎行事。

于 2013-04-10T05:17:13.750 回答