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을 보내는 것은 라인 버퍼링되지 않을 수 있으므로 전체 개념이 최선의 접근 방식이 아닐 수 있습니다.

관련 정보