
SSH를 통해 bash 스크립트를 사용하여 원격 Linux 서버 eth1 IP 주소를 얻어야 하며 다음 명령이 있습니다. /sbin/ifconfig eth1 | grep 'inet 주소:'| grep -v '127.0.0.1' | 컷 -d: -f2 | awk '{ $1 인쇄}'
하지만 내가 실행할 때 :
generate ssh -t $user@$remote_host "/sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $2}' ; echo $ip " "1"을 읽을 수 없다고 합니다. "spawn ssh -t $user@$remote_host "ip= /sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'
; 실행 중에는 해당 변수가 없습니다. echo $ip "" (파일 "./ssh2.sh" 라인 11)
이 문제를 해결하도록 도와주세요. 감사해요
답변1
더 이상 사용되지 않는 ip
대신 사용 ifconfig
하고 awk가 그렇게 할 수 있으므로 모든 추가 grep 및 잘라내기를 건너뛰는 것이 좋습니다.
그래서 다음과 같은 명령은ip addr show dev eth0 | awk '/^ +inet / {split($2,a,"/"); print a[1]}'
어쨌든, 예제 명령에서 발생하는 대부분의 문제는 선택한 따옴표 유형 및 bash가 이를 평가하는 방법과 관련이 있습니다.
다음 과 같은 작업을 수행하면 예상한 것과는 다른 cfrancy@ws:~$ ssh root@srv01 echo "Hello $USER"
출력이 표시됩니다 . 원격 시스템에 대한 명령 주위에 큰따옴표를 사용했기 때문에 모든 변수가 평가됩니다.Hello cfrancy
Hello root
"
~ 전에명령이 전송됩니다. 원격 사이트에서 평가되었으므로 명령 이 cfrancy@ws:~$ ssh root@srv01 echo 'Hello $USER'
반환됩니다 . 물론 일이 제대로 작동하려면 복합 명령 내에서 다른 따옴표를 전환하거나 이스케이프 처리해야 합니다.Hello root
$USER
어쨌든, 인용 동작을 염두에 두면 명령이 원하는 대로 작동할 것입니다. 하지만 나는 4개 대신 2개의 프로그램만 사용하기 때문에 ip
, 및 만 사용하는 솔루션이 더 나은 선택이라고 생각합니다 .awk
ssh -t $user@$remote_host '/sbin/ifconfig eth0 | grep "inet addr:"| grep -v "127.0.0.1" | cut -d: -f2 | awk "{ print $1}"'