<< EOF を使用できますが、ユーザーに入力を完了させることができます。

<< EOF を使用できますが、ユーザーに入力を完了させることができます。

次のスクリプトはこの要件を生成します。 anyconnectのVPNユーティリティを使用してリモートPCに接続します。まず、ワンタイムパスワードを要求して接続し、RDPクライアントを起動してから、RPDクライアントアプリケーションを閉じてから切断します。

if [ $# == 1 ]; then
    ONE_TIME_PWD=$1;
else
    printf "Enter the one-time password: ";
    read ONE_TIME_PWD;
fi

vpn -s connect <domain> << EOF
<user>
<pin>$ONE_TIME_PWD
EOF

# Use some RDP client here like xfreerdp or rdesktop

vpn -s disconnect <domain>

問題は、実行中に使い捨てパスワードが変更される可能性があることですvpn -s connect <domain>。それでは、<pin>使い捨てパスワードを自動的に入力し、入力するようにスクリプトを変更できるかどうか疑問に思います。head -c -1最後の改行文字を削除しようとしましたが、入力はまだ完了です。 EOFに基づいていない他のソリューションも許可されています。

答え1

いつでも次のことができます。

{
  printf '<user>\n<pin>'
  printf 'Enter the one-time password: ' > /dev/tty
  IFS= read -r otp < /dev/tty
  printf '%s\n' "$otp"
} | vpn -s connect <domain>

vpn開始して給餌した後、パスワードを入力するように求められます<user>\n<pin>

パスワードを読み込み、ttyデバイスにプロンプ​​トを印刷したり、stdinから読み込み(削除< /dev/tty)、stderrにプロンプ​​トを印刷したりできます(> /dev/ttyに置き換えます>&2)。

zsh代わりにを使用している場合は、bash次のように単純化できます。

{
  printf '<user>\n<pin>'
  IFS= read -rse '?Enter the one-time password: '
} | vpn -s connect <domain>
  • -s端末を抑制するにはecho(サポートされているbash)パスワードを入力することをお勧めします。
  • -eEchoは変数に保存するのではなく、標準出力にテキストを入力しました。
  • ?prompt、同じ構文を使用してstderrに送信されたプロンプト文字列ksh。オプションbashがあります-p

答え2

おそらく次のようなことができます。

$: head -1 <<!
hello, $(head -1<$(tty))!
!

しかし、いくつかの理由でお勧めしません。

もう少し良くなったら -

$: head -1 <<!
 hello, $(read -rs pw <$(tty); echo "$pw" )!
!

 hello, world!

それでもそう言われました。

関連情報