2011-07-27 44 views
1

我想用net:ssh2运行各种命令,但是这些命令需要以root身份运行。我通过SSH禁用了root登录,并且我已经设置了密钥,因此我可以使用ssh并使用'sudo su - root'来获取root密码。问题是我需要运行多个命令,所以我想知道是否可以连接,然后sudo root,然后运行我需要的所有命令,而无需将回显传递给sudo或使用expect。NET :: SSH2与sudo

我正在使用的代码的相关部分如下,如果可能的话,我最好喜欢在exec($ commands [0])之前使用 sudo。

编辑:我不能直接登录到有根或没有密码的根,因为它不幸地违反了政策。我必须先与我的用户联系。

my $ssh2 = Net::SSH2->new(); 
    $ssh2->connect($server) or die "$!\n"; 
    if ($ssh2->auth_publickey($user,"/home/$user/.ssh/id_rsa.pub", "/home/$user/.ssh/id_rsa")) 
    { 
      my $chan = $ssh2->channel(); 
      $chan->blocking(1); 
      $chan->exec($commands[0]); 
      my @users; 
      while(<$chan>) {push(@users,$_);} 
      my $stdout=join("",@users); 
      print $stdout; 
    } 

回答

2

我没有尝试这个,但su-c参数,它将一个命令传递给shell执行,然后完成贝壳。这很可能对应于shell的-c参数,它实际上很高兴地接受这里的复合命令,例如,由;分隔的命令列表。

因此执行

sudo su -c 'command1 ; command2 ; command3 ' - root 

能在这里工作。 (甚至只有一个的命令,然后反复调用这些。)

(不过,我觉得可能是一些错误的设置,如果他们允许密码的sudo su - root,但不正常的sudo命令执行。)

+0

谢谢!这应该完美。我们只能使用'sudo su - '的原因是因为它在sudoers文件中受到限制。我没有设置所有的规则,所以我不能说为什么它完成了,这里是sudoers文件的样子:%ourgroup ALL =(ALL)NOPASSWD:/ bin/su - root – zoite

1

而不是使用sudo su -刚刚着手sudo每个命令的。如果你被允许须藤不用密码就应该只是罚款:

$chan->exec("sudo $commands[0]"); 

如果你的命令需要root用户的路径只需指定的完整路径。 (不能说,因为你没有显示出什么命令。)

+0

我会这样做,但sudo本身需要密码。我必须做一些像'echo'命令“| sudo su - root',虽然确实有效,但我觉得这是一种非常丑恶的做事方式,但如果没有其他办法,我会以最后的方式做到这一点 – zoite

+1

@zoite:我不是系统管理员,但听起来像一个非常奇怪的方式来设置sudo权限。 –

+0

可以更改sudo以允许用户在没有密码的情况下进行切换。如果您必须在某个时候输入密码,则必须使用Expect。 – Cfreak