0

我有一个调用 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 个值(一次性密码)时,它会立即吞下一个空字符串,而不是等待键盘输入。

4

2 回答 2

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
于 2018-10-22T23:57:04.357 回答
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 问题之一:文件描述符如何工作?例如。

于 2018-10-22T23:23:34.887 回答