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 " を実行すると、"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 cfrancyHello root予想通りのものとはなりません。リモートシステムへのコマンドを二重引用符で囲んでいるため"、すべての変数が評価されます。前にコマンドが送信されます。コマンドはリモート サイトで評価されるため、cfrancy@ws:~$ ssh root@srv01 echo 'Hello $USER'返されます。もちろん、複合コマンド内の他の引用符を入れ替えたりエスケープしたりして、正しく動作させる必要もあります。Hello root$USER

ipとにかく、引用符の動作を念頭に置いておくと、コマンドはおそらく必要なことを実行するでしょう。ただし、awk4 つのプログラムではなく 2 つのプログラムのみを使用しているため、 のみを使用する私のソリューションの方が適していると思います。

ssh -t $user@$remote_host '/sbin/ifconfig eth0 | grep "inet addr:"| grep -v "127.0.0.1" | cut -d: -f2 | awk "{ print $1}"'

関連情報