Como posso invocar um prompt para uma frase secreta da chave ssh durante a execução de um script?

3

No meu arquivo ssh_config existem várias entradas para sites no mesmo servidor, como:

Host site1
     HostName 123.1.1.1
     User myuser
     Port 13245
     GSSAPIAuthentication no
     IdentityFile /home/myuser/.ssh/id_dsa

Host site2...

Eu uso uma chave protegida por senha para efetuar login no servidor remoto e isso funciona bem. No entanto, estou tentando criar alguns scripts bash que sincronizam arquivos usando o rsync e gostaria que o script solicitasse a frase secreta e, em seguida, executasse o comando rsync. O ssh-agent parece ser o que eu quero usar, mas estou tendo dificuldades em descobrir isso. Eu estou procurando por algo como ...

HOST="site1:"
SRC=/var/foo
DEST=/home/bar
SYNC=(rsync "$SRC" "$HOST""$DEST"...)# rsync /var/foo site1:/home/bar...

read -r -p "Are you sure? [y/N] " response
response=${response,,}
if [[ $response =~ ^(yes|y)$ ]]
then
    #check to see if the passphrase exists from prior execution of this script.
    if [ no ];then
        #use ssh-add to prompt for passphrase
        ssh-add #? ;
        #then execute rsync command
        "${SYNC[@]}"
    else
        #execute rsync command
        "${SYNC[@]}"
    fi
else
    echo "Operation aborted!"
fi

Os únicos exemplos que consegui encontrar sugerem que o código seja colocado em .bashrc ou .profile, o que me obriga a inserir uma frase-senha toda vez que eu iniciar um shell ou criar um arquivo esperado que armazena a frase secreta, nenhuma das quais Desejo fazer. Como posso obter um prompt para a frase secreta apenas uma vez quando eu inicio meu script rsync para que eu possa alternar os hosts e executar novamente o script como no meu exemplo.

    
por dimmech 21.01.2015 / 05:50

2 respostas

3

Primeiro, você pode verificar se ssh-agent está sendo executado e iniciá-lo, se não:

if ! [ -n "$SSH_AUTH_SOCK" ] || 
  ! { ssh-add -l &>/dev/null; rc=$?; [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ];}; then
    echo "Starting agent..."
    eval "$(ssh-agent -s)"
fi

ssh-add -l sai com o código 1 se não houver identidades e com o código 2 se não puder se conectar a ssh-agent .

Depois, você adiciona a frase secreta para a chave de que precisa.

ssh-add ~/path/to/keyfile
    
por 21.01.2015 / 07:18
3

A idéia de ssh-agent é ter um serviço em execução armazenando todas as suas chaves. Portanto, você só precisa inserir sua senha uma vez e pode até mesmo encaminhar seu agente para um host remoto se quiser fazer login em um segundo host a partir dali.

Primeiro, verifique se ssh-agent está sendo executado usando ssh-add -l , o que provavelmente diz "O agente não tem identidades".

Em segundo lugar, adicione chaves ao seu agente dizendo ssh-add ou ssh-add path/to/key/file .

Depois, o rsync, como qualquer outro comando usando ssh, simplesmente usará o agente para buscar a chave necessária para a conexão remota.

    
por 21.01.2015 / 06:57