여러 파일을 테일링하고 해당 출력을 SSH 연결로 파이프하는 방법

여러 파일을 테일링하고 해당 출력을 SSH 연결로 파이프하는 방법

우리는 현재 우리가 거의 통제할 수 없는 Linux 상자에서 명령을 실행하고 있습니다. 이 명령은 로그 파일을 추적하고 결과를 서버의 아웃바운드 SSH 연결로 파이프한 다음 출력을 파일로 리디렉션합니다.

이를 위해 사용하는 명령은 다음과 같습니다.

sh -c tail -f /var/log/x/a.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

그런 다음 캡처된 로그 세그먼트에 대해 추가 처리를 수행할 수 있습니다.

그러나 이제 다음을 사용하여 첨부된 로그 파일의 스트리밍 출력을 전달할 수 있어야 합니다.같은SSH 연결.

행위

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

작동하지만 두 개의 로그 파일을 하나로 병합합니다(각 줄 앞에는 해당 파일의 출처를 나타내는 헤더가 옵니다).

두 개의 서로 다른 파일을 출력해야 하지만 로그 서버에서 서버로의 단일 아웃바운드 SSH 연결에만 해당됩니다. 로그 서버에 대한 sudo 또는 관리자 권한이 없으며 로그 서버를 설치하는 데 필요한 소프트웨어를 얻을 수 없습니다. 중요한 경우 원격 로그 서버는 CentOS를 실행하고 있고 우리 서버는 Ubuntu를 실행하고 있습니다.

출력을 두 개의 파일로 분할하는 방법이 있습니까? 아니면 역방향 SSH 연결을 통해 여러 명령을 병렬로 실행하는 다른 방법이 있습니까?

답변1

little.control.serverPerl이 설치되어 있으면 parallel --embed개발 컴퓨터에서 실행하여 GNU Parallel을 사용할 수 있습니다.

parallel --lb --tag tail -f ::: /var/log/x/a.log /var/log/x/b.log |
       ssh [email protected] -T perl -e \''
        $|=1; # if you need less buffering
        open(A, ">", "a.log");open(B, ">", "b.log");
        while(<>) {
           if(s:/var/log/x/a.log\t::) { print A } 
           if(s:/var/log/x/b.log\t::) { print B }
        }'\'

또한 ssh -M단일 SSH 채널에서 여러 SSH를 멀티플렉싱하는 것을 고려하십시오.

답변2

나만의 솔루션:

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

필요한 모든 로그 정보를 사용자가 제어하는 ​​(Ubuntu) 서버인 로그 서버로 보냅니다. (파일에 쓰세요.통나무실제로는 다음과 같은 파일을 작성하기 때문에 약간 혼란스러워 보입니다.a-and-b.log.

따라서 가능한 해결책 중 하나는 생성된 단일 결과를 읽는 스크립트를 작성하는 것입니다.a-and-b.log파일과 해당 헤더 라인을 작성하고 두 개의 별도 로그를 작성합니다(헤더 라인은 없으며 각 로그 라인이 어떤 파일에 속하는지 확인하는 데 사용합니다). 로그 서버에서 이 스크립트를 실행하면 준비가 완료됩니다.

이것이 받아들일 수 있는 대답인가? SSH에서는 "스마트"한 작업을 수행하지 않습니다. 그럴 필요가 없는 것 같습니다. tail은 두 로그를 모두 살펴보고 헤더를 사용하여 단일 SSH 연결을 통해 로그 서버에 모든 로그 항목을 보냈습니다. 어느 로그인가요? 에서. 내 생각에는 로그 서버에서 두 개의 파일로 분할하면 될 것 같습니다.

관련 정보