bash - 将标准输入重定向几行,然后返回键盘输入
问题描述
我有一个调用 openconnect 的 bash 脚本,然后它转身从标准输入读取 4 行。它们是(按顺序):组、密码、身份验证类型和一次性密码。
我可以以编程方式获取前 3 个的值,但一次性密码每次都会更改。有没有办法编写一个脚本,可以为前 3 个值()重定向标准输入,printf "%s\n%s\n%s\n" $group $password $auth
然后让程序读取最后一行(一次性密码)作为键盘输入?
#!/bin/bash
set -e
type="GROUP_SUBSTITUTED"
pass=`pass password_substituted`
auth="1"
echo -e "$type\n$pass\n$auth" |
sudo openconnect \
-u username_substituted \
-i tun1 \
vpn.substituted.url
在上面的脚本中,我传递了 4 个openconnect
提示中的 3 个,但是当它提示输入第 4 个值(一次性密码)时,它会立即吞下一个空字符串,而不是等待键盘输入。
解决方案
您可以使用exec
临时重定向文件描述符。
exec 3<&0 < filename # save old stdin in FD 3, redirect stdin from file
command1
command2
command3
exec <&3 3<- # restore stdin from FD 3
command4
或者您可以将一些命令包装在大括号中并重定向该块:
{
command1
command2
command3
} < filename
command4
推荐阅读
- html - 为什么锚标签不继承其父标签的颜色?
- arrays - 如何在 React Native 的数组中使用 {this.state.feed}?
- css - 使用面板从主菜单中删除空 DDL
- android-studio - (android) 应用被杀后如何重用glide
- redis - Redis 用于非唯一键
- azure - Apache Knox 与 Azure(HDP、OIDC)的集成
- c# - 如何在 GitHub Actions 中运行 Selenium 测试
- javascript - 我们如何才能使用 vuejs 获取组名的值?
- javascript - 鼠标(自动)悬停在按钮上后如何自动按下按钮
- javascript - Javascript 日期从 1 小时开始