$ ls
testscript.sh testservers.txt
$ cat testservers.txt
serverA IMM 10.2.3.4 USERID PASSW0RD
serverB IMM 10.2.3.5 USERID PASSW0RD
$
$
$ cat testscript.sh
#!/bin/bash
# test them..
egrep -vi '^#|^$' testservers.txt | while read ONELINE; do
# variables..
SERVER=`echo "$ONELINE" | awk 'BEGIN {FS="\t"} {print $1}'`
RSATYPE=`echo "$ONELINE" | awk 'BEGIN {FS="\t"} {print $2}'`
IP=`echo "$ONELINE" | awk 'BEGIN {FS="\t"} {print $3}'`
USER=`echo "$ONELINE" | awk 'BEGIN {FS="\t"} {print $4}'`
PWD=`echo "$ONELINE" | awk 'BEGIN {FS="\t"} {print $5}'`
if [ "$RSATYPE" = "IMM" ]; then
# main testing part for IMM
timeout 5 tsocks nc -z -w 3 "${IP}" 80 > /dev/null 2>&1; if [[ $? -eq 0 ]];
then WEBINTOK="true"
else WEBINTOK="false"
fi
IMMSSH=`(timeout 5 tsocks sshpass -p "${PWD}" ssh -l "${USER}" -o StrictHostKeyChecking=no "${IP}" exit)`
if echo "${IMMSSH}" | grep -q "tty name check failed"; then
${WEBINTOK} && echo -e "${SERVER} ${USER} - OK" || echo -e "${SERVER} ${USER} - ERROR"
else
${WEBINTOK} && echo -e "${SERVER} ${USER} - ERROR" || echo -e "${SERVER} ${USER} - ERROR"
fi
fi
done
$
$ bash testscript.sh
serverA USERID - OK
$
私たちの問題:スクリプトが最初の行だけを読むのはなぜですか? testservers.txtのすべての行を読み取ったとします。
更新:testservers.txtに正しいタブがあります。実際にはそれが問題だとは思わない。 \
$ cat -vte testservers.txt
serverA^IIMM^I10.2.3.4^IUSERID^IPASSW0RD$
serverB^IIMM^I10.2.3.5^IUSERID^IPASSW0RD$
$
ベストアンサー1
あなたは:
egrep... | while read ...; do
...
... ssh $IP exit...
...
done
ssh
リモートホストに接続してリモートコマンドを実行し、標準入力から読み取ったものを送信します(該当する-n
オプションが渡されない限り)。
この場合、ssh
stdinはそれを読み取るパイプであり、egrep
stdinを読み取るパイプと同じです。read
したがって、通常はすべての出力を読み取り、それをコマンドに送信egrep
します(リモートシェルはそれを読みませんが読み込みます)。exit
$IP
exit
ssh
nc
これは、標準入力を読み取って確立された接続を介して送信しますが、-z
ここのようなオプションを渡さない別のコマンドです。
この問題を回避するには、-n
オプションを使用するかssh
()ssh
でstdinをリダイレクトしてください。/dev/null
ssh < /dev/null...