Use a autenticação interativa do teclado ao direcionar a saída do ssh para outro comando

7

Gostaria de enviar a saída de ssh para um comando diferente. Por exemplo:

ssh myserver cat remote-file | diff local-file -

O problema é que o myserver pede uma senha, mas não consigo entrar. (Por algum motivo, a autenticação de chave pública não está disponível no servidor. Eu não posso mudar isso.) Eu recebo o prompt "Password:", mas as teclas que eu digito são ecoadas e não passadas para o ssh. Como posso fazer o ssh obter a senha?

Não estou tentando canalizar o senha em ssh . Estou tentando canalizar a saída do ssh e digite a senha como de costume.

Caso seja importante, estou usando bash no OS X 10.7 (Lion) e no Terminal padrão. Não tenho aliases configurados que possam causar isso. Eu vi o mesmo problema diferente (Linux) sistemas, então eu acredito que não é específico para a minha configuração.

    
por jdm 18.08.2013 / 13:26

2 respostas

4

OK, isso se deveu a uma interação bizarra com minha configuração bash.

Eu tenho algo no meu .bash_profile que coloca o comando atualmente executado no título da janela ou na guia screen . Ele funciona usando um trap :

trap 'bash_current_command' DEBUG

e antes disso:

function bash_current_command {
    # only works in bash > 3.1
    #set -- $BASH_COMMAND

    # for old bash
    set -- $(history 1)
    shift

    if [[ "$1" == "sudo" ]]; then
        cmd="*$(basename -- "$2")*"
    else
        cmd="$(basename -- "$1")"
    fi

    bash_set_title "$cmd"
}

bash_set_title é uma pequena função que define o título e o título do terminal atual usando códigos de escape ANSI. Como você pode ver, isso cria subshells $(...) , e minha intuição me disse que esse poderia ser o problema. De fato, depois que mudei essas linhas, funcionou!

Se alguém souber por que isso acontece, ficarei feliz em saber detalhes. Os subshells geralmente roubam tty de entrada? Ou é apenas um problema em uma armadilha de depuração? Eu não me lembro de problemas com stdin regular de entrada / tubulação em comandos.

(Como você também pode ver, existem alguns problemas com a minha função de qualquer maneira - ela usa uma das subshells como uma solução alternativa para que possa rodar em uma versão arcaica do bash (eu estou preso a ela em um sistema legado, mas ainda assim queria uma configuração unificada.) O outro subshell é usado para extrair o comando real ao usar sudo , mas isso falha se o sudo for chamado com opções como sudo -H -u user command . Então considerarei isso como uma oportunidade para corrigir este código ...)

    
por 18.08.2013 / 18:43
2

Essa resposta não explica seu problema específico, mas oferece algumas soluções possíveis que também facilitarão sua vida.

Se você estiver usando ssh apenas para acessar arquivos remotos e não para executar comandos remotos, então você pode montar o sistema de arquivos remoto através de sshfs . Você precisará instalar o FUSE para Mac OS X e SSHFS primeiro. (Eu não sei se existem distribuições binárias para o OSX). Em seguida, execute

mkdir ~/myserver
sshfs myserver:/ ~/myserver

Você precisará autenticar apenas quando executar o comando sshfs . Depois disso, os arquivos remotos estão disponíveis em ~/myserver , então você pode fazer diff ~/myserver/path/to/remote-file local-file sem ter que se preocupar que um dos arquivos seja remoto. Execute fusermount -u ~/myserver para desmontar o sistema de arquivos.

Outra abordagem que permite autenticar uma vez e depois executar muitos comandos ssh é configurar uma conexão mestre. Consulte Reutilizando a sessão ssh para comandos repetidos de rsync

    
por 19.08.2013 / 00:53

Tags