Ssh

在 ssh 的 authorized_keys 上強制命令合併 STDOUT 和 STDERR

  • April 18, 2012

我一直在努力在集中式伺服器中有一個腳本來做一些事情並輸出一個 .tar.gz 文件(請參閱將 STDOUT 臨時重定向到另一個文件描述符,但仍然到 screen)。我還交換了 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

如果我查看該文件,它同時包含STDERRSTDOUT。知道為什麼它會混合嗎?更重要的是,關於如何避免這種情況的任何想法?

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

呼叫命令的第一種方式不會創建 pty,而第二種方式可能會也可能不會。嘗試告訴 sshd 不要創建 pty。在您的授權密鑰文件中:

command="/usr/local/bin/myscript.sh",from="client",no-pty ssh-rsa...

no-pty如果您想在文件中設置選項時從命令行 ssh,則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

引用自:https://serverfault.com/questions/379898