Insira a senha apenas uma vez para um script que usa rsync e SSH

3

Estou tentando escrever um script que envia um site para o meu servidor, onde os arquivos do site estão na minha máquina local para teste.

Funciona agora, usando rsync para atualizar o servidor e, em seguida, ssh para fazer o servidor executar um script que faz algumas coisas (ou seja, reiniciar o apache - o site usa WSGI).

O problema é que eu tenho que inserir minha senha para o servidor duas vezes, que eu não gosto muito.

Existe uma maneira de fazer com que eu tenha que inserir minha senha apenas uma vez? Eu particularmente não quero ter que digitar minha senha, então gostaria de ter uma maneira de fazer isso sem a ssh-key .

    
por Jared P 19.09.2011 / 14:26

3 respostas

6

Procure as opções -M e -S em ssh(1) . A idéia é abrir uma conexão principal com o servidor e, em seguida, fazer vários acessos como conexões escravas através do soquete aberto. Veja também ControlMaster e ControlPath no manual ssh_config(5) .

    
por 19.09.2011 / 14:49
1

Temos uma configuração complicada semelhante em nossa universidade. Os usuários são obrigados a usar o login de senha.

Eventualmente, eu aprendi sobre expect que pode automatizar isso.

No meu caso, tornei meu programa um pouco ilegível para que a senha não ficasse óbvia visível.

De qualquer forma, o primeiro exemplo bem legível que encontrei é aqui :

#!/usr/local/bin/expect
spawn  sftp  -b cmdFile [email protected]
expect "password:"
send "shhh!\n"; 

A ideia é recriar completamente o processo do seu logon manual. Portanto, você precisará saber de antemão quais "perguntas" seu script encontrará e o que ele deve responder.

Além disso, o comando no meu caso foi

spawn  ssh [email protected]

Substitua a string em expect pelo que é mostrado no SEU caso - e também insira respostas conforme necessário.

Então, por exemplo se você tiver que digitar sua senha duas vezes - adicione outra

expect "password:"
send "my_super_secret_password\n"; 

Não se esqueça de adicionar os comandos para colocar seu site no script;) Será parecido com:

expect "prompt:"
send "update my website\n"
    
por 19.09.2011 / 20:38
0

Há perguntas semelhantes com outra resposta descritiva que você pode encontrar AQUI .

Caso seja útil, fiz este script genérico com dois processos rsync diferentes, seguindo a sugestão de Kusalananda:

#!/usr/bin/env bash

REMOTEUSER=username
REMOTEHOST=hostname

mkdir -P ~/.ssh/ctl
ssh -nNf -o ControlMaster=yes -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir01/ $REMOTEUSER@$REMOTEHOST:/remotedir01/

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir02/ $REMOTEUSER@$REMOTEHOST:/remotedir02/

ssh -O exit -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST
    
por 15.10.2013 / 19:15

Tags