원격 호스트에서 로컬 스크립트를 실행하려고 할 때 원격 서버의 호스트 이름을 로컬 출력 파일로 가져올 수 없습니다.
예를 들어 아래 스크립트를 실행하고 있습니다.
ssh remotehost sh -s < sudo su - ; ./localscript --include Yes > output
위의 내용은 잘 작동합니다. 아래는 샘플 출력입니다.
script executed data from the remote machine
하지만 이와 같은 호스트 이름 + 데이터가 필요합니다.
remotehost: script executed data from the remote machine
awk를 사용해 보았지만 실패했기 때문에 누군가 이것을 확인하고 도움을 줄 수 있습니까?
ssh remotehost sh -s < sudo su - ; ./localscript --include Yes | awk -vhostname=$(hostname) '{print hostname, $0}' > output
이것은 나에게 localhost 호스트 이름을 제공합니다. 내가 틀렸다면 정정해주세요.
또한 설명이 정확하지 않은 경우 댓글을 남겨주시면 수정 및 수정하도록 하겠습니다.
나는 이것을 시도해 보았지만 "grep"/"awk" 출력을 할 수 없습니다
ssh remotehost sh -s < `./localscript --include Yes`
ssh remotehost sh -s < `./localscript --include Yes | awk -vhostname=$(hostname) '{print hostname, $0}' > output`
답변1
출력을 "output"이라는 파일에 저장하려는 경우현지의주인:
scp -p ./localscript remotehost:
ssh -q remotehost <<'EOF' > output
./localscript --include Yes |
awk -vhostname=$(hostname) '{print hostname, $0}'
EOF
ssh 옵션은 -q
"stdin이 터미널이 아니기 때문에 의사 터미널이 할당되지 않습니다"라는 경고 메시지를 억제하는 데 사용됩니다. - 표준 입력이 heredoc에서 리디렉션되기 때문에 이는 필요합니다.
이것은 "Here Document" 또는 "heredoc"이라는 것을 사용합니다 ssh
. 이 단어 EOF
는 임의의 단어일 뿐이며 그 자체로는 특별한 의미가 없습니다. 그러나 "End of File"을 의미하므로 heredocs에서 자주 사용됩니다(" EOT
End of File"로도 사용됨). 텍스트" "). 리디렉션하려는 텍스트에서 자체 줄에 있지 않은 단어를 사용할 수 있습니다.
단어(EOF) 뒤의 다음 줄부터 다음 단어 발생(한 줄 자체)까지의 모든 내용은 명령에 대한 입력으로 간주되어 ssh
원격 호스트에서 실행됩니다.
단어 주위의 따옴표는 EOF
작은따옴표로 묶인 문자열 내에서 전체 구분 문서를 효과적으로 만듭니다. 출처 man bash
("여기 문서" 검색):
여기에 파일
이러한 유형의 리디렉션은 구분 기호만 포함된 줄(후행 공백 없음)이 나타날 때까지 현재 소스에서 입력을 읽도록 셸에 지시합니다. 이 지점까지 읽은 모든 행은 명령의 표준 입력(또는 n이 지정된 경우 파일 설명자 n)으로 사용됩니다.
이 문서의 형식은 다음과 같습니다.
[n]<<[-]word here-document delimiter
매개변수 및 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어에 대해 수행되지 않습니다.
단어의 일부가 인용된 경우 구분 기호는 단어에서 인용문을 제거한 결과이며 문서의 줄은 여기에서 확장되지 않습니다.
단어가 인용되지 않은 경우 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 거치며 문자 시퀀스 <newline은 무시되고 $ 및 ` 문자는 \를 사용하여 인용되어야 합니다.
출력을 이름이 지정된 파일에 저장하려는 경우외딴주인:
scp -p ./localscript remotehost:
ssh -q remotehost <<'EOF'
./localscript --include Yes |
awk -vhostname=$(hostname) '{print hostname, $0}' > output
EOF
> output
두 버전 모두에서 리디렉션 위치를 확인하세요 . <<'EOF'
첫 번째 버전은 바로 뒤이고 awk
두 번째 버전은 바로 뒤입니다.
그러나 실제로 하려는 작업은 기존 도구의 매우 기본적인 버전을 재창조하는 것 같습니다.병렬 분산 셸(pdsh).
나는 pdsh
그것을 재발명하기보다는 이 프로그램(또는 여러 유사한 프로그램 중 하나)을 사용하는 것을 적극 권장합니다. 대부분의 배포판(확실히 데비안, 우분투 등)에서 작동합니다.
예를 들어, 내 홈 네트워크에는 4개의 컴퓨터(ganesh, indra, kali 및 hex - 마지막 컴퓨터의 명명 체계가 지겨워서 힌두교 신 대신 Discworld를 선택했습니다)가 있습니다. 이러한 호스트가 "all" 그룹에 속해 있음을 알 수 있도록 pdsh를 구성했으므로 다음을 실행할 수 있습니다.
$ pdsh -g all 'uptime; uname -a'
hex: 18:35:00 up 45 days, 21:07, 1 user, load average: 0.33, 0.41, 0.43
hex: Linux hex 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
kali: 18:35:00 up 20:40, 2 users, load average: 1.46, 0.92, 0.68
kali: Linux kali 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
ganesh: 18:35:00 up 45 days, 21:23, 22 users, load average: 1.34, 1.67, 1.85
ganesh: Linux ganesh 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
indra: 18:35:00 up 5 days, 19:51, 2 users, load average: 0.00, 0.03, 0.02
indra: Linux indra 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
awk
해당 명령으로 수행하려는 작업 은 이미 수행되었습니다 . 원격 시스템의 호스트 이름 접두사를 출력에 추가합니다.
또한 참고: 출력 순서가 이와 같이 잘 그룹화된다는 보장은 없습니다. pdsh
여러 SSH 연결을 병렬로 실행하면 원격 컴퓨터가 응답하는 데 자체 시간이 걸립니다. 물론 출력을 sort -k1,1
.
pdsh
pdcp
원격 호스트에 파일을 복사하기 위한 유틸리티가 포함되어 있습니다 . 예를 들어 ./localscript
모든 컴퓨터에 복사하여 실행 하려면 다음을 실행합니다.
pdcp -p -g all ./localscript '~/'
pdsh -g all ./localscript
그건 그렇고, 출력을 다시 포맷하고 원래 호스트별로 그룹화할 수 pdsh
있는 유용한 유틸리티도 함께 제공됩니다 .dshbak
$ pdsh -g all 'uptime; uname -a' | dshbak
----------------
kali
----------------
18:35:12 up 20:41, 2 users, load average: 1.51, 0.96, 0.70
Linux kali 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
----------------
indra
----------------
18:35:12 up 5 days, 19:51, 2 users, load average: 0.00, 0.03, 0.02
Linux indra 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
----------------
ganesh
----------------
18:35:12 up 45 days, 21:23, 22 users, load average: 1.52, 1.70, 1.86
Linux ganesh 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
----------------
hex
----------------
18:35:12 up 45 days, 21:07, 1 user, load average: 0.26, 0.39, 0.42
Linux hex 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux