
我需要透過 ssh 使用 bash 腳本來取得遠端 Linux 伺服器 eth1 IP 位址,並且我有以下命令: /sbin/ifconfig eth1 | grep 'inet 地址:'| grep -v '127.0.0.1' | grep -v '127.0.0.1' |剪-d:-f2 | awk '{印$1}'
但是當我跑步時:
spawn 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
,並跳過所有額外的 grep 和 cut,因為 awk 可以做到這一點。
所以像這樣的命令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
是在遠端站點上評估的。當然,您還需要在複合命令中切換或轉義其他引號,以便事情正常進行。
不管怎樣,記住命令的引用行為可能會做你想要的事情。雖然我認為我的解決方案只使用ip
, ,並且awk
是一個更好的選擇,因為我只使用 2 個程式而不是 4 個。
ssh -t $user@$remote_host '/sbin/ifconfig eth0 | grep "inet addr:"| grep -v "127.0.0.1" | cut -d: -f2 | awk "{ print $1}"'