Трубный стандартный вывод и стандартный вывод через SSH - PullRequest
0 голосов
/ 11 октября 2018

Рассмотрим следующий пример:

{ 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 (для соответствующей магии удара 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.

1 Ответ

0 голосов
/ 11 октября 2018

после обновления:

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

Идея состоит в том, чтобы использовать | для обработки /dev/stdout и использовать подстановку процесса в комбинации с tee для создания/dev/stderr part.

Теперь все работает как положено:

$ 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
...