Como posso atualizar uma string única em um script de shell com a saída de uma função separada?

0

Devido à minha preguiça, eu escrevi uma série extremamente "confusa" de scripts para iniciar automaticamente o meu openvpn. O arquivo de configuração que estou usando vem vpnbook.com/freevpn.

Para obter a senha, uso:

lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18,19,20,21,22,23,24

A senha é retornada do site.

Então, eu uso um script de espera para fazer login automaticamente (o nome de usuário é sempre vpnbook, mas a senha muda dependendo da semana):

#!/usr/bin/expect -f
spawn openvpn /vpn/vpnbook-ca1-tcp80.ovpn ### my vpn configuration file ###
expect "*?sername:*"
send -- "vpnbook\r"
expect "*?assword:*"
### This next line sends the password that changes by the week, which I...
###...unfortunately need to update manually (for lack of a better method):
send -- "weekly-password\r" 

Os problemas que estou enfrentando ao tentar atualizar automaticamente a senha:

1) Não consigo chamar o lince diretamente do ambiente esperado.

2) Como a senha muda, não sei como substituir o a única frase secreta da semana anterior com a versão atualizada em:

send -- "unique-previous-password\r" 

3) Não tenho certeza de como usar a saída de string da função lynx como uma variável de entrada para editar a senha da semana anterior (localizada no meu script de espera).

Muito claramente, não sou o programador "mais brilhante" (nem sou o mais eficiente). No entanto, no final do dia, meu único objetivo é inicializar totalmente o meu vpn, digitando um único comando (como mencionei antes, eu sou preguiçoso).

Qualquer ajuda seria apreciada, obrigado!

    
por AQuestion 14.06.2017 / 06:13

2 respostas

1

No seu script expect / tcl , você pode usar:

send "$env(PASSWORD)\r"

E chame seu script expect com:

PASSWORD=$(elinks -dump...) /path/to/your/expect/script

Note que você pode usar cut -b18-24 para breve.

    
por 14.06.2017 / 11:01
0

A solução da Stéphane é muito elegante, mas caso você não queira baixar e analisar a senha toda vez, você pode manter o processo de duas etapas com algo parecido com isto:

Modifique seu comando de recuperação de senha para isso:

sed -e '$ d' -i .bak f && echo -n "send -- \"" >> f && lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18-24 >> f && echo "\r\"" >> f

Por uma questão de brevidade, eu chamei o arquivo de script esperado f . Na realidade, ele precisa ser o /path/to/your/expect/script completo, a menos que você já esteja no mesmo diretório do script.

Em seguida, chame seu script de espera como de costume.

Detalhado, o comando estendido funciona assim:

  • sed -e '$ d' -i .bak f Encontre a última linha ( $ ) em f e exclua-a ( d ). Cuidado com os switches -e e -i - eles são diferentes / não são suportados em algumas plataformas. -e especifica explicitamente o comando quando a opção -i está em uso e -i significa modificar o arquivo no local, salvando um backup com a extensão .bak .

  • && executa o próximo comando se o anterior tiver êxito.

  • echo -n "send -- \"" >> f Anexa ao arquivo ( >> f ) sem uma nova linha ( -n ) a primeira parte da função enviar expectativa.

  • lynx... Seu comando original, exceto que o resultado é anexado ao arquivo ( >> f ).

  • echo "\r\"" >> f Anexe a última parte da função enviar expectativa.

por 14.06.2017 / 15:27