![我可以使用 < EOF 但让用户完成输入](https://linux22.com/image/142577/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20%3C%20EOF%20%E4%BD%86%E8%AE%A9%E7%94%A8%E6%88%B7%E5%AE%8C%E6%88%90%E8%BE%93%E5%85%A5.png)
下面的脚本产生了这种需求。它使用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 上发送的提示字符串,与 相同的语法ksh
。bash
有一个-p
选项。
答案2
你可能可以做类似的事情 -
$: head -1 <<!
hello, $(head -1<$(tty))!
!
但出于多种原因我不推荐它。
只是稍微好一点——
$: head -1 <<!
hello, $(read -rs pw <$(tty); echo "$pw" )!
!
hello, world!
不过,这还是你问的。