Para aqueles que querem responder que eu deveria usar as chaves SSH, abstenha-se
Estou tentando usar o expect em um script bash para fornecer a senha SSH. Desde que a senha funcione, mas eu não terminei a sessão do SSH como deveria, ela volta diretamente ao bash.
Meu script:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"
A saída do meu script:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
Gostaria de ter minha sessão SSH e somente quando a sair para voltar ao meu script bash. A razão pela qual estou usando o bash antes do esperado é porque usei um menu no qual posso escolher a qual unidade conectar.
obrigado
Respostas:
Misturar bash e expect não é uma boa maneira de obter o efeito desejado. Eu tentaria usar apenas o Expect:
A solução de amostra para o bash pode ser:
Isso aguardará a entrada e, em seguida, a sessão interativa de retorno (por um momento).
fonte
A maneira mais fácil é usar o sshpass . Isso está disponível nos repositórios Ubuntu / Debian e você não precisa lidar com a integração do expect com o bash.
Um exemplo:
O comando acima pode ser facilmente integrado a um script bash.
Nota: Leia considerações de segurança seção
man sshpass
para entender completamente as implicações de segurança.fonte
sshpass
que faça isso, mas mesmo assim há um período enquanto ainda está sendo inicializado antes que seja possível fazê-lo quando a senha estiver disponível para qualquer processo.sshpass
é usado em um cenário em que você possui scripts de teste simples que são executados em um ambiente de rede local em que a segurança não é a principal preocupação. De fato, há uma seção emman sshpass
que uma seção inteira sobre considerações de segurança é explicada. Adicionado isto para responder, Obrigado.Adicione o comando de espera 'interact' antes do seu EOD:
Isso deve permitir que você interaja com a máquina remota até fazer o logout. Então você voltará ao bash.
fonte
expect eof
o @ Emmanuel resolveu o problema.'
deusr@$myhost.example.com'
e deve funcionar. E talvez você precise substituir\n
com\r
, mas YMMVDepois de procurar uma resposta para a pergunta por meses, finalmente encontro uma solução realmente melhor: escrever um script simples.
Coloque
/usr/bin/exp
, então você pode usar:exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
Feito!
fonte
expect "assword:"
você quis dizerexpect "password:"
?"assword"
irá combinar ambosPassword
epassword
.Certifique-se também de usar
em vez disso, como senhas que começam com um traço (-) falharão caso contrário.
O exemplo acima não interpretará uma sequência que começa com um traço como uma opção para o comando send.
fonte
Um script de expectativa simples
Remotelogin.exp
Exemplo:
fonte
Use a ferramenta auxiliar
fd0ssh
(do hxtools, não do pmt), ela funciona sem ter que esperar um prompt específico do programa ssh.fonte
echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port [email protected] &
OBRIGADO!sshpass
faz.Outra maneira que achei útil para usar um pequeno script esperado de um script bash é a seguinte.
Isso funciona porque
...If the string "-" is supplied as a filename, standard input is read instead...
fonte
-
aqui, comoexpect
lêstdin
por padrão, se o invocar sem argumento. No entanto, é útil se você deseja executá-lo interativamente sem o prompt de comando (expect
vs.expect -
) ou caso faça algo comoexpect -f "$@"
onde o primeiro argumento deve ser um arquivo, mesmo que pareça uma opção (começa com-
). Nesse caso, se$1
(o arquivo fornecido) for-
lido porstdin
.sshpass
está quebrado se você tentar usá-lo dentro do destino de criação de Texto Sublime, dentro de um Makefile. Em vez desshpass
você pode usarpassh
: https://github.com/clarkwang/passhCom
sshpass
você faria:Com
passh
você faria:Nota: Não se esqueça de usar
-o StrictHostKeyChecking=no
, caso contrário, a conexão travará na primeira vez em que você a usar. Por exemplo:Referências:
fonte