2011-07-25 14 views
2

期待コードと組み合わせ、bashスクリプトである期待:エラー/下に貼り付けたスクリプト

  • は、SSHを介してリモートホストに接続し、ファイルを収集し、TGZファイルを準備します。
  • リモートホストからローカルマシンにtgzファイルをコピーします。
  • 再度ssh経由でリモートホストに接続し、以前作成したtgzファイルを削除します。
  • 最後に、ローカルマシン上でtgzファイルを抽出します。

すべてが渡された引数が有効な場合、動作します(つまり、$host$user、および$pass)。いずれかが間違っていると、スクリプトがハングします。ユーザー名(またはパスワード)が間違っている場合、メッセージでスクリプトを終了するためのエラー処理($ cmd1など)を含める方法を教えてください。

ありがとうございます。

#!/bin/bash 
prog=$(basename $0) 
NO_ARGS=0 
E_OPTERROR=85 

# Script invoked with no command-line args? 
if [ $# -eq "$NO_ARGS" ]; then 
    echo "Usage: $prog [-h host] [-u username] [-p password]" 
    echo "  $prog -help for help." 
    exit $E_OPTERROR 
fi 

showhelp() { 
    echo "Usage: $prog [-h host] [-u username] [-p password]" 
    echo " -h: host" 
    echo " -u: username" 
    echo " -p: password" 
    echo " -help: this help message" 
    exit 2 
} 

user="" 
host="" 
pass="" 
now=$(date +"%m-%d-%Y") 
dir="data_$now" 
file="data.tgz" 

while getopts "h:u:p:help" name; do 
    case $name in 
    h) 
     host=$OPTARG 
    ;; 
    u) 
     user=$OPTARG 
    ;; 
    p) 
     pass=$OPTARG 
    ;; 
    help) 
     showhelp $0 
    ;; 
    esac 
done 

if [ -d "$dir" ]; then 
    rm -R $dir 
    mkdir $dir 
else 
    mkdir $dir 
fi 

cmd1=$(expect << EOF 
spawn ssh [email protected]$host 
expect "password: " 
send "$pass\n" 
expect "$ " 
send "cd /tmp\n" 
expect "$ " 
send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n" 
expect "$ " 
send "logout" 
EOF) 

cmd2=$(expect << EOF 
spawn scp [email protected]$host:/tmp/$file $dir 
expect "password: " 
send "$pass\n" 
expect "$ " 
EOF) 

CMD3=$(expect << EOF 
spawn ssh [email protected]$host 
expect "password: " 
send "$pass\n" 
expect "$ " 
send "cd /tmp\n" 
expect "$ " 
send "rm $file\n" 
expect "$ " 
send "logout" 
EOF) 

echo "$cmd1" 
echo "$cmd2" 
echo "$cmd3" 
cd $dir 
tar -xzf $file 
rm $file 
count=$(ls -1 | wc -l | awk '{gsub(/^ +| +$/, "")}1') 
cd .. 
#clear 
echo "All done. Extracted $count *.net files." 
+1

を除く?期待? –

+0

@イグナシオのスペルを修正しました。コメントありがとう。 – Andrej

答えて

2

expectコマンドは、異なる回答に基づいて異なるアクションを実行できます。

たとえば、次のような$ CMD1を定義することができます。提供されたパスワードが機能しない場合

cmd1=$(expect << EOF 
spawn ssh [email protected]$host 
expect "password: " 
send "$pass\n" 
expect { 
{ 
    "Permission denied, please try again." { 
     send_user "Wrong password" 
     exit 
    } 
    "$ " { 
     send "cd /tmp\n" 
     expect "$ " 
     send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n" 
     expect "$ " 
     send "logout" 
    } 
} 
EOF) 

、このスクリプトは終了し、メッセージ「間違ったパスワード」を印刷します。

さらに高度な使い方については、マニュアルページをご覧ください。そこにはいくつかの例があり、他にも多くのオプションがあります。

ここ
+0

あなたのソリューションに感謝します。いいです。 – Andrej

1
expect { 
{ 
    "Permission denied, please try again." { 
     send_user "Wrong password" 
     } 
    "$ " { 
     send "cd /tmp\n" 
     expect "$ " 
     send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n" 
     expect "$ " 
     send "logout" 
    } 

我々はexitコマンドを削除し、「間違ったパスワードを」印刷して、「CDの/ tmp \ n」を送信することにより、次の部分を行うよりもすべき期待....... がより正しいのですか?

関連する問題