Перенаправить стандартный ввод на несколько строк, а затем вернуться к вводу с клавиатуры
У меня есть скрипт 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: Как работают файловые дескрипторы? например.