우리는 현재 우리가 거의 통제할 수 없는 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.server
Perl이 설치되어 있으면 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 연결을 통해 로그 서버에 모든 로그 항목을 보냈습니다. 어느 로그인가요? 에서. 내 생각에는 로그 서버에서 두 개의 파일로 분할하면 될 것 같습니다.