2

如果我执行say,我不清楚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 循环

如果我使用一些期望脚本而不是 ssh 怎么办

expectscript.exp user@remotemachine_ip "some command"

4

4 回答 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

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

于 2013-03-02T09:10:37.053 回答
3

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

在本地机器上,如果你运行一个登录 shell(比如其中一个 Ctrl + Alt + F1~6),它会为用户启动一个新的 shell,并且输出(stdoutstderr)会直接出现在你的监视器上。

现在让我们看一下您的 SSH 案例,步骤与上次相似,只有一个区别,服务器不是将输出(再次stdoutstderr)发送到监视器,而是将数据发送回您登录的机器 -到SSH client. 客户端在您的本地机器上运行,因此只在本地机器的监视器上显示相同的输出。

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

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

于 2013-03-02T08:11:59.827 回答
1

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

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

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

ssh 看起来支持远程标准输出到本地标准输出和远程标准错误到本地标准错误,这样上面的脚本就可以按我的预期运行。

于 2017-09-08T04:41:54.513 回答
0

如果你把

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

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

于 2018-02-11T21:50:47.473 回答