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

3

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

Ele funciona agora, usando rsyncpara atualizar o servidor e, em seguida, sshpara obter o servidor para executar um script que faz algumas coisas (ou seja, reinicie 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 isso para que eu só tenha que inserir minha senha uma vez? Eu particularmente não quero ter que digitar minha senha, então eu gostaria de ter alguma maneira de fazer isso sem a ssh-keycoisa.

Jared P
fonte
2
> tem alguma maneira de fazer isso sem a chave ssh - é exatamente para isso que servem essas chaves. Alguma razão específica porque você não quer fazer isso?
slhck
Quero dizer - e isso é meio que uma solução barata - você provavelmente poderia fazê-lo com chaves SSH e apenas fazer o script rodar apenas com privilégios de root.
slhck

Respostas:

6

Procure as opções -Me -Sem 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 ControlMastere ControlPathno ssh_config(5)manual.

Kusalananda
fonte
1

Nós 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 o expectque pode automatizar isso.

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

Enfim - primeiro exemplo bem legível que encontrei está 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.

Também o comando no meu caso foi

spawn  ssh [email protected]

Substitua a string expectpara o que é mostrado no seu caso - e também respostas de entrada, como será necessário lá.

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 esqueça de adicionar os comandos para colocar o seu site no script;) Será parecido com:

expect "prompt:"
send "update my website\n"
bdecaf
fonte
0

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

Apenas no caso de ser útil, eu fiz este script genérico com dois rsyncprocessos 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
Ryanjdillon
fonte