【问题标题】:bash redirect stdout and stderr to separate commands over sshbash 重定向 stdout 和 stderr 以通过 ssh 分隔命令
【发布时间】:2010-10-21 14:47:59
【问题描述】:

我正在使用 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 将命令作为远程命令运行,并且命令用引号引起来,这并不总是正确的。我总是可以得到标准输出行,但有时不能得到标准错误行。

这将产生输出...

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: /')"

【问题讨论】:

  • 我无法重现这个(换句话说,它对我有用)。你的例子失败了吗?我的猜测是问题在于您的实际命令需要一些复杂的引用。
  • 奇怪的是,“ls -l /tmp/abcdefgh”是产生问题的真正命令......或者我应该说没有产生错误。事实上,每当我用一个不存在的文件传递 ls 时,它什么都没有给我。具体的 BASH 版本是 4.1.2。同样,如果我 ssh 进入并运行命令,没问题。如果我通过上述命令,它不会报告任何内容。到目前为止,其他命令看起来都很好。

标签: linux bash ssh stdout stderr


【解决方案1】:

我在我的电脑上尝试了以下操作,完全不涉及 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 的输出到达之前关闭连接。

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

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

【讨论】:

  • 有趣,我会尝试一下,今天晚些时候再发布结果。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2017-05-05
  • 1970-01-01
  • 2014-07-22
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多