whileループがスキップされ、最初の行だけを読むのはなぜですか?

whileループがスキップされ、最初の行だけを読むのはなぜですか?
$ 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オプションが渡されない限り)。

この場合、sshstdinはそれを読み取るパイプであり、egrepstdinを読み取るパイプと同じです。read

したがって、通常はすべての出力を読み取り、それをコマンドに送信egrepします(リモートシェルはそれを読みませんが読み込みます)。exit$IPexitssh

ncこれは、標準入力を読み取って確立された接続を介して送信しますが、-zここのようなオプションを渡さない別のコマンドです。

この問題を回避するには、-nオプションを使用するかssh()sshでstdinをリダイレクトしてください。/dev/nullssh < /dev/null...

おすすめ記事