SSH的stderr和stdout是什么?

3
我不太清楚ssh的标准输出(stdout)和错误输出(stderr),因为如果我执行以下命令: ssh user@remotemachine_ip "some command" 我会立即在屏幕上看到输出或者可能是一些错误。
1. 通过ssh登录 2. 远程命令在远程机器上执行 3. 输出显示在远程机器上(stderr或stdout),我可以看到。 然后它回到本地机器。
或者
输出返回到本地机器的标准输出(stdout),可以将其附加到本地机器上的文件中。
因此,如果我在本地机器上有一个for循环。
for i in ip1 ip2
do
ssh user@remotemachine_ip  "some command" 
done

什么是最好的错误重定向方式,是否依赖于for、while、until循环?

如果我使用的不是ssh而是一些expect脚本,该怎么办?

expectscript.exp user@remotemachine_ip "some command"


你的问题不是很清楚。你具体想做什么?没有一种“最好的方法”,这取决于你的需求。 - Barmar
我在使用for循环处理多个IP地址时,遇到了ssh输出重定向的问题。如果将重定向放在for循环内部,只能得到第一个IP地址的输出;如果将重定向放在for循环外部,则只能得到最后一个IP地址的输出。这让我非常困扰。 - munish
你发布的代码中没有重定向,因此很难确定你出了什么问题。请发布具体有问题的代码,不要只是泛泛地描述。 - Barmar
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客户端 。客户端在本地计算机上运行,因此仅将相同的输出显示在本地计算机的监视器上。

但是,如果要将 stdout 和/或 stderr 重定向到文件,则当您在远程机器上的shell中时,该文件将位于远程机器上,因为实际运行的程序是在远程机器上执行的。

顺便说一下, SSH 不仅仅是将数据发送/接收到远程机器,还加密数据等等。


谢谢@Tux。如果可能的话,你能给我一个在循环内部重定向多个IP的例子吗?循环是否有影响?因为我在重定向多个IP地址时遇到了问题,并且输出被追加到日志文件中,所以我想了解ssh的工作原理。 - munish

1
如果我只关注stderr重定向,以下可能是解决方案之一:
什么是最好的错误重定向方式?
如果我只专注于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不去任何地方)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接