В
| cat
этом случае требуется, потому что иначе tar […] не будет говорить с stdout, заданным ssh (PTY).
Нет. Наличие PTY - это точно одна из ваших проблем. TTY слой существует для обработки управляющих символов терминала и не то, что вы хотите на все другие виды данных.
Обычно запуск ssh в пакетном режиме (т.е. ssh <host> <cmd>
) не выделяет серверную часть PTY; это обеспечит 8-битный чистый канал. Но когда вы не предоставляете команду на клиенте, вам нужно явно добавить опцию -T
или RequestTTY
client, чтобы отключить запрос TTY,
ssh -T theuser @ prod> dir.tgz ssh -o RequestTTY = no theuser @ prod> dir.tgz
или предоставьте фиктивную команду,
ssh theuser @ prod foo > dir.tgz
или запретите такие запросы с параметром no-pty
авторизованным ключом:
command = "tar -czf - / dir / 2> / dev / null", no-pty, ограничить ssh-rsa ABCDEF
( restrict
это недавно добавленный псевдоним, который отключает все переадресации сразу, включая те, которые могут быть добавлены в будущем. Он доступен с OpenSSH 7.2 . На самом деле, он даже включает no-pty
, хотя я перечислил его отдельно для этого ответа.)