我正在尝试使用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;
}
答案 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的路径,请指定它的完整路径。 (由于你没有显示命令是什么,所以无法判断。)