从perl脚本中删除权限?

时间:2013-04-10 00:13:51

标签: linux perl bash

我有一个以root用户身份运行的perl脚本,从内部我想要执行系统命令bar作为较小的用户foo。所以我将system调用包装如下:

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

所以我想说:

as user foo dosys("bar")

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

3 个答案:

答案 0 :(得分:4)

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

  • setuid()
  • setgid()

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

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

您也可以尝试直接设置($EGID$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
}

谨慎行事。