
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 " を実行すると、"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 "" の実行中に、"1" を読み取ることができません: そのような変数はありません、と表示されます (ファイル "./ssh2.sh" の 11 行目)
この問題について助けていただけないでしょうか。よろしくお願いします
答え1
ip
非推奨の の代わりにを使用しifconfig
、awk で実行できるすべての余分な grep と cut をスキップしてはいかがでしょうか。
次のようなコマンドは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
4 つのプログラムではなく 2 つのプログラムのみを使用しているため、 のみを使用する私のソリューションの方が適していると思います。
ssh -t $user@$remote_host '/sbin/ifconfig eth0 | grep "inet addr:"| grep -v "127.0.0.1" | cut -d: -f2 | awk "{ print $1}"'