我一直在努力在中央服务器上有一个脚本来做一些事情并输出一个.tar.gz文件(请参阅暂时将STDOUTredirect到另一个文件描述符,但仍然屏幕 )。 我也有交换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
你调用这个命令的第一种方法不会创build一个pty,而第二个可能不会。 试着告诉sshd不要创build一个pty。 在您的authorized_keys文件中:
command="/usr/local/bin/myscript.sh",from="client",no-pty ssh-rsa...
如果您希望在authorized_keys文件中设置no-pty选项时从命令行执行ssh,则必须redirectSTDIN以从/dev/null读取,否则PTY allocation request failed on channel 0会出现PTY allocation request failed on channel 0的错误:
$ ssh auto@remoteserver < /dev/null > content.tar.gz
如果你不使用控制terminal来执行ssh命令,那么没有STDIN可用,你可以省略< /dev/null部分。 所以在cron中,你可以做到以下没有问题:
0 4 * * * ssh auto@remoteserver > content.tar.gz