キーボードを介してforループを続ける

キーボードを介してforループを続ける

Linuxシステムにユーザーアカウントがありますが、正確なIPアドレスがわかりません。しかし、私はそのうちの1つで実行されている範囲を知っています。私が望むサーバーがどのサーバーであるかを確認したい。一部のMicrosoftサーバー、一部のLinuxサーバー、一部のサーバーもダウンしています。

各サーバーを確認するシェルスクリプトがあります。

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh 192.168.1.$i -l user_name
done

このコードはすべてのIPで動作します。 ssh を実行するとパスワードの入力を求められ、ssh が実行されていない場合は次の IP を試行し、サーバーがダウンしてから長い時間待ちます。また、サーバーに ssh があり、パスワードの入力を求められた場合、そのサーバーはキーボードから抜け出すことができません。

プログラムを終了せずにキーボードから両方のタイプを脱出し、次のIPに移動するにはどうすればよいですか?

たとえば、CTRL+Cプログラムを終了します。

答え1

Ctrl-C対話型シェルフォアグラウンド操作のすべてのプロセスにSIGINT信号を送信します。その後、sh実行中のスクリプトとssh

以下を追加して、シェルを終了しないようにすることができます。

trap : INT

スクリプトの始めに。

ConnectTimeoutオプションも使用できますssh

ssh -o ConnectTimeout=2 ...

接続しようとしているすべてのコンピュータにパスワードが公開されることに注意してください。管理者を信頼しない場合、これは良い考えではありません。

答え2

長いタイムアウトの問題を解決するには、ping回数が少なく間隔が短い(通常のユーザーの場合は少なくとも0.2秒)マシンが利用可能かどうかをテストできます。

...
ping -c 2 -i 0.2 "192.168.1.$i"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name
fi
...

秘密鍵/公開鍵のみを使用してサーバーにログインしようとしている場合は、その認証を受け入れるとパスワードの入力を求めるとsshsshが失敗します。

答え3

ping -c 2 -i 0.2 "192.168.1.$i:"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name &
fi

このセクションでは、すべてのSSH接続がバックグラウンドで実行されるため、パスワードを待たずに続行するのに役立ちます。

コンピュータのパスワードを入力したいときはいつでも実行して入力できます。これにより、バックjobsグラウンドで実行されているすべてのプロセスが一覧表示されます。次に、コマンドを介して必要なSSH接続をフォアグラウンドに取得します。fg %<job_id>

この解決策は少しトリッキーか汚れているかもしれませんが、間違いなく効果的です。

答え4

ssh_configを試してみることができます(実際には、これはキーボードで探している正確なソリューションではありません)。サーバーに関する情報を学ぶのに役立つ2つのオプションがあります。

ssh_config:システム全体の設定は/etc/ssh/ssh_config(Debianと一部のLinuxディストリビューション)にあります。 - ユーザー固有の構成(例えば、//.ssh/config)を作成できます。

  • BatchMode=はいに設定すると、パスワードクエリは無効になります。このオプションは、スクリプトがパスワードを入力するのを防ぐのに役立ちます。

  • ConnectTimeout= SSHサーバーに接続しようとしたときに使用される秒数。これは、tcpタイムアウト値の代わりにコマンドラインオプションで指定された明示的な時間を使用します。

  • ConnectionAttempts=パケットが破棄されたと思われる場合。

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh -o BatchMode=yes -ConnectTimeout=20 192.168.1.$i -l user_name
done

関連情報