Перенаправить стандартный ввод на несколько строк, а затем вернуться к вводу с клавиатуры - PullRequest
0 голосов
/ 23 октября 2018

У меня есть скрипт 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 ]

0 голосов
/ 23 октября 2018

Вы можете использовать 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
0 голосов
/ 23 октября 2018

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

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

...