
Мне нужно получить IP-адрес eth1 моего удаленного сервера Linux с помощью скрипта bash через ssh, и у меня есть следующая команда: /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}"'