透過 ssh 使用 bash 腳本取得遠端 Linux 伺服器 IP 位址

透過 ssh 使用 bash 腳本取得遠端 Linux 伺服器 IP 位址

我需要透過 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}"'

相關內容