次のスクリプトはこの要件を生成します。 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
)パスワードを入力することをお勧めします。-e
Echoは変数に保存するのではなく、標準出力にテキストを入力しました。?prompt
、同じ構文を使用してstderrに送信されたプロンプト文字列ksh
。オプションbash
があります-p
。
答え2
おそらく次のようなことができます。
$: head -1 <<!
hello, $(head -1<$(tty))!
!
しかし、いくつかの理由でお勧めしません。
もう少し良くなったら -
$: head -1 <<!
hello, $(read -rs pw <$(tty); echo "$pw" )!
!
hello, world!
それでもそう言われました。