0
 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 5
 }
 }
 ')
 echo "$VAR"

更新:コードがPermissiondeniedブロックに入るときの終了条件が必要です。$を調べていますか?

ただし、「$ VAR」は正常に実行されるため、0になります。

したがって、Permissiondeniedブロックに入るときに整数の戻り値が必要です

4

3 に答える 3

1

Expectは独自のtclシェルを開始するため、bash環境で定義されたエイリアスを使用することはできません。

Expectには変数があります$env(YOURBASHVARIABLE)。これにより、Expectは環境変数を取得できますが、Expectはスクリプトの内部でのみそれらを変更できます。ただし、expectスクリプトが終了すると、変数に加えた変更は保持されません。

フラグが数値になる場合は、終了ステータス(たとえばexit 5)を使用$?してから、スクリプトで使用して終了ステータスを取得できます。

更新ごとに expectスクリプトは何も返しません。終了コードを設定するだけです。

あなたができることは単純です:

$(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 5
    }
  }
'); var=$?

このようにvarして、終了ステータスに設定されます。

また、これに注意する必要があります。

慣例により、環境変数(PATH、EDITOR、SHELL、...)および内部シェル変数(BASH_VERSION、RANDOM、...)は完全に大文字になります。他のすべての変数名には、少なくとも1つの小文字が必要です。変数名では大文字と小文字が区別されるため、この規則により、環境変数と内部変数が誤ってオーバーライドされることを回避できます。

EDIT(mpapis):他のユースケースもあります:

if output="$(expect ...)"
then
  echo "it worked: $output"
else
  result=$?
  echo "it failed($result): $output"
fi

編集(twmb)

最後のユースケースでは、何を返すかについて注意する必要があります。ユーザーに送信されたすべての出力を受け取ります。ロギングをオフにして(でlog_user 0)、expectスクリプトで出力される内容を正確に制御していない限り、必要以上の情報が得られる可能性があります。

これを伴う別のドラッグは、以下のコメントに示されています。

returned="$(expect -c '
  log_user 1  ;# turn to 0 and use send_user to control the exact output
  spawn bash
  expect "\\$"
  send "echo hello\r"
  send_user "this will be returned"
  expect "\\$" ;# without this line, the script would exit too fast 
               ;# for the "echo hello" to be sent to stdout by bash
               ;# and thus wont be recorded
  exit 6
  '
  )"; var=$?
echo "var: $var"
echo "returned: $returned"
于 2012-08-15T14:58:38.320 に答える
1

この場合、にはコマンドVARのが含まれますoutput

$?最後に実行されたコマンドの終了ステータスを含むを使用する必要があります。変数を設定しても変更されないため$?、サブシェルの終了ステータスは引き続き含まれます$(...)

例:

x=$(expect -c 'send "hello"; exit 5;')
echo $?; echo $x
5
hello
于 2012-08-15T16:36:45.073 に答える
0

set env期待して、環境変数を操作するために使用できます。数値の場合、expectからbashthanxに変数を渡してコマンドを終了できます。例を見てみましょう:

~/Desktop> cat test.exp
puts "From shell: FLAG=$env(FLAG)"
set env(FLAG) 22
puts "Set by expect: FLAG=$env(FLAG)"
exit $env(FLAG)
~/Desktop> export FLAG=0
~/Desktop> expect test.exp 
From shell: FLAG=0
Set by expect: FLAG=22
~/Desktop> echo $?
22
~/Desktop> 
于 2012-08-15T14:56:57.437 に答える