Como usar o sshpass?

22

Eu preciso usar sshpass para ativar um comando remoto por meio do SSH a partir de um código Java.

Se eu digitar manualmente em um console:

ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'

funciona perfeitamente, mas pede senha. Então, tentei executar sshpass :

sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'

e nenhum deles funciona.

    
por Roman Rdgz 17.04.2013 / 10:43

10 respostas

23

Isso pode ser causado pelas verificações de chave do host feitas por ssh . Parece que sshpass mantém silêncio em chaves de host inválidas (sem saída nem em stderr nem stdout ) e existe com o código de status 6 . No momento da redação deste artigo, esta era a revisão 50, e a constante correspondente no código é RETURN_HOST_KEY_UNKNOWN , o que sugere esse erro.

Seu código de erro pode ser diferente e, olhando para o código vinculado acima, você pode ter algumas dicas.

Se seu problema for uma chave de host inválida, você deve pensar duas vezes antes de substituir o erro por uma opção de CLI. Sua máquina pode estar comprometida ou você pode estar sujeito a um ataque MITM! Se você está 100% certo de que este não é o caso e se você não tem meios de manter as chaves de host verificadas até data, você pode usar um comando como este:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
    
por exhuma 04.12.2013 / 10:23
4

sshpass só funciona se o prompt da senha terminar em assword: .

Se o seu prompt de senha for diferente, talvez seja necessário ajustar o código fonte de sshpass para reconhecer o prompt que você tem.

Eu tenho visto prompts de senha como Password for user@host: em alguns sistemas, talvez isso seja problema seu.

    
por rjs 14.07.2014 / 13:45
1

Há muita maneira de fazer isso, aqui está minha solução sugerida:

Antes de mais nada, armazenar sua senha em uma variável fornece comandos mais flexíveis. sshpass tem uma opção para isso:

-e : esta opção permite ler a senha da variável de ambiente $SSHPASS

Você tem duas maneiras de definir essa variável:

  1. Defina diretamente no seu código:

    export SSHPASS='your_pass'
    
  2. Ou peça:

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

De executar seu comando;

  1. Se o seu comando for estático, execute-o diretamente:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Se o seu comando for dinâmico, use assim:

    DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
    
    eval 'sshpass -e ssh user@host << EOF
    mplayer "$DYN_FILE_LOC"
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF'
    

espero que isso ajude alguém.

    
por veysiertekin 27.03.2015 / 14:59
1

Eu acho que você quer algo como:

sshpass -p yourpassword ssh user@ipaddress somecommand

Por exemplo, isso funciona para mim:

sshpass -p mypassword ssh [email protected] touch foo
    
por benofben 07.02.2016 / 07:27
0

Você configurou o login sem senha?

Logins sem senha com o OpenSSH link

    
por konrad 17.04.2013 / 10:52
0

sshpass usa pseudo terminais e a página man inclui desculpas por quebrar ocasionalmente. Você também pode tentar fd0ssh . Funciona se você não precisar enviar stdin para um processo na máquina remota. Isso funciona se você simplesmente emitir um comando e capturar o resultado.

    
por Bruce 26.07.2013 / 17:44
0

A sintaxe sshpass é

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

Note que não há espaço entre o -p e a senha.

Também notei que você precisa se conectar com o ssh pelo menos uma vez manualmente para obter a chave RSA da máquina à qual está se conectando, para entrar no arquivo ~/.ssh/known_hosts antes que o sshpass permita a conexão.

então depois de obter a entrada no arquivo known_hosts eu posso rodar um comando como

sshpass -ffilename_with_password_in_it ssh user@server uname -a

e executará o comando uname -a no servidor remoto e emitirá os resultados para a saída padrão na máquina local.

    
por BeowulfNode42 15.05.2014 / 08:16
0

O que você precisa é de -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

Além disso, você pode ter que remover "requiretty" da configuração do sudo (/ etc / sudoers) na máquina remota.

    
por Ehsan 26.05.2014 / 21:27
0
  1. faça uma chave

    ssh-keygen -t rsa

  2. crie uma pasta .ssh no servidor remoto, ele pedirá uma senha

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. copie a chave para o servidor remoto

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'

Verifique se ele pede uma senha, caso contrário, deve funcionar.

ssh $USER@SEVERNAME 'command'
    
por VeggieVampire 08.06.2015 / 13:48
0

@exhuma tinha um exemplo que me ajudou a trabalhar para mim.

A senha precisa estar no formato -pPassword (sem espaço)

também citações podem ser necessárias: sshpass -p'Password&0' user@hostname

    
por user3367115 29.09.2015 / 01:52