Posso usar EOF, mas permitir que o usuário complete a entrada

1

A necessidade disso surgiu a partir do script abaixo. Ele se conecta a um PC remoto usando o utilitário vpn do anyconnect. Primeiro, ele solicita a senha única, conecta-se, inicia um cliente RDP e se desconecta depois que o aplicativo cliente RPD é fechado.

if [ $# == 1 ]; then
    ONE_TIME_PWD=$1;
else
    printf "Enter the one-time password: ";
    read ONE_TIME_PWD;
fi

vpn -s connect <domain> << EOF
<user>
<pin>$ONE_TIME_PWD
EOF

# Use some RDP client here like xfreerdp or rdesktop

vpn -s disconnect <domain>

O problema é que a senha única pode mudar durante a execução de vpn -s connect <domain> . Então, eu estava curioso para saber se é possível alterar o script para que ele me permita digitar a senha de uso único depois que <pin> foi inserido automaticamente? Eu tentei com head -c -1 para remover o último caractere de nova linha, mas a entrada ainda estava terminada. Qualquer outra solução não baseada em EOF é aceitável.

    
por ka3ak 25.11.2018 / 08:45

2 respostas

0

Você sempre pode fazer:

{
  printf '<user>\n<pin>'
  printf 'Enter the one-time password: ' > /dev/tty
  IFS= read -r otp < /dev/tty
  printf '%s\n' "$otp"
} | vpn -s connect <domain>

Que solicita a senha depois que vpn foi iniciado e já foi alimentado com <user>\n<pin> .

Ele lê a senha e imprime os prompts no dispositivo tty, alternativamente você pode ler de stdin (remover o < /dev/tty ) e imprimir o prompt no stderr (substitua > /dev/tty por >&2 ).

Se estiver usando zsh em vez de bash , você pode simplificar isso para:

{
  printf '<user>\n<pin>'
  IFS= read -rse '?Enter the one-time password: '
} | vpn -s connect <domain>
  • -s para suprimir o terminal echo (aquele também suportado por bash ), preferível a senhas de entrada.
  • -e para fazer eco do texto digitado no stdout em vez de armazenar em uma variável
  • ?prompt , string de prompt enviada em stderr, mesma sintaxe de ksh . bash tem uma opção -p para isso.
por 25.11.2018 / 09:00
0

Você provavelmente poderia fazer algo semelhante a isso -

$: head -1 <<!
hello, $(head -1<$(tty))!
!

Mas eu não recomendo isso por vários motivos.

Apenas um pouco melhor -

$: head -1 <<!
 hello, $(read -rs pw <$(tty); echo "$pw" )!
!

 hello, world!

Ainda assim, é o que você pediu.

    
por 26.11.2018 / 20:05