ホームネットワークにRaspberry Piが接続されているため、再起動するたびにIPアドレスが変更されます。毎回ssh user@ipaddressを呼び出す代わりに、bashスクリプトを実行してどのアドレスが有効であるかを知りたいです。
ssh user@ipaddress
IPアドレスの最後の数字を変更するために何度も実行してみました。 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を設定してください。役に立つ他のオプションは次のとおりです。
ネットワークのアクティブIPリストを取得する
nmap -sP 192.168.0.*
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ディストリビューションにパッケージされています。
答え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
可能