我必须编写一个脚本,该脚本将通过 ssh 进入设备来运行“show running-config”等命令,并将输出保存到本地计算机上的文件中。我已经从命令行完成了类似的任务,并将文件保存到我的本地系统。例如,
ssh [email protected] ls > ls_from_remotes_sys
文件 ls_from_remotes_sys 位于我的本地系统上。然而,我需要编写这个脚本,而我知道如何做到这一点的唯一方法是使用expect。所以我整理了这个:
#!/usr/bin/expect -f
spawn ssh [email protected] ls > ls_from_remotes_sys
expect "[email protected]'s password:"
send "password\r"
interact
Expect 脚本可以工作,但文件会保存到远程系统,这不是我想要的。
问题 1 - 为什么文件从命令行保存到本地系统,为什么用expect保存到远程系统?
问题 2 - 有没有办法将文件发送到我的本地系统? (ssh 返回不是一个选项)
我在想,也许我可以让脚本将命令结果输出到屏幕上,而不是重定向到文件。所以,
问题 3 - 如果我这样做,如何从远程系统捕获屏幕上的标准输出并将其发送到本地系统上的文件?
答案1
您使用的命令expect
:
spawn ssh [email protected] ls > ls_from_remotes_sys
这有效地调用了
exec("ssh","[email protected]","ls",">","ls_from_remotes_sys")
这意味着三个参数(ls
和>
文件名)被发送到远程系统;即重定向发生在远程系统上。
A拼凑可能是通过 调用它sh -c "ssh test@...."
。
expect
另一种选择是在脚本之外完成重定向
例如:如果您将此称为“get_ls”
#!/usr/bin/expect -f
spawn ssh [email protected] ls
expect "[email protected]'s password:"
send "password\r"
interact
那么你可以这样做get_ls > ls_from_remotes_sys
。