NET :: SSH2与sudo

时间:2011-07-27 21:48:40

标签: linux perl ssh

我正在尝试使用net:ssh2运行各种命令,但是命令需要以root身份运行。我通过SSH禁用了root登录,并且我设置了密钥,所以我可以使用'sudo su - root'来获取没有密码的root访问权限。问题是我需要运行多个命令,所以我想知道是否可以连接,然后sudo到root,然后运行我需要的所有命令,而不必将回显管道传递给sudo或使用expect。

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

编辑:我无法使用或不使用密码直接登录root,因为它不利于策略。我必须先与我的用户联系。

    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 个答案:

答案 0 :(得分:2)

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

如此执行

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

可以在这里工作。 (或者甚至只有其中一个命令,然后反复调用它们。)

(但我认为如果设置允许无密码sudo su - root,而不是正常sudo命令执行,则设置可能有问题。)

答案 1 :(得分:1)

不要使用sudo su -,而只需使用sudo继续执行每个命令。如果您在没有密码的情况下被允许sudo,它应该可以正常工作:

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

如果您的命令需要root的路径,请指定它的完整路径。 (由于你没有显示命令是什么,所以无法判断。)