Come usare sshpass?


28

Devo usare sshpassper avviare un comando remoto tramite SSH da un codice Java.

Se scrivo manualmente una console:

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

funziona perfettamente, ma richiede la password. Quindi ho provato a correre 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 nessuno di loro funziona.

Risposte:


28

Ciò può essere causato dai controlli della chiave host eseguiti da ssh. Sembra che sshpasstace sulle chiavi host non valide (nessuna uscita sul nè stderrstdout) ed esiste con lo stato-code 6. Al momento della stesura di questo articolo, si trattava della revisione 50 e la costante corrispondente nel codice è RETURN_HOST_KEY_UNKNOWN, che suggerisce questo errore.

Il tuo codice di errore può essere diverso e guardare il codice sopra linkato può darti un'idea.

Se il tuo problema è una chiave host non valida, dovresti pensarci due volte sulla sostituzione dell'errore con un'opzione CLI. La tua macchina potrebbe essere compromessa o potresti essere soggetto ad un attacco MITM! Se sei sicuro al 100% che non è così e se non hai i mezzi per mantenere aggiornate le chiavi host verificate, puoi usare un comando come questo:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

2
Con l'installazione brew, dopo -p è necessario uno spazio. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

AVVISO: tutti dovrebbero ricordare che è più sicuro usare chiavi host SSH senza password ogni volta che è possibile! Per definizione, l'utilizzo di SSHPass è meno sicuro.
Punto interrogativo

@Questionmark mentre ciò è vero, ci sono casi limite in cui l'endpoint remoto non supporta l'autenticazione tramite chiave. Ecco dove sshpass è utile
exhuma l'

Si, lo so. Ecco perché ho detto "ogni volta che è possibile" ...
Questionmark

1
Con abbastanza nuovo SSH, c'è StrictHostKeyChecking=accept-new.
muru,

5

sshpassfunziona solo se termina la richiesta della password assword:.

Se la richiesta della password è diversa, potrebbe essere necessario modificare il codice sorgente sshpassper riconoscere la richiesta.

Ho visto le richieste di password come Password for user@host:su alcuni sistemi, forse questo è il tuo problema.


1
spiacente? -P prompt Which string should sshpass search for to detect a password prompt
m3nda,

2
Questa nuova opzione (richiede almeno V1.0.6 di sshpass) risolve il problema.
rjs,

Oh scusa. Questo tipo di problema (soluzione?) Si verifica così spesso, vecchie domande che sono già state risolte in nuove versioni. Grazie.
m3nda,

2

Penso che tu voglia qualcosa come:

sshpass -p yourpassword ssh user@ipaddress somecommand

Ad esempio, questo funziona per me:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Hai configurato l'accesso senza password?

Accessi senza password con OpenSSH http://www.debian-administration.org/articles/152


Preferirei attenermi a sshpass, a causa degli inconvenienti di abilitare l'accesso senza password in un'azienda
Roman Rdgz

Hai provato questo: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

L'ho fatto, non importa se uso "mypass" o mypass. Inizia ad aspettare per sempre
Roman Rdgz,

sshpass -V funziona?
koni_raid

Stampa: "Questo programma è un software gratuito e può essere distribuito secondo i termini della GPL. Vedere il file COPYING per ulteriori informazioni". E poi termina la sua esecuzione e non fa nient'altro (ho provato ad aggiungere -V all'inizio del comando che stavo gestendo, non solo digitando sshpass -V)
Roman Rdgz

1

Esistono molti modi per farlo, ecco la mia soluzione suggerita:

Prima di tutto, memorizzare la tua password in una variabile ti dà comandi più flessibili. sshpassha un'opzione per questo:

-e: questa opzione consente di leggere la password dalla $SSHPASSvariabile di ambiente

Hai due modi per impostare questa variabile:

  1. Imposta direttamente nel tuo codice:

    export SSHPASS='your_pass'
    
  2. Oppure richiedilo:

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

Di eseguire il tuo comando;

  1. Se il tuo comando è statico, eseguilo direttamente:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Se il tuo comando sarà dinamico, usa in questo modo:

    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'
    

spero che questo aiuti qualcuno.


Nella tua funzione readPassword, non puoi semplicemente esportare SSHPASS?
Kutschkem,

@kutschkem, mi fido, ma la mia idea che penso qui; non voglio scrivere il mio pass in un file statico ma invece di scrivere più e più volte password per molti server (7+), scrivo una volta :) Non devi usare la readPasswordfunzione, puoi semplicemente scrivere la tua password, essa dovrebbe funzionare :) Voglio solo condividere il mio codice che mostra un esempio usando sshpassi comandi dinamici: D
veysiertekin,

No, intendo solo che l'eval non è necessario dopo la lettura, l'esportazione non ha bisogno di un compito. ss64.com/bash/export.html
kutschkem

il problema con -e è che l'esportazione sarà elencata nella tua storia
ejaenv

0

sshpassutilizza pseudo terminali e la manpagina include scuse per la rottura di tanto in tanto. Puoi anche provare fd0ssh. Funziona se non è necessario inviare stdina un processo sul computer remoto. Funziona se si emette un comando e si acquisisce il risultato.


0

La sintassi di sshpass è

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

Nota che non c'è spazio tra -p e la password.

Inoltre ho notato che devi connetterti con ssh almeno una volta manualmente per ottenere la chiave RSA della macchina a cui ti stai connettendo, per entrare nel ~/.ssh/known_hosts file prima che sshpass ti permetta di connetterti.

così dopo aver ottenuto la voce nel file known_hosts posso eseguire un comando come

sshpass -ffilename_with_password_in_it ssh user@server uname -a

e eseguirà il comando uname -asul server remoto e produrrà i risultati allo standard fuori sul computer locale.


0

Quello di cui hai bisogno è -f -t -t -t

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

Inoltre, potrebbe essere necessario rimuovere "requiretty" da sudo config (/ etc / sudoers) sul computer remoto.


0
  1. fare una chiave

    ssh-keygen -t rsa

  2. crea una cartella .ssh sul server remoto chiederà una password

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. copia la chiave sul server remoto

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


Controlla se richiede una password, altrimenti dovrebbe funzionare.

ssh $USER@SEVERNAME 'command'

0

@exhuma ha avuto un esempio che lo ha portato a lavorare per me.

La password deve essere in forma di -pPassword(senza spazio)

anche le citazioni possono essere necessarie: sshpass -p'Password&0' user@hostname

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.