2
VAR=$(expect -c "
     spawn ssh-copy-id -i $SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP    
     expect "*?assword:*"
     send \"$REMOTE_HOST_PASSWD\r\";  
     send -- "\r"
     expect eof
    ")

#echo "$VAR"

関数のbashスクリプトでコードが機能します。パスワードが間違っている場合は例外が必要です。私のやり方は;

VAR=$(expect -c "
     spawn ssh-copy-id -i $SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP    
     expect "*?assword:*"
     send \"$REMOTE_HOST_PASSWD\r\"; 
     expect "Permission denied, please try again."
     send user "Wrong pass"
     exit
     send -- "\r"
     expect eof
    ")

#echo "$VAR"

しかし、それはエラーを与えます

couldn't read file "denied,": no such file or directory

引用符についてだと思います。expect-c"を一重引用符expect-c'に変更すると、スクリプト内の変数であるため、今回は$SSH_KEY_PATH_PUBが見つからないというエラーが発生します。 。解決策は何ですか

編集:OK今回は一重引用符を使用する方が良いですが、それは機能します。しかし、if句で何ができるか。

 AR=$(expect -c '
 spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP"'
 expect "*?assword:*"
 send "'"$REMOTE_HOST_PASSWD"'\r";
 expect "Permission denied, please try again."
 send user "Wrong pass"
 exit
 send -- "\r"
 expect eof

')

今回は、パスがOKの場合はジョブを実行し、パスが正しくない場合は失敗します。ただし、パスが正しい場合は、「間違ったパス」ステージが書き込まれます。パスが正しければ、終了して続行しないようにする必要があります。申し訳ありませんが、expectとその構文に精通していません。

4

1 に答える 1

2

文字列内の「文字」の他の使用をエスケープする必要があります

AR=$(expect -c "
    spawn ssh-copy-id -i $SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP    
    expect \"*?assword:*\"
    send \"$REMOTE_HOST_PASSWD\r\"; 
    expect \"Permission denied, please try again.\"
    send user \"Wrong pass\"
    exit
    send -- \"\r\"
    expect eof
")

または、一重引用符の使用に切り替えることもできますが、変数を展開するには引用符を終了する必要があります

 AR=$(expect -c '
    spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP"'
    expect "*?assword:*"
    send "'"$REMOTE_HOST_PASSWD"'\r";
    expect "Permission denied, please try again."
    send user "Wrong pass"
    exit
    send -- "\r"
    expect eof
')

基本的に、単一のコマンド引数内でコマンドを引用するために使用される引用符のタイプを切り替えます。これが機能するのは、bashの単語の引数に引用符を混在させることができるためです。簡単な例

'password ='"$ password"

また、引用符の切り替えはいくつでも組み合わせることができ、2つの異なる引用符の間にスペースがない限り、すべて同じ単語またはコマンド引数の一部として扱われます。

于 2012-08-15T08:54:06.060 に答える