SSHを使用してループでbashを実行する

SSHを使用してループでbashを実行する

ホームネットワークにRaspberry Piが接続されているため、再起動するたびにIPアドレスが変更されます。毎回ssh user@ipaddressを呼び出す代わりに、bashスクリプトを実行してどのアドレスが有効であるかを知りたいです。

ssh user@ipaddressIPアドレスの最後の数字を変更するために何度も実行してみました。 Bashがどのように機能するのかわからないので、.sh次のようにファイルを作成してみました。

for i in {1..100}
do
  call=`ssh [email protected].$i`
  if [['$call'==*'user'*]]; then
    echo "$i"
  else
    :
  fi
done

私の質問は次のとおりです

  • 私は何も印刷しません
  • 最初の呼び出しで停止して繰り返されません。

だから、他のデバイスのときにコマンドを渡すbash機能があるかどうか疑問に思います。私のユーザー名がわかっているので、コマンド出力の最初の行で自分のユーザー名を見つけます。 'もう待つ必要はありません。出力。

ベストアンサー1

これを行う正しい方法は、Piが固定IPを持つように設定して再起動時に変更されないようにするか、ホスト名を解決するためにローカルDNSサーバーを設定することです。固定IPを設定するのが最も簡単です。何十ものチュートリアルを見つけるには、「raspbian static IP」を検索してください。これは:https://thepihut.com/blogs/raspberry-pi-tutorials/how-to-give-your-raspberry-pi-a-static-ip-address-update

これで、いくつかの理由でスクリプトは実行されません。まず、これは決して機能しません。

call=`ssh [email protected].$i`

機械が入らないかアクセスできない場合は、エラーを印刷しますが、エラーは標準出力ではなく標準エラーで印刷されるため、空になり$callます。動作してシステムにSSHで接続すると、ログインして$call何も返されないため、空になります。

とにかく、あなたのifものは文法的なエラーです。これ:

if [['$call'==*'user'*]]; then

次のようにする必要があります。

if [[ "$call" == *user* ]]; then

[[]]変数を一重引用符()で囲んだ場合、'$call'変数が拡張されない前と前にスペースが必要です。

$ echo '$call'
$call

おそらくあなたが望むのは、ログインを試み、コマンドを実行し、実行されている場合はIPを保存することです。このような:

#!/bin/bash
for i in {1..100}
  do
    ## try to run a command and, if it works, we know the ip.
    ## you can use the command 'true' for this
    if ssh [email protected].$i true; then
      echo "The IP is 192.168.0.1.$i"
      break
    fi
done

しかし、これは本当に非効率的で遅いです。これをしないでください。固定IPを設定してください。役に立つ他のオプションは次のとおりです。

  1. ネットワークのアクティブIPリストを取得する

     nmap -sP 192.168.0.*
    
  2. ping代わりにsshどのマシンが稼働しているかを確認するには、次のようにします。

     for i in {1..100}
     do
         if ping -c1 192.168.0.$i 2>/dev/null; then
           echo "The first IP that is UP is 192.168.0.1.$i"
           break
         fi
     done
    

ただし、実際に静的IPを設定するのに役立つ場合は、問題に関する新しい質問を投稿してください。これはあなたの問題に対する良い解決策ではありません。

おすすめ記事