Невозможно выполнить команду на удаленном компьютере, используя Net::SSH::Expect

Я хотел создать удаленное соединение и автоматизировать изменение пароля любой учетной записи пользователя на этом удаленном компьютере, поэтому я использую модуль Perl Net::SSH:: Expect. У меня установлено соединение, но я не могу выполнить какую-либо команду на удаленном компьютере. Я новичок в языке Perl, поэтому в моем коде могут быть некоторые ошибки. Я пытался найти это, но не смог найти что-то связанное с этим.

Первоначально я пытался использовать Net:: OpenSSH и модуль Expect в комбинации, но не смог реализовать сценарий использования.

#!/usr/bin/perl

use strict;
use warnings;
use Net::OpenSSH;
use Expect;

use Net::SSH::Expect;

my $uName= "user";

my $ssh = Net::SSH::Expect->new (
    host => "IPAddress",
    password=> "userPassword",
    user => $uName,
    raw_pty => 1
);

# logon to the SSH server using those credentials.
my $login_output = $ssh->login();
if ($login_output !~ /Welcome/) {
    die "Login has failed. Login output was $login_output";
}
#Random line display 
print "Connected to $uName\n";

#This is where I was trying the change password use case

$ssh->send("passwd") or die "Cannot execute the passwd command: $!\n";
$ssh->waitfor("Changing password for user.\n
(current) UNIX password: ", 3) or die "prompt 'password' not found after 1 second";
$ssh->send("oldPassword\n");
$ssh->waitfor("\n
Enter new UNIX password: " , 2) or die "prompt 'New password:' not found";
$ssh->send("newPassword");
$ssh->waitfor("\n
Retype new UNIX password: ", 1) or die "prompt 'Confirm new password:' not found";
$ssh->send("newPassword");

#$ssh->send("") or die "Cannot spawn: $!\n";
$ssh->close();

Это вывод, который я получаю

Cannot execute the passwd command

Новое обновление

Я попытался выполнить простую команду, просто чтобы проверить, выполняется ли какая-либо команда или нет. Но, тем не менее, мой вариант использования смены пароля с использованием send (passwd) - нет.

#!/usr/bin/perl

use strict;
use warnings;
#use Net::OpenSSH;
#use Expect;

use Net::SSH::Expect;

#
# You can do SSH authentication with user-password or without it.
#
my $uName= "admin1";
# Making an ssh connection with user-password authentication
# 1) construct the object
my $ssh = Net::SSH::Expect->new (
    host => "192.168.56.101",
    password=> "Passw0rd1",
    user => "admin1",
    raw_pty => 1
);

# 2) logon to the SSH server using those credentials.
# test the login output to make sure we had success
my $login_output = $ssh->login();
if ($login_output !~ /Welcome/) {
    die "Login has failed. Login output was $login_output";
}
print "Connected to $uName\n";

Это новая простая команда, которую я пытаюсь выполнить

my $who = $ssh->exec("who");
print ($who);

Мой старый вариант использования с die удален из send()

$ssh->send("passwd");
$ssh->waitfor("Changing password for $uName.\n(current) UNIX password: ", 2) or die "prompt 'password' not found after 2 second";
$ssh->send("Passw0rd1\n");
$ssh->waitfor("\nEnter new UNIX password: " , 2) or die "prompt 'New password:' not found";
$ssh->send("qwerty123");
$ssh->waitfor("\nRetype new UNIX password: ", 1) or die "prompt 'Confirm new password:' not found";
$ssh->send("qwerty123");


$ssh->close();

Теперь выход идет так

admin3@admin3-VirtualBox:~/Desktop$ perl NetSSHExpect.pl 
Connected to admin1
admin1   :0           2019-07-19 11:49 (:0)
admin1   pts/1        2019-07-19 12:41 (192.168.56.1)
admin1@admin1-VirtualBox:~$ prompt 'password' not found after 2 second at NetSSHExpect.pl line 36.
admin3@admin3-VirtualBox:~/Desktop$

1 ответ

Согласно документации:

void send ($ string) - отправляет $string на SSH сервер, ничего не возвращает
Отправляет строку на сервер SSH.

Так что не проверяйте возвращаемое значение, просто удалите or die .. часть после send():

$ssh->send("passwd");   # <-- no error code is returned here..
Другие вопросы по тегам