2013-04-10 117 views
1

我有一個perl腳本作爲root運行,並從它內部我想要執行一個系統命令bar作爲一個較低的prrileged用戶foo。所以,我有我的system電話裹如下:從Perl腳本中刪除權限?

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

所以,我想說:

as user foo dosys("bar") 

是否有Perl或者,我可以用它來做到這一點底層的bash shell中的機制? (我寧願一個並不需要安裝額外的CPAN庫如果可能的話)

回答

1
system('su www-data -c whoami') 
> www-data 
4

POSIX模塊是一個Perl核心模塊,它包括以下功能:

  • setuid()
  • setgid()

和相關的get*id()功能,雖然值也可通過speci人變量:

  • $)$((有效和真實GID)
  • $<$>(有效和實際UID)

您也可以嘗試直接設置的(每$EGID$UID)。

+2

只要記住要評論你的代碼,如果你使用這些變量:)波恩。 – 2013-04-10 00:27:49

+0

@JoeFrambach或他可以'使用英語'。 – jordanm 2013-04-10 00:48:30

+0

@jordanm如果您要使用[英文](http://perldoc.perl.org/English.html),您應該使用'使用英文'-no_match_vars';'。 – 2013-04-11 04:52:05

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 
} 

請謹慎行事。