스크립트에 입력한 목록에서 원격 호스트에 설치된 호스트 이름, IP 및 총 메모리를 수집하는 스크립트를 작성하려고 합니다. 이 스크립트는 Redhat 및 Solaris 컴퓨터에서 정보를 수집합니다. 내 스크립트는 다음과 같습니다.
#!/bin/bash
echo > ip_info.output
echo -e "\n"
for host in `cat ip_adds`
do
echo "Hostname:" $host
sudo ssh -o BatchMode=yes -o ConnectTimeout=5 $host "echo IP Address:; ip route get 1 | awk '{print $NF;exit}'; free -m | grep Mem | awk '{print $1,$2}'"
echo -e "\n"
done
스크립트를 실행하면 다음 오류가 발생합니다.
awk: {print ,}
awk: ^ syntax error
awk: {print ,}
awk: ^ syntax error
awk: cmd. line:1: {print ,}
awk: cmd. line:1: ^ unexpected newline or end of string
문제가 있는 것 같은데 free -m | grep Mem | awk '{print $1,$2}
해결 방법을 모르겠습니다. 쉘에 직접 들어가도 free -m | grep Mem | awk '{print $1,$2}
아무런 문제가 없습니다. 스크립트 내부에 있습니다.
답변1
이는 필요한 것보다 더 복잡합니다. 게다가 왜 ssh
달리고 있는 걸까요 sudo
? 원격으로 루트로 로그인해야 하는 경우 그렇게 할 수 있습니다( ). 그러나 SSH 키가 모두 루트에 속하지 않는 한 ssh root@$host
ssh를 실행할 필요는 거의 없습니다 . sudo
이것은 매우 나쁜 생각입니다.
또한 내 Arch 시스템에서는 IP를 얻기 위해 사용하는 명령이 내 사용자의 UID를 반환하는 것으로 보입니다.
$ ip route get 1
1.0.0.0 via 192.168.1.1 dev enp0s31f6 src 192.168.1.111 uid 1000
cache
$ ip route get 1 | awk '{print $NF;exit}';
1000
테스트한 Ubuntu에서는 예상대로 작동합니다.
$ ip route get 1
1.0.0.0 via 123.456.7.8 dev eth0 src 123.456.7.9
$ ip route get 1 | awk '{print $NF;exit}';
123.456.7.9
따라서 나중에 필드를 인쇄하는 것이 더 이식 가능한 버전일 수 있습니다 src
.
$ ip route get 1 | sed -nE 's/.* src ([0-9.]+).*/\1/p'
192.168.1.111
당신이 보는 오류는 실제로 인용으로 인한 것입니다. 을 실행 중이므로 ssh $host "command"
큰따옴표로 묶으 면 command
쉘이 명령 내에서 발견된 모든 변수(예: awk $2
등)를 확장하게 됩니다. 이를 방지하고 확장되지 않은 기호를 awk에 전달하려면 이스케이프해야 합니다 $
.
더 간단한 스크립트 버전:
#!/bin/bash
sshOpts="BatchMode=yes -o ConnectTimeout=5"
echo > ip_info.output
echo ""
while read host; do
printf "Hostname:%s" $host
ssh -o $sshOpts $host "printf 'Hostname: %s\nIP: %s\nMem: %s\n' $host "$(ip route get 1 | sed -nE 's/.* src ([0-9.]+).*/\1/p')" "$(free -m | awk '/Mem/{print $2}')""
done < ip_adds
답변2
나는 이 질문에 대한 답을 찾았습니다. 이는 탈출과 관련이 있으므로 다음과 같이 $1과 $2 앞에 \를 추가했습니다.
free -m | grep Mem | awk '{print \$1,\$2}
답변3
이것이 최종 스크립트의 모습입니다. 나는 그것이 여러분 중 일부에게 유용할 것이라는 것을 알고 있습니다.
#!/bin/bash
for host in `cat ip_adds2`
do
echo "Hostname:" $host
sudo ssh -t -o BatchMode=yes -o ConnectTimeout=5 $host 'echo IP: `hostname -i`;read junk total used free shared buffers cached junk < <(free -g | grep ^Mem);echo Memory: $total GiB'
echo -e "\n"
done