通过 ssh 使用 bash 脚本获取远程 Linux 服务器 IP 地址

通过 ssh 使用 bash 脚本获取远程 Linux 服务器 IP 地址

我需要通过 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}"'

相关内容