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.
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!
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.