我需要通过ssh使用bash脚本获取我的远程Linux服务器eth1的IP地址,我有以下命令:/ sbin / ifconfig eth1 | grep'inet addr:'| grep -v'127.0.0.1'| 切-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“时没有这样的variablesip = /sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' /sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' /sbin/ifconfig eth1 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' ; echo $ ip“”(文件“./ssh2.sh”第11行)
所以请帮助我解决这个问题。 谢谢
为什么不使用ip而不是弃用的ifconfig ,并跳过所有额外的greps和剪切,因为awk可以做到这一点。
所以像ip addr show dev eth0 | awk '/^ +inet / {split($2,a,"/"); print a[1]}'这样的命令ip addr show dev eth0 | awk '/^ +inet / {split($2,a,"/"); print a[1]}' ip addr show dev eth0 | awk '/^ +inet / {split($2,a,"/"); print a[1]}'
在任何情况下,你的示例命令中的大部分问题都与你select的引号types有关,以及bash如何评估它们。
如果你像cfrancy@ws:~$ ssh root@srv01 echo "Hello $USER"那样做cfrancy@ws:~$ ssh root@srv01 echo "Hello $USER"那么你将看到的输出是Hello cfrancy ,而不是你可能期望的Hello root 。 因为你已经在远程系统的命令周围使用了双引号,所以在命令发送之前 ,所有的variables都被计算出来,命令cfrancy@ws:~$ ssh root@srv01 echo 'Hello $USER' $USER是在远程站点上进行评估的,当然你也需要在你的复合命令中切换或者跳过你的其他引用,这样才能正常工作。
无论如何,记住引用行为的命令可能会做你想做的。 虽然我认为我的解决scheme,只使用ip和awk是一个更好的select,因为我只使用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}"'