【问题标题】:Pipe stdout and stderr through ssh通过 ssh 管道 stdout 和 stderr
【发布时间】:2018-10-11 14:14:25
【问题描述】:

考虑以下示例:

{ echo 1 | tee /dev/stderr 2> >(sed -e 's|1|err|' >&2) 1> >(sed -e 's|1|out|') ; }

打印出来的

out
err

请注意,out 打印在 stdout 上,err 打印在 stderr 上。

问题:如何通过ssh 远程执行此操作? 更准确地说,如何运行

ssh host 'echo 1 | tee /dev/stderr SOME_MAGIC_HERE'

圣。再次out/err 弹出stdout/stderr(对于适当的bash 魔术SOME_MAGIC_HERE)。

显然,以下工作:

ssh host 'echo 1 | tee /dev/stderr' 2> >(sed -e 's|1|err|' >&2) 1> >(sed -e 's|1|out|')

但这会在本地执行 sed,我宁愿在 host 上远程执行。

【问题讨论】:

  • 你想要什么。您是否希望将server:/dev/stderr 打印到host:/dev/stderr
  • 没错。在ssh host ... 之后,我想要两条消息,每条/dev/std{err,out} 一条。
  • 请注意,即使在当前命令中,所有内容都打印在/dev/stdout 上。您可以通过在其后面添加2>/dev/null 来测试它。
  • 对我来说不是这样。我正在使用GNU bash, version 4.4.23(1)-release 测试2>/dev/null
  • 键入以下内容:{ echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|") ; } >/dev/null{ echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|") ; } 2>/dev/null。问题是由于重定向,您需要在{... ; } 之间放置东西。

标签: bash ssh pipe


【解决方案1】:

更新后:

ssh host 'echo 1 | tee >(cat - | sed -e "s|1|err|" >&2) | sed -e "s|1|out|"'
out
err

这个想法是使用 | 处理 /dev/stdout 并结合使用进程替换与 tee 来创建 /dev/stderr 部分。

现在它按预期工作了:

$ ssh host 'echo 1 | tee >(cat - | sed -e "s|1|err|" >&2) | sed -e "s|1|out|"' > /dev/null
err
$ ssh host 'echo 1 | tee >(cat - | sed -e "s|1|err|" >&2) | sed -e "s|1|out|"' 2> /dev/null
out

原答案:

通过将您的 更改为 来执行以下命令:

ssh host 'echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|")'

但这包含/dev/stdout 中的所有内容。示例:

$ ssh host 'echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|")' > /dev/null
$ ssh host 'echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|")' 2> /dev/null
out
err

这正是您的原始命令在主机系统上所做的:

{ echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|") ; } >/dev/null
{ echo 1 | tee /dev/stderr 2> >(sed -e "s|1|err|") 1> >(sed -e "s|1|out|") ; } 2>/dev/null
out
err

ssh 程序通常会正确处理/dev/stdout/dev/stderr/dev/stdin 的传递:

$ ssh host "echo 1; echo 2 > /dev/stderr" > /dev/null
2
$ ssh host "echo 1; echo 2 > /dev/stderr" 2> /dev/null
1

【讨论】:

  • 这一切都很好而且正确。但是你如何通过不同的seds“管道”echo 1 | tee /dev/stderr,同时保留标准输出/标准错误?
  • 问题已更新,因为很遗憾,我无法根据您的回答为我原来的ssh 问题提供解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多