我不清楚 ssh 的 stdout 和 stderr 因为如果我执行说:
ssh user@remotemachine_ip "some command"
我立即在屏幕上得到输出,或者可能有一些错误
已使用 ssh 登录
远程命令在远程机器上执行
输出显示在我可以看到的远程计算机(stderr 或 stdout)上。 然后它返回到本地机器。
或
输出返回到本地计算机的标准输出,并且可以附加到本地计算机上的文件。
所以如果我在本地机器中有一个 for 循环
for i in ip1 ip2
do
ssh user@remotemachine_ip "some command"
done
错误重定向的最佳方式是什么?它是否依赖于 for、while、until 循环
如果我使用一些 Expect 脚本而不是 ssh 会怎样
expectscript.exp user@remotemachine_ip "some command"
for ip in ip1 ip2
do
ssh user@$ip "some command" > output.$ip 2>&1
done
会将每个 IP 的输出放入单独的文件中。
for ip in ip1 ip2
do
ssh user@$ip "some command"
done > output 2>&1
将把所有输出放在一个文件中。
SSH
是一种协议,可让您像登录本地计算机一样登录远程计算机。
在本地计算机中,如果您运行登录 shell(例如
Ctrl + Alt + F1~6
之一),它会为用户启动一个新 shell,并且输出(stdout
和 stderr
)会直接显示在您的显示器上。
现在让我们看一下您的 SSH 案例,步骤与上次类似,只有一个区别,服务器不是将输出(再次
stdout
和stderr
)发送到监视器,而是将数据发送回您登录的机器 - 到 SSH client
。客户端在您的本地计算机中运行,因此仅在本地计算机的监视器上显示相同的输出。
但是,如果您要将
stdout
和/或 stderr
重定向到一个文件,当您位于远程计算机上的 shell 中时,该文件将位于远程计算机上,因为您的实际程序re running是在远程机器上执行的。
顺便说一句
SSH
不仅仅只是向远程计算机发送/接收数据,它还对数据进行加密等等。
错误重定向的最佳方法是什么
如果我只关注 stderr 重定向,以下可能是解决方案之一:
for ip in ip1 ip2
do
ssh user@$ip "some command" >output.$ip 2>output.$ip.err
done
ssh 看起来支持远程 stdout 到本地 stdout 以及远程 stderr 到本地 stderr,以便上面的脚本按我的预期运行。
如果你放
ssh user@$ip "some command" >output.$ip 2>output.$ip.err
在 expect 脚本中,
stdout
和 stderr
的重定向将被忽略(expect 将拦截重定向的输出。在 expect 脚本中,您可以添加 log_user 0 并使用 stdout
调用脚本)
重定向,这将起作用(尽管 stderr
无处可去)