SSHを介してアクセスし、そのアドレスにアクセスできることを記録する必要があるIPアドレスのリストがあります。 Pingスクリプトを使用しますが、DNSがアドレスを再割り当てした可能性があります。私は私が届かない人には興味がありません。 SSHが正常に機能し、そのIPアドレスを記録する必要がある場合は、ボックスにログインしたくないため、パスワードやキーについて心配する必要はありません。 SSH経由で接続できることを確認したかったです。これまで私は以下を持っています:
touch logfile_$(date "+%Y%m%d%T")
IP_FILE="path/to/ip_address.txt"
LOGFILE="path/to/logfile_$(date "+%Y%m%d%T")"
if [[ ! -f ${IP_FILE} ]]; then
echo "Cannot find IP address!"
exit 1
fi
for IP_ADDRESS in `cat $IP_FILE` ; do
ssh $IP_ADDRESS >> $LOGFILE 2>&1
私はまだスクリプトに初めて触れているので、どんな助けでも役に立ちます。 LanceBaynesが投稿した「サーバーにSSHでアクセスできるかどうかを確認するには?」を見てみましたが、実際には必要ではありません。
このボックスには何もインストールできません。または良いスキャナーをダウンロードします。 NetcatやNmapと同様に、どちらも良い選択です。
答え1
方法 #1: ssh-keyscan
1つの方法は、コマンドを使用してssh-keyscan
sshデーモンが正しく実行されていることを確認することです。
IPアドレスとssh-keyscan <ip> | grep -v ...
各サーバーを繰り返すだけです。サーバーがある場合、ssh-keyscan ... | grep -v ...
このコマンドを実行して返される状態は0になり、他の値(1以上)はサーバーがないことを意味します。
はい
$ for IP_ADDRESS in `cat $IP_FILE` ; do
ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
[ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
done
ssh-keyscan $IP_ADDRESS 2>&1
何が起こっているのか、何を実行するのか、返された出力(両方とstderr
マージstdout
)を明確に理解できるように、より詳細に分析しましょう。その後、これらの出力はすべてにパイプされ、grep -v "^$"
出力を返す行(sshサーバーが実行されている場合)に対して0を返し、出力を返さない行("^$"
空白行)に対して1を返します。
上記のループメカニズム(forループ)は、ファイルにスペースなしで1つの文字列しか含まれておらず、各「文字列」が改行文字で終わるために機能します。デフォルトでは、空白はforループが渡された引数を解析する方法を指定するために使用される特殊な区切り文字です。この文字は変数によって定義され、$IFS
置き換えることができます。たとえば、改行文字()ですIFS='^M'
。
cat $IP_FILE
に置き換えることで効率を上げることができます$( < $IP_FILE )
。たとえば、
$ for IP_ADDRESS in $( < $IP_FILE ) ; do
ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
[ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
done
ファイルの行にスペースが含まれている場合は、上記の内容を上書きしてwhileループ、つまり()に設定または使用$IP_FILE
できます。$IFS
^M
while read -ra line ; do ... ; done < $IP_FILE
$ while read -ra IP_ADDRESS ; do
ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
[ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
done < $IP_FILE
あなたの模範
touch logfile_$(date "+%Y%m%d%T")
IP_FILE="ip.txt"
LOGFILE="logfile_$(date "+%Y%m%d%T")"
if [[ ! -f ${IP_FILE} ]]; then
echo "Cannot find IP address!"
exit 1
fi
for IP_ADDRESS in `cat $IP_FILE` ; do
#ssh $IP_ADDRESS >> $LOGFILE 2>&1
ssh-keyscan $IP_ADDRESS 2>&1 | grep -v "^$" > /dev/null
[ $? == 0 ] && echo $IP_ADDRESS >> $LOGFILE 2>&1
done
方法 #2: nmap
このツールを使用して実行できる作業もいくつかありますnmap
。
$ nmap -A -iL ip.txt -p T:22
これは、ホスト名とIPアドレスを含む可能性のあるファイルを繰り返し、ip.txt
各ポートでTCPポート#22を検索して、次のような結果を返します。
Nmap scan report for somehost.somedom.local (192.168.1.200)
Host is up (0.012s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey: 1024 2e:32:85:a2:56:23:01:f1:c2:8f:df:aa:83:7a:1e:ad (DSA)
|_2048 f6:a1:23:1d:aa:44:4a:ce:b4:d3:f4:fe:e1:00:47:b7 (RSA)
引用する
答え2
netcatユーティリティ(バイナリ実行ファイルと呼ばれる)を探していますnc
。 TCPポート22の接続専用テストを含む、さまざまなネットワークテストを実行できます。以前のnetcatユーティリティを使用している場合、コマンドは次のようになります。
nc -vz [ip.or.hostname] 22 -w [desired.timeout.value.in.seconds]
-z
最新バージョンでは、デフォルトではそのオプションが削除されたと思います。
たとえば、
[jadavis6@cmsoracle ~]$ nc -vz wfwhite.xxx.edu 22 -w 5
nc: connect to wfwhite.xxx.edu port 22 (tcp) timed out: Operation now in progress
[jadavis6@cmsoracle ~]$ echo $?
1
[jadavis6@cmsoracle ~]$ nc -vz ditirlns01.xxx.edu 22 -w 5
Connection to ditirlns01.xxx.edu 22 port [tcp/ssh] succeeded!
[jadavis6@cmsoracle ~]$ echo $?
0
[jadavis6@cmsoracle ~]$
答え3
誰かがnetcatに言及しましたが、目的の操作を実行するコマンドの1つであるnmapをお勧めします。
nmap -iL path/to/ip_address.txt -p 22
これにより、必要なすべての情報が提供されます。
答え4
何もインストールできない場合は、次のことができるはずです。ここ):
$ for ip in `cat ips.txt`; do
ssh -o PreferredAuthentications=publickey foobar@$ip "echo ''" 2>&1 |
grep denied >/dev/null && echo "$ip has SSH";
done < ips.txt
ここでの秘訣はPreferredAuthentications
。ssh
に保存されているキー情報を使って接続しようとするコマンドです~/.ssh
。ユーザーがリモートシステムへのアクセス権を持っていない限りfoobar
(必要な任意の名前に変更)、「許可拒否」エラーで接続が失敗します。これはgrep denied
成功するので、echo
コマンドが実行されることを意味します。&&
前のコマンド(ここではgrep
)が成功した場合は、次のコマンドが実行されることを示します。
IPを含むファイルでこのスクリプトを実行すると、SSHサービスを実行しているサーバーのみが印刷されます。