我正在尝试在本地计算机上执行命令并通过 ssh 将 stderr 定向到远程计算机。我不能做
ssh remote machine "command 2>stderr.log"
因为远程计算机没有正确构建来执行该命令,而我必须在本地计算机上运行该命令。我还没有尝试过,但我基本上肯定我们做不到2>ssh local machine /dir/stderr.log
?
答案1
据我了解,你想运行一个命令本地但将 stderr 输出保存到远程日志文件。
尝试流程替代:
local_command 2> >(ssh somemachine 'cat >logfile')
这>(...)
是流程替代。它根据括号中的命令创建一个类似文件的对象。因此,2>
将 stderr 重定向到该类似文件的对象,从而将输出保存在远程计算机上。
或者,只需使用普通的旧重定向:
{ local_command 2>&1 1>&3 | ssh somemachine 'cat >logfile'; } 3>&1
在这里,stderr 被重定向到 stdout,以便我们可以将其通过管道传输到 ssh。为了使 stdout 不会转到 ssh,我们将其重定向到文件句柄 3。在命令结束时,文件句柄 3 被重定向到 stdout,以便它出现在终端上。
答案2
如果您不关心在进程运行时跟踪进程的 stderr,那么您可以使用临时本地文件,例如
#!/bin/bash
tmpfile=`mktemp`
trap '/bin/rm -f $tmpfile ; exit' 0 1 2 3 15
run_command 2> $tmpfile
if [ -s $tmpfile ]
then
scp $tmpfile remoteserver:logfile
fi
exit 0
如果你想要“实时”数据,那么你就会遇到缓冲问题;通过 ssh 发送 stderr 可能不是行缓冲的,因此整个概念可能不是最好的方法。