Принудительная команда в ssh's authorised_keys объединяет STDOUT и STDERR

Я работал над созданием сценария на централизованном сервере для выполнения некоторых задач и вывода файла.tar.gz (см. Временное перенаправление STDOUT в другой файловый дескриптор, но все еще на экран). Я также обменялся ключами ssh, поэтому теперь с клиентского компьютера я могу выполнить сценарий на своем главном сервере и вывести результат в файл.tar.gz на клиенте, увидев все остальные выходные данные (STDERR) сценария:

me@client:~$ ssh auto@remoteserver /usr/local/bin/myscript.sh > content.tar.gz
// shows the output of the STDERR here...

me@client:~$ tar ztf content.tar.gz
content/file.txt
content/foobar.txt
...

Но если я заставлю выполнение этой команды поместить опцию команды в ~/.ssh/authorized_keys:

#/home/auto/.ssh/authorized_keys file
command="/usr/local/bin/myscript.sh",from="client" ssh-rsa 0UYmshd5FSDFf2fd...

и выполнить следующее, это не работает:

me@client:~$ ssh auto@remoteserver > content.tar.gz
// shows **NOTHING**

me@client:~$ tar ztf content.tar.gz
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

если я смотрю в файл, он содержит как STDERR и STDOUT, Любая идея, почему это смешивается? И что более важно, есть идеи, как этого избежать?

PS: я должен упомянуть, что myscript.sh является оберткой для основного сценария, которая в основном вызывает основной сценарий с набором фиксированных параметров:

#!/bin/sh
# myscript.sh: wrapper for mainscript.sh to use by the user auto with ssh-keys
/usr/local/bin/mainscript.sh foo bar

1 ответ

Решение

Первый способ, которым вы вызываете команду, не создает pty, а второй может или не может. Попробуйте сказать sshd не создавать pty. В вашем файле author_keys:
command="/usr/local/bin/myscript.sh",from="client",no-pty ssh-rsa...

Если вы хотите ssh из командной строки, когда no-pty опция установлена ​​в вашем authorized_keys файлы, которые вы должны перенаправить на STDIN для чтения /dev/null или вы получите сообщение об ошибке PTY allocation request failed on channel 0:

$ ssh auto@remoteserver < /dev/null > content.tar.gz

Если вместо этого вы делаете ssh Команда без управляющего терминала, нет STDIN и вы можете опустить < /dev/null часть. Так что в cron вы можете без проблем сделать следующее:

0 4 * * * ssh auto@remoteserver > content.tar.gz
Другие вопросы по тегам