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