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)