重定向标准输入几行,然后返回到键盘输入

时间:2018-10-22 23:14:17

标签: bash stdin openconnect

我有一个bash脚本,该脚本调用openconnect,该脚本随后转身并从stdin读取4行。这些是(按顺序):组,密码,身份验证类型和一次性密码。

我可以以编程方式获取前3个值,但是一次性密码每次都会更改。有没有一种方法可以编写脚本来重定向stdin的前三个值(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

在上面的脚本中,我传递了openconnect提示的4项中的3项,但是当它提示输入第4个值(一次性密码)时,它将立即吞下一个空字符串,而不是等待键盘输入

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:0)

您也许可以只使用bash的read,:

read group    < instream # or however you get it
read password < instream
read auth     < instream
read code

read code将默认为从stdio读取。然后,您可以只引用$group$password$auth$code作为普通变量。 read将一次插入一行。

如果要创建自定义文件/ IO处理程序,请参考现有的SO问题之一:例如How do file descriptors work?