从 ssh 会话捕获标准输出到本地计算机

use*_*029 3 ssh io-redirection file-copy expect stdout

我必须编写一个脚本,该脚本将通过 ssh 进入设备以运行“show running-config”等命令,并将输出保存到本地计算机上的文件中。我已经从命令行完成了类似的任务,并将文件保存到我的本地系统。例如,

ssh test@192.168.142.15 ls > ls_from_remotes_sys
Run Code Online (Sandbox Code Playgroud)

文件 ls_from_remotes_sys 位于我的本地系统上。然而,我需要编写这个脚本,而我知道如何做到这一点的唯一方法是使用expect。所以我整理了这个:

#!/usr/bin/expect -f

spawn ssh test@192.168.142.15 ls > ls_from_remotes_sys
expect "test@192.168.142.15's password:"
send "password\r"
interact
Run Code Online (Sandbox Code Playgroud)

Expect 脚本可以工作,但文件会保存到远程系统,这不是我想要的。

问题 1 - 为什么文件从命令行保存到本地系统,为什么用expect保存到远程系统?

问题 2 - 有没有办法将文件发送到我的本地系统?(ssh 返回不是一个选项)

我在想,也许我可以让脚本将命令结果输出到屏幕上,而不是重定向到文件。所以,

问题 3 - 如果我这样做,如何从远程系统捕获屏幕上的标准输出并将其发送到本地系统上的文件?

Ste*_*ris 5

您使用的命令expect

spawn ssh test@192.168.142.15 ls > ls_from_remotes_sys
Run Code Online (Sandbox Code Playgroud)

这有效地调用了

exec("ssh","test@192.168.142.15","ls",">","ls_from_remotes_sys")
Run Code Online (Sandbox Code Playgroud)

这意味着三个参数(ls>文件名)被发送到远程系统;即重定向发生在远程系统上。

一个拼凑可能是通过调用它sh -c "ssh test@...."

expect另一种选择是在脚本之外完成重定向

例如:如果您将此称为“get_ls”

#!/usr/bin/expect -f

spawn ssh test@192.168.142.15 ls
expect "test@192.168.142.15's password:"
send "password\r"
interact
Run Code Online (Sandbox Code Playgroud)

那么你可以这样做get_ls > ls_from_remotes_sys