Perl 如何使用Net::OpenSSH更改远程计算机上的根密码?

Perl 如何使用Net::OpenSSH更改远程计算机上的根密码?,perl,ssh,root,change-password,Perl,Ssh,Root,Change Password,我想用Perl脚本更改远程Linux机器上的根密码。我的第一次尝试是以下代码: use Net::OpenSSH; my $ssh = Net::OpenSSH->new( "linuxpc", user => "root", password => "root", master_stderr_discard => 1 ); my @changepass = $ssh->ca

我想用Perl脚本更改远程Linux机器上的根密码。我的第一次尝试是以下代码:

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new(
    "linuxpc",
    user                  => "root",
    password              => "root",
    master_stderr_discard => 1
);
my @changepass = $ssh->capture(
    {
        stderr_discard => 1,
        stdin_data     => "newpw123"
    },
    "passwd"
);
print "Done\n";

但不幸的是,这行不通。有人能帮我吗?

不要放弃你的错误,而是使用
capture2

($output,$errput)= $ssh->capture2(\%opts,@cmd)

远程机器

引自

此外,可能不相关,但可能使用
passwd
的完整路径。我不确定
capture
函数是否添加了换行符,但值得一试:

my @pwd = ("newpw123\n", "newpw123\n");
($output, $errput) = $ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd" );
ETA:当然,检查错误,看看发生了什么。在调试时丢弃错误是错误的做法(tm)

ETA2:尝试使用
--stdin
选项作为
passwd
,看看是否有帮助。例如:

$ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd --stdin" );

使用
capture2
,而不是丢弃错误:

($output,$errput)= $ssh->capture2(\%opts,@cmd)

远程机器

引自

此外,可能不相关,但可能使用
passwd
的完整路径。我不确定
capture
函数是否添加了换行符,但值得一试:

my @pwd = ("newpw123\n", "newpw123\n");
($output, $errput) = $ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd" );
ETA:当然,检查错误,看看发生了什么。在调试时丢弃错误是错误的做法(tm)

ETA2:尝试使用
--stdin
选项作为
passwd
,看看是否有帮助。例如:

$ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd --stdin" );
发行版包括一个示例脚本,它完全可以实现您想要的功能

发行版包括一个示例脚本,它完全可以实现您想要的功能



到底是什么不起作用?手动运行“passwd”时会发生什么?您收到了什么错误消息?密码更改无效。如果我在远程linux pc上从命令行手动运行passwd,我会得到插入新密码的提示。按enter键后,我将进入重新输入新密码的对话框。如果您将
stdin_data
更改为
newpw123\nneww123
,是否有帮助?否,没有帮助:-(确切地说,什么不起作用?当您手动运行“passwd”时会发生什么?您会收到什么错误消息?密码更改将不起作用。如果我在远程linux pc上从命令行手动运行passwd,我会得到插入新密码的提示。按enter键后,我会得到重新输入新密码的对话框。如果您更改标准数据至
newpw123\nneww123
?不,这没有帮助:-(感谢您的帮助。我尝试了您的解决方案,但出现了根用户密码未更改的错误。我尝试了使用换行符和不使用换行符,但没有成功。@Stefan
\n
可能不是表示按ENTER键的正确方式。不确定可能是什么。您可以尝试使用
系统
而不是
捕获
。是否应e同样的事情,但谁知道呢。检查manpasswd似乎有一个
--stdin
选项。也许这就是您的解决方案,更改为
“passwd--stdin”
@TLP此passwd没有stdin选项,因为它是一个最小的linux系统-(嗯,那么我的扣除能力失败了。设置了一些安全选项?例如,在更改为新密码之前,您必须输入您的旧密码,这样上面的
@pwd
应该是
@pwd=(“root\n”,“newpw123\n”,“newpw123\n”);
?感谢您的帮助。我尝试了您的解决方案,但遇到错误,root的密码没有更改。我尝试了使用换行符和不使用换行符,但没有成功。@Stefan
\n
可能不是表示按ENTER键的正确方式。.不确定可能是什么。您可以尝试使用
捕获
系统
而不是
捕获
。应该是一样的,但谁知道呢。检查manpasswd似乎有一个
--stdin
选项。也许这就是你的解决方案,改为
“passwd--stdin”
@TLP这个passwd没有stdin选项,因为它是一个最小的linux系统-(嗯,那么我的扣除能力失败了。设置了一些安全选项?例如,在更改为新密码之前,您必须输入您的旧密码,这样上面的
@pwd
应该是
@pwd=(“root\n”,“newpw123\n”,“newpw123\n”);