Я работал над сценарием на централизованном сервере, чтобы делать некоторые вещи и выводить файл .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