通过 ssh 将 stderr 定向到文件

通过 ssh 将 stderr 定向到文件

我正在尝试在本地计算机上执行命令并通过 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 可能不是行缓冲的,因此整个概念可能不是最好的方法。

相关内容