ssh 的 stderr 和 stdout?

问题描述 投票:0回答:4

我不清楚 ssh 的 stdout 和 stderr 因为如果我执行说:

ssh user@remotemachine_ip "some command"

我立即在屏幕上得到输出,或者可能有一些错误

  1. 已使用 ssh 登录

  2. 远程命令在远程机器上执行

  3. 输出显示在我可以看到的远程计算机(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"
ssh expect output
4个回答
4
投票
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

将把所有输出放在一个文件中。


3
投票

SSH
是一种协议,可让您像登录本地计算机一样登录远程计算机。

在本地计算机中,如果您运行登录 shell(例如

Ctrl + Alt + F1~6
之一),它会为用户启动一个新 shell,并且输出(
stdout
stderr
)会直接显示在您的显示器上。

现在让我们看一下您的 SSH 案例,步骤与上次类似,只有一个区别,服务器不是将输出(再次

stdout
stderr
)发送到监视器,而是将数据发送回您登录的机器 - 到
SSH client
。客户端在您的本地计算机中运行,因此仅在本地计算机的监视器上显示相同的输出。

但是,如果您要将

stdout
和/或
stderr
重定向到一个文件,当您位于远程计算机上的 shell 中时,该文件将位于远程计算机上,因为您的实际程序re running是在远程机器上执行的。

顺便说一句

SSH
不仅仅只是向远程计算机发送/接收数据,它还对数据进行加密等等。


1
投票

错误重定向的最佳方法是什么

如果我只关注 stderr 重定向,以下可能是解决方案之一:

for ip in ip1 ip2
do
  ssh user@$ip "some command" >output.$ip 2>output.$ip.err
done

ssh 看起来支持远程 stdout 到本地 stdout 以及远程 stderr 到本地 stderr,以便上面的脚本按我的预期运行。


0
投票

如果你放

ssh user@$ip "some command" >output.$ip 2>output.$ip.err

expect 脚本中,

stdout
stderr
的重定向将被忽略(expect 将拦截重定向的输出。在 expect 脚本中,您可以添加 log_user 0 并使用
stdout 调用脚本) 
重定向,这将起作用(尽管
stderr
无处可去)

© www.soinside.com 2019 - 2024. All rights reserved.