2016-05-23 11 views
1

私はこれをかなり微調整していますが、私は奇妙な出力ストリームと結果が出ませんでした。基本的には、特定のパスワードとプロセッサーを持っている私たちの広範なネットワーク上に特定のsshデバイスを見つけることを試みています。スクリプトは次のとおりです:bashスクリプトのexpectコマンドが失敗する

#/bin/bash 
for i in 54 
do 
    for j in 1 13 14 15 
    do 
    out=$(expect -c "spawn /usr/bin/ssh [email protected]$i.$j cat /proc/cpuinfo | grep MyString 
     expect { 
     -re \".*Are.*.*yes.*no.*\" { 
     send \"yes\n\" 
     exp_continue 
     } 

     \"*?assword:*\" { 
     send \"mypasswd\" 
     send \"\n\" 
     exp_continue 
     } 
     }") 
    if [["$out" != ""]] 
    then 
     echo "10.2.$i.$j" >> rpiout.txt 
    fi 
    done 
done 

sshコマンドは単独で動作します。また、expectスクリプトも正常に動作します。また、 "if [[...]]"文の前に "echo $ out"を挿入すると、SSHコマンドから期待される出力が得られます。 ...しかし、私は、コマンドラインとNOログファイルにこの出力を取得し、ファイルを書き込もうとしました:

./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.1 cat /proc/cpuinfo | grep MyString 
some_guy:@10.2.54.1's password: 
Permission denied, please try again. 
some_guy:@10.2.54.1's password: 
Permission denied, please try again. 
some_guy:@10.2.54.1's password: 
: No such file or directoryy,password). 
./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.13 cat /proc/cpuinfo | grep MyString 
some_guy:@10.2.54.13's password: 
: No such file or directory 
./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.14 cat /proc/cpuinfo | grep MyString 
some_guy:@10.2.54.14's password: 
: No such file or directory 
: No such file or directoryawn /usr/bin/ssh some_guy:@10.2.54.15 cat /proc/cpuinfo | grep MyString 

それはの一つではないので、パスワードの入力を3回を尋ねる最初のものは(正しいですターゲットデバイス)。 2番目の2は存在しないIPデバイスですが、最後の2は肯定的な結果を返します。

"エラー" "./check.sh:行19:[[spawn ..."]の行19は "if [[...]"で始まる行です。

この混乱から私を救うための助けがあれば幸いです!

+0

トップラインが '#!/ bin/bash -vx'のときは何が分かりますか? –

答えて

1

bash [[は構文だけでなく、のコマンドです。他のコマンドと同様に、それを引数から分離するには空白が必要です。方法に期待してさらに

ない

if [["$out" != ""]] 

しかし

if [[ "$out" != "" ]] 

または

if [[ -n "$out" ]] 

は、あなたが、端末で参照してくださいね同じようにコマンドをエコー、それはそうです出力はとなり、は空になります。

out=$(expect <<END 
    spawn -noecho /usr/bin/ssh [email protected]$i.$j sh -c {grep -q MyString /proc/cpuinfo || echo _NOT_FOUND_} 
    expect { 
     -re ".*Are.*.*yes.*no.*" { 
      send "yes\r" 
      exp_continue 
     } 
     "*?assword:*" { 
      send "mypasswd\r" 
      exp_continue 
     } 
     eof 
    } 
END 
) 

if [[ $out == *_NOT_FOUND_* ]]; then 
    echo "MyString not found on host 10.2.$i.$j" 
fi 

_NOT_FOUND_はあなたが見ていないだろうとは/ proc/cpuinfoのいくつかの文字列である場合は

-noechoは、あなたがそれをエコーし​​ない限り、$アウトのうち、「_NOT_FOUND_」を維持するためにここに非常に重要です:このような何かを試してみてください。

+0

スペースが問題でした... DOH!投稿と回答の表示の間に、ロジックを変更して、出力を探し出すよりも具体的になるようにしました。私は文字列の一致を探していたので、エコーの取引は有効になりませんでしたが、私は将来のためにそれを念頭に置いていきます。ありがとう!! – mobrien118

関連する問題