linux - bash 重定向 stdout 和 stderr 以通过 ssh 分隔命令

标签 linux bash ssh stdout stderr

我正在使用 BASH 4。我正在尝试找到一种方法来合法地预先添加输出以指示它的输出类型。我可以用类似这样的东西来做到这一点......

ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
stderr: ls: cannot access /tmp/abcdefgh: No such file or directory

ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
stdout: drwxr-xr-x 3 root root 4096 2010-10-15 09:08 fsck
stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 kernel
stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 temp_keys
...

当我通过 SSH 登录并以交互方式运行它时,这似乎可以解决问题。但是,如果我尝试通过 ssh 将命令作为远程命令运行并将命令放在引号中,这并不总是正确的。我总能得到 stdout 行,但有时不能得到 stderr 行。

这将产生输出...

ssh root@server1 "ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

这甚至不会产生错误消息...

ssh root@server1 "ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

但是,这会将 wget 状态结果显示为 stderr 结果(应该如此)

ssh root@server1 "wget http://server2/package.rpm 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

最佳答案

我在我的电脑上尝试了以下操作,完全没有涉及 ssh:

$ ls asdfasdf 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
$ stderr: ls: cannot access asdfasdf: No such file or directory

第二行中的 $ 不是拼写错误。这些 sed 命令完全在后台运行。 ls 给出了它的错误消息,并且在 sed 有机会输出任何内容之前,有足够的时间让 shell 输出提示。我认为您的 ssh 的远端正在 sed 的输出到达之前关闭连接。

通过子 shell 和管道进行缓冲可能会更好,因为 cat 等待其输入关闭而不是等待前台进程完成:

ssh root@server1 "(ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')) | cat"

关于linux - bash 重定向 stdout 和 stderr 以通过 ssh 分隔命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980049/

相关文章:

mysql - 在shell脚本中加密密码

linux - 运行数十小时后远程集群出现奇怪的 "Stale file handle, errno=116"

linux - Linux 多播中队列/缓冲延迟的可能位置在哪里?

bash - 在主机名后的同一行上打印一行-操作文本脚本linux bash

linux - 从另一个文件中减去后打印一个选择列

macos - 如何 cd 到脚本回显的目录

linux - 如何从 shell/bash 脚本中更改 linux 上的桌面墙纸

linux - 使用 Linux shell 中的任何命令提取文本

linux - 首先在客户端本地评估 ssh 远程执行 block 中的指令。为什么?

linux - 无法连接到 22 (ssh) AWS 以外的任何端口