for 루프에서 SSH의 출력 가져오기

for 루프에서 SSH의 출력 가져오기

원격 서버의 어떤 프로세스가 가장 많은 스왑 공간을 사용하고 있는지 결과를 얻어야 합니다. 아래 명령어를 사용하고 있는데, 원격으로 로그인해서 실행하면 잘 되는데 ssh를 이용해서 원격으로 실행하면 출력이 안 나오네요. 스크립트에서 여러 서버에 이 작업을 수행할 것이기 때문에 SSH를 사용해야 합니다.

ssh someserver "for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file; done | sort -k 2 -n -r | head -1 | awk '{print $1}'"

또한 포털에 대한 이전 질문의 조언을 사용하여 전체 명령을 작은따옴표로, awk를 큰따옴표로 묶으려고 시도했지만 printf 문의 큰따옴표가 해석되었기 때문에 이것은 나에게 잘못된 것이었습니다. awk에 대한 외부 큰따옴표의 끝 .

답변1

문제는 인용이다.

echo대신 sshSSH 서버로 전송될 내용을 확인하려면 다음을 사용하세요 .

$ echo "for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file; done | sort -k 2 -n -r | head -1 | awk '{print $1}'"
for file in /proc/*/status; do awk '/VmSwap|Name/{printf    } END{print }' ; done | sort -k 2 -n -r | head -1 | awk '{print }'

쉘이 확장 $1되고 $2. $3대화형 셸에서는 빈 문자열일 가능성이 높습니다. may 로 바꾸는 $것으로 충분합니다 \$. 테스트하지 않았습니다.

일반적으로 나는 stdin에서 명령을 보내는 것을 선호합니다. 분명히 stdin이 필요한 경우에는 작동하지 않습니다. 또 다른 장점은 여러 줄로 형식을 지정할 수 있다는 것입니다.

cat << 'EOF' |
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file
done | sort -k 2 -n -r | head -1 | awk '{print $1}'
EOF
ssh someserver /bin/sh

관련 정보