![通过 ssh 使用 bash 脚本获取远程 Linux 服务器 IP 地址](https://linux22.com/image/610009/%E9%80%9A%E8%BF%87%20ssh%20%E4%BD%BF%E7%94%A8%20bash%20%E8%84%9A%E6%9C%AC%E8%8E%B7%E5%8F%96%E8%BF%9C%E7%A8%8B%20Linux%20%E6%9C%8D%E5%8A%A1%E5%99%A8%20IP%20%E5%9C%B0%E5%9D%80.png)
我需要通过 ssh 使用 bash 脚本获取远程 Linux 服务器 eth1 的 IP 地址,我有以下命令:/sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $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}"'