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

发布于 2024-11-10 07:31:13 字数 445 浏览 6 评论 0原文

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

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";

但不幸的是它不起作用。有人可以帮我吗?

I want to change the root password on a remote Linux machine with a Perl script. My first try was the following code:

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";

But unfortunately it won't work. Could somebody help me please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

同尘 2024-11-17 07:31:13

Net::OpenSSH 发行版包含一个示例脚本,它完全可以满足您的需求!

change_passwd.pl

Net::OpenSSH distribution includes a sample script that does exactly what you want!

change_passwd.pl

深海少女心 2024-11-17 07:31:13

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

($输出,$错误输出)=
$ssh->capture2(\%opts, @cmd)

捕获由 @cmd 发送到 stdout 和 stderr 的输出

远程机器。

引用自 CPAN

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

my @pwd = ("newpw123\n", "newpw123\n");
($output, $errput) = $ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd" );

ETA:当然,检查错误以查看发生了什么。在调试时丢弃错误是不好的做法 (tm)。

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

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

Instead of discarding your errors, use capture2:

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

captures the output sent to both stdout and stderr by @cmd on the

remote machine.

Quoted from CPAN

Also, might not be relevant, but perhaps use the full path to passwd. I am not sure whether a newline is added by the capture function, but it could be worth trying:

my @pwd = ("newpw123\n", "newpw123\n");
($output, $errput) = $ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd" );

ETA: And of course, check the errors to see what's going on. Discarding errors while debugging is Bad Practice (tm).

ETA2: Try using the --stdin option for passwd, see if that helps. E.g.:

$ssh->capture2( { stdin_data = \@pwd }, "/bin/passwd --stdin" );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文