Posso fazer login automaticamente no ssh usando senhas do keychain do OS X?

9

Eu preciso fazer o login em um servidor ssh que não suporta autenticação baseada em chave. E eu não quero digitar as senhas todas as vezes.

Estou usando o OS X Lion (10.7.2). Eu adicionei as senhas ao keychain do OS X [1]. Agora eu posso recuperar a senha automaticamente do keychain usando /usr/bin/security , no entanto não consigo encontrar uma maneira de enviar essa senha para o prompt do ssh.

Eu também tentei sshpass . No entanto, quando tento executá-lo, o ssh sai com o seguinte erro:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Existe alguma maneira que eu possa fazer login neste servidor sem ter que digitar a senha toda vez?

Notas

  1. O esquema que eu uso no chaveiro se parece com isso
    • Tipo: senha da Internet
    • Conta: nome de usuário
    • Onde: ssh: // server-name
por Chaitanya Gupta 24.02.2012 / 06:58

2 respostas

7

Eu encontrei uma solução (graças a Daniel Beck por fornecer as principais informações necessárias para isso). Observe que eu testei apenas isso com o OS X Lion 10.7.2. Se isso não funcionar para você, tente a solução de Daniel.

Primeiro, precisamos definir a variável de ambiente SSH_ASKPASS - seu valor deve ser o caminho para um programa que imprime a senha para a saída padrão. Para obter a senha do chaveiro, é assim que ela precisa ser (chamo de get-ssh-password.sh ):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Alguns pontos a serem observados:

  1. Isso pressupõe que você tenha armazenado a senha no conjunto de chaves da maneira que descrevi na pergunta

  2. O programa dado em SSH_ASKPASS será chamado sem nenhum argumento; então usamos variáveis de ambiente para passar o usuário e o nome do host para ele.

Agora, podemos definir SSH_PASSWORD_USER e SSH_PASSWORD_HOSTNAME e executar sshpass para fazer login em nosso servidor.

Eu criei outro script, ssh-kcpass , para fazer isso:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Para entrar no servidor ssh sem digitar nenhuma senha, você só precisa executar ssh-kcpass user@hostname .

    
por 28.02.2012 / 05:26
10

Sessões SSH não interativas

Se você não precisa ter uma sessão interativa no servidor remoto, pode executar ssh em um ambiente sem tty , por exemplo, como parte de uma ação Executar Script Shell no Automator .

Você precisa criar um programa que, quando chamado, imprima a senha como padrão, por exemplo, o seguinte script bash você precisa tornar executável usando chmod +x pwd.sh :

#!/usr/bin/env bash
echo "password"

Em seguida, defina a variável de ambiente SSH_ASKPASS para o caminho desse programa e, em seguida, execute ssh na ação do Automator, desta forma:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Quando não há tty , mas SSH_ASKPASS e DISPLAY (para X11, definido por padrão) são definidos, o SSH executa o programa especificado por SSH_ASKPASS e usa sua saída como senha. Este destina-se a ser usado em ambientes gráficos, para que uma janela possa aparecer solicitando sua senha. Neste caso, apenas pulamos a janela, retornando a senha do nosso programa. Você pode usar security para ler suas chaves, assim:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls (na linha de comando ssh ) é o comando executado quando ssh efetuou login e sua saída é impressa no Automator. Você pode, naturalmente, redirecioná-lo para um arquivo para registrar a saída do programa que você inicia.

Sessões de SSH interativas usando sshpass

Eu baixei, compilei e instalei sshpass e funcionou perfeitamente. Aqui está o que eu fiz:

  1. Obtenha as ferramentas para desenvolvedores da Apple
  2. Faça o download e abra sshpass-1.05.tar.gz
  3. Abra um shell no diretório sshpass-1.05
  4. Executar ./configure
  5. Executar make
  6. Executar make install (você pode precisar de sudo para isso)

Agora o programa está instalado em /usr/local/bin/sshpass . Execute usando uma linha como a seguinte:

sshpass -pYourPassword ssh username@hostname

Você pode ler a senha de security antes de fazer isso e usá-la assim:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Envolva isso em uma função shell e você pode digitar, por exemplo ssh-yourhostname para se conectar, fazendo com que recupere e digite a senha automaticamente.

    
por 24.02.2012 / 09:30

Tags