Назад | Перейти на главную страницу

Принудительная команда на authorized_keys ssh объединяет 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. Есть идеи, почему это смешивается? И что еще более важно, есть идеи, как этого избежать?

пс: Я должен упомянуть, что 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

Первый способ вызова команды не создает pty, а второй - может или не может. Попробуйте сказать sshd не создавать pty. В вашем файле authorized_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