Posso efetuar login automaticamente no ssh usando senhas do chaveiro do OS X?


9

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

Estou usando o OS X Lion (10.7.2). Eu adicionei as senhas ao chaveiro do OS X [1]. Agora eu posso recuperar a senha automaticamente do chaveiro usando /usr/bin/security, no entanto, não consigo encontrar uma maneira de enviar essa senha ao 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 de acessar esse servidor sem ter que digitar a senha todas as vezes?

Notas

  1. O esquema que eu uso no chaveiro se parece com isso
    • Tipo: senha da Internet
    • Nome de usuário da conta
    • Onde: ssh: // server-name

Respostas:


11

Sessões SSH não interativas

Se você não precisar ter uma sessão interativa no servidor remoto, poderá executar sshem um ambiente sem tty, por exemplo, como parte de uma ação Executar Shell Script no Automator .

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

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

Em seguida, defina a SSH_ASKPASSvariável de ambiente como o caminho para este programa e execute ssha ação do Automator, da seguinte maneira:

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

Quando não há tty, mas SSH_ASKPASSe DISPLAY(para X11, definido por padrão), o SSH executa o programa especificado por SSH_ASKPASSe usa sua saída como senha. Isso deve ser usado em ambientes gráficos, para que uma janela possa aparecer solicitando sua senha. Nesse caso, pulamos a janela, retornando a senha do nosso programa. Você pode usar securitypara ler a partir do seu chaveiro, assim:

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

ls(na sshlinha de comando) é o comando executado quando o sshlogin é efetuado e sua saída é impressa no Automator. Obviamente, você pode redirecioná-lo para um arquivo para registrar a saída do programa iniciado.


Sessões interativas de SSH usando sshpass

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

  1. Obtenha as ferramentas de desenvolvedor 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. Corre ./configure
  5. Corre make
  6. Executar make install(você pode precisar sudo)

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

sshpass -pYourPassword ssh username@hostname

Você pode ler a senha securityimediatamente 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

Embrulhe isso em uma função shell e você pode digitar, por exemplo, ssh-yourhostnamepara conectar, recuperar e digitar a senha automaticamente.


Olá, votei na sua resposta desde que me levou à solução. No entanto, o que você descreveu aqui não funcionou exatamente (isso pode ser específico para a versão do ssh do Lion) 1) Para sessões não interativas, o ssh ainda me solicitava uma senha e, depois de inseri-la, obtive STDIN is not a terminal. 2) Para sessões interativas com sshpass, a -popção aparentemente não faz nada. Mas correr sshpassenquanto SSH_ASKPASSestá definido funciona!
Chaitanya Gupta

@ChaitanyaGupta Odd. Funcionou para mim de maneira não interativa no Automator on Lion. Em relação à segunda questão, é possível que eu tenha tido uma sessão de shell suja naquele momento, não tenho mais certeza. +1 para você e obrigado por adicionar sua solução ao site.
Daniel Beck

Meu problema (referente a 1) - eu estava tentando executar a sessão não interativa no terminal e não no Automator. Eu tentei no Automator agora e ainda recebo STDIN is not a terminalerro. No entanto, desta vez não fui solicitada nenhuma senha; Acredito que SSH_ASKPASSesteja trabalhando no Automator, pois, se eu fizer o arquivo SSH_ASKPASSretornar a senha errada, recebo um Permission denied, please try again.erro.
Chaitanya Gupta

1
Para os últimos exemplos, observe que, no Unix, como sistemas operacionais, argumentos de linha de comando e variáveis ​​de ambiente podem ser visíveis para outros usuários no sistema, portanto, isso não é seguro em um ambiente multiusuário sensível.
Jürgen Strobel 27/03

@DanielBeck qualquer idéia de como fazer isso para trabalhar emmacOs >= 10.13
nbari

7

Encontrei uma solução (obrigado a Daniel Beck por fornecer as principais informações necessárias para isso). Observe que eu só testei isso com o OS X Lion 10.7.2. Se isso não funcionar, tente a solução de Daniel.

Primeiro, precisamos definir a SSH_ASKPASSvariável de ambiente - seu valor deve ser o caminho para um programa que imprime a senha na saída padrão. Para obter a senha do chaveiro, é assim que ela deve ser (eu chamo 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 chaveiro da maneira que descrevi na pergunta

  2. O programa indicado SSH_ASKPASSserá chamado sem argumentos; então usamos variáveis ​​de ambiente para passar o usuário e o nome do host para ele.

Agora podemos definir SSH_PASSWORD_USERe SSH_PASSWORD_HOSTNAMEexecutar sshpasspara fazer login no nosso servidor.

Eu criei outro script,, ssh-kcpasspara 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 fazer login no servidor ssh sem digitar nenhuma senha, basta executar ssh-kcpass user@hostname.


Como fazer isso para trabalhar emmacOS >= 10.13
nbari

-3

Olá pessoal, me deparei com esse tópico procurando alguma outra coisa, mas ... Não sei se estou perdendo alguma coisa aqui ... mas sua abordagem me parece estranha. por que não usar autenticação de chave pública ... Gere uma chave rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Idealmente, você usaria uma vez o usuário ssh-copy-id @ host e autenticaria com a senha uma vez para instalar a chave no outro servidor, ou usaria qualquer tipo de ferramenta de script ou authomação para implantar a chave em ~ / .ssh / allowed_keys em o outro host (para o usuário no qual você deseja fazer login) Se feito com o comando manualmente, você deverá editar o arquivo / etc / ssh / sshd_config de acordo e a automação (chef, ansible) pressionará a condição completa no estado desejado.

A chave que importa distribuir é id_rsa.pub, mantenha a chave privada segura

Para usar as chaves para se autenticar nos hosts de maneira direta e automática, edite em sua máquina o ~ / .ssh / config e adicione:

Anfitrião * UseKeychain sim

Procure mais informações sobre as opções do arquivo de configuração ssh, espero que isso seja útil


1
Leia a primeira frase do corpo da pergunta: '' Preciso fazer login em um servidor ssh que não suporte autenticação baseada em chave. ``
Scott

Olá Scott, acho que você também perdeu a parte em que ele diz que não deseja digitar a senha toda vez, o que significa que está fazendo isso.
Ricardo Mendes

Não, não senti falta disso. Por que você acreditaria que eu fiz?
Scott

Bc você ainda está falando
Ricardo Mendes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.