我是编程新手。我写了一个perl脚本,它执行以下操作。
1)ssh到远程机器
2)执行一系列命令。
脚本需要用户之间的交互。它需要用户名和密码。我不知道如何处理。
use Net::SSH::Expect;
use strict;
use warnings;
#login to a remote host
my $ssh = Net::SSH::Expect->new (host => "ipaddr",
password=> 'pwd',
user => 'username',
raw_pty => 1);
my $login_output = $ssh->login();
登录成功。现在,对于下面的scp命令,我被提示输入该系统的用户名和密码。脚本在这里停止。
my $cpscp = $ssh->exec("copy scp install ip addr filename");
Enter usename for remote scp server:
Enter the password for the remote server:
输入用户名后,我需要输入密码。这就是我所做的但是没有用。
my $usr = $ssh->waitfor ("Enter usename for remote scp server:\s*\z ", 5);
if ($usr)
{
print("string found \n");
my $pwd =$ssh->send("root");
}
else
{
print("No string found\n");
}
脚本无法识别它。 “找不到字符串”
我也试过以下
$ssh->waitfor('Enter username for remote scp server:\s*\z ', 5) or die "not found";
$ssh->send("root");
答案 0 :(得分:0)
我想用户名的提示已经作为对
的回复的一部分到达了my $cpscp = $ssh->exec("copy scp install ip addr filename");
所以随后的waitfor
将永远等待。
您应该send
使用waitfor
代替exec
,就像这样
$ssh->exec('copy scp install <ip-addr> <remote-dir> <remote-filename>');
my $found = $ssh->waitfor ('Enter usename for remote scp server:\s*\z', 5);
另请注意,您在waitfor
中使用的字符串可能不正确
"Enter usename for remote scp server:\s*\z "
当你可能需要usename
时,你有username
,并且你已经在字符串的末尾添加了一个空格,这是不可能的,因为\z
标记了输入的结束并且那里结束后显然没什么。
将同一个问题同时发布到两个网站也是不礼貌的。如果Perl Monks没有为您提供工作解决方案那么一定要在这里提出问题,但如果我们不知道您的问题已经解决了,那么您就是在浪费我们的时间别处。
答案 1 :(得分:0)
我认为用户名的提示已经作为对exec
my $cpscp = $ssh->exec("copy scp install ip addr filename");
所以随后的waitfor
将永远等待。
您应该send
使用waitfor
代替exec
,就像这样
$ssh->exec('copy scp install <ip-addr> <remote-dir> <remote-filename>');
my $found = $ssh->waitfor ('Enter usename for remote scp server:\s*\z', 5);
另请注意,您在waitfor
中使用的字符串可能不正确
"Enter usename for remote scp server:\s*\z "
当你可能需要usename
时,你有username
,并且你已经在字符串的末尾添加了一个空格,这是不可能的,因为\z
标记了输入的结束并且那里结束后显然没什么。
将同一个问题同时发布到两个网站也是不礼貌的。如果Perl Monks没有为您提供工作解决方案那么一定要在这里提出问题,但如果我们不知道您的问题已经解决了,那么您就是在浪费我们的时间别处。