Принудительная команда в 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