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を設定するのに役立つ場合は、問題に関する新しい質問を投稿してください。これはあなたの問題に対する良い解決策ではありません。

答え2

(avahi)を使ってmDNS IPアドレスを検索してください。リモートは少なくともサーバーを実行して構成し、ローカルは少なくともクライアントでなければなりません。これは分散(非標準)ローカルDNSです。ルータの DHCP に静的 IP アドレスを割り当てさせることもできます。

答え3

高速接続には、masscanアクティブホストのポートスキャンを使用してくださいssh

sudo masscan 192.168.0.1/24 --ports 22 --rate 100000 > alive
awk '{print $6}' alive > file
while read -r line; do  ssh user@"$line"; done < file

より良い方法は、提案された行に従うことです。@テデン:

ssh user@$(sudo masscan 192.168.0.1/24 --ports 22 --rate 100000 | awk '{print $6}')

masscan一部のLinuxディストリビューションにパッケージされています。

githubのMascan

答え4

「This is the Pi of iam_agf」を返す Pi に Web サーバーを設定します。あるいは、「192.168.0.15 iam_agf」などのIPを返す動的ページでもよい。これは、このデバイスがプリンタやコーヒーマシンではなく、お使いのデバイスであることを確認するためのものです。

nmapを使用してWebサーバーを実行しているIPを確認し、そのIPにキーワードとIPが含まれていることを確認できます。

IPを取得したら、それを/ etc / hostsファイルに入れて、名前で簡単にpiにアクセスできます。

nmapなしで動作していることを簡単に確認すると、時間がかかることがあります。

for i in $(seq 1 254); do
    curl "http://192.168.0.${i}" | grep iam_igf
done

nmapには、固定ユーザー名とパスワードの組み合わせでこれを試すことができるssh-bruteというプラグインがあります。https://nmap.org/nsedoc/scripts/ssh-brute.html

そして最初に何を探しているかもしれません:

#this will open an ssh connection and wait for you to type stuff:
ssh user@IP

#this will run a command after the connection is open, then close it
ssh user@IP command

# example
ssh user@IP echo ok

# or just use the true command to avoid output
ssh user@IP true

# so this loop might do what you need, (untested, make backups of /etc/hosts first!)
for i in $(seq 1 254); do
    if ssh "[email protected].${i}" true;
    then
        sed -i "/[0-9.]* mypi/d" /etc/hosts
        echo "192.168.0.${i} mypi" >> /etc/hosts
        break
    fi
done

可能

関連情報