我可以使用 < 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),最好输入密码。
  • -e在标准输出上回显输入的文本,而不是存储到变量中
  • ?prompt,在 stderr 上发送的提示字符串,与 相同的语法kshbash有一个-p选项。

答案2

你可能可以做类似的事情 -

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

但出于多种原因我不推荐它。

只是稍微好一点——

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

 hello, world!

不过,这还是你问的。

相关内容