我一直在努力在集中式服务器中编写一个脚本来执行某些操作并输出 .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
答案1
第一种调用命令的方式不会创建 pty,而第二种方式可能会创建,也可能不会。尝试告诉 sshd 不要创建 pty。在您的 authorized_keys 文件中:
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