Перенаправить стандартный ввод на несколько строк, а затем вернуться к вводу с клавиатуры

У меня есть скрипт bash, который вызывает openconnect, который затем поворачивается и читает 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

В приведенном выше сценарии я пропускаю 3 из 4 вещей openconnect запрашивает, но когда он запрашивает 4-е значение (одноразовый пароль), он немедленно глотает пустую строку вместо ожидания ввода с клавиатуры.

2 ответа

Ты можешь использовать 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

Вы, вероятно, можете просто использовать Bash's 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 будет тянуть по одной линии за раз.

Если вы хотите создать пользовательские обработчики файлов / ввода-вывода, обратитесь к одному из существующих вопросов SO: Как работают файловые дескрипторы? например.

Другие вопросы по тегам