!/usr/bin/期望

!/usr/bin/期望

我需要编写一个在装有 Centos 7 的 PC 上运行的脚本,并使用 ssh 连接到另一台装有 Centos 7 的 PC,执行控制台命令,例如“ls -la”,并将其输出保存到文件中,以便能够稍后分析该输出。

我编写了以下 EXPECT 脚本:

ssh_connection.exp :

#!/usr/bin/expect -f
set timeout 120
spawn ssh [email protected]
expect "assword:"
send "PASSWORD\r"
expect "prompt#"
sleep 5
puts "Executing ls -la"
send "ls -la\r"
sleep 10
puts "Executing ps -af"
puts "ps -af\r"
sleep 10
puts "Closing the ssh session\r"
send "exit\r"

该脚本通过 ssh 正确连接到 IP = 129.0.0.10 的计算机,并在屏幕上显示“puts”上出现的消息: 执行 ls -la 执行 ps -af 关闭 ssh 会话

但是,它不显示执行我用 send 发送的命令的结果:

ls -la
ps -af

这个脚本有什么问题?

如何将前面命令的输出保存在文件中,以便以后能够使用 bash 脚本或 C 程序进行分析?

答案1

您不需要使用expect来执行此操作。该ssh命令可以采用您想要通过 SSH 连接运行的命令的附加参数。

步骤1

设置 SSH 密钥对(google 一下),然后将 SSH 密钥复制到远程服务器。为此,我建议使用ssh-copy-id.请参阅我对此 U&L 问答的回答,标题为:如何正确地将私钥从远程服务器复制到本地计算机,以便我可以使用 ssh 连接

第2步

现在,有了使用密钥通过 SSH 连接到服务器的能力,上述问题就变成了这样:

$ ssh [email protected] "ls -la; ps -af"

你可以喜欢并使用这里的文档(heredocs 又名.here-docs)进一步加强这项技术。

$ ssh [email protected] <<EOF
> ls -la
> ps -af
> EOF

或将命令放入文件中并将它们传递给ssh

$ ssh [email protected] < my.cmds

答案2

谢谢,

我修改了我的脚本,替换了以下行:

生成 ssh[电子邮件受保护]

正如你告诉我的那样:

生成 ssh[电子邮件受保护]“ls -la;ps -af”

现在我在屏幕上看到命令输出,并且可以重定向到文件。

接下来,我尝试修改此脚本以在另一台类似 Cisco 的交换机(不是 Cisco,但兼容)的机器上执行命令。

我使用 ssh 连接到交换机的脚本是:

**#!/usr/bin/expect -f

设置超时120

生成 ssh[电子邮件受保护]“显示 VLAN 500”

期待“密码:”

发送“密码\r”

期待“提示#”

睡5

输入“关闭 ssh 会话\r”

发送“退出\r”**

>

这在交换机上不起作用,我收到此错误:

生成 ssh[电子邮件受保护]显示 VLAN 501

[电子邮件受保护]的密码:

imish:无效选项 - 'c'

尝试“imish --help”以获取更多信息。

发送:spawn id exp6 未打开

while executing

“发送“退出\r””

(file "./ssh_script_v3.exp" line 7)

>

所以我必须使用使用“send”发送命令的期望脚本:

!/usr/bin/期望

生成 ssh[电子邮件受保护]

期待“密码:”

发送“用户\r”

期待>”

睡5

发送“sh vlan 500\r”

睡5

发送“退出\r”

>

现在我没有收到任何错误,但屏幕上没有显示任何内容。

我读到,发生这种情况是因为 Linux 和 UNIX 系统在非交互运行时自动缓冲其输出。我认为Expect可以通过“unbuffer”的方式让程序认为它们正在交互运行,但我不知道如何将“unbuffer”与“send”一起使用。我尝试这样做,但没有成功。

相关内容