Jak korzystać z sshpass?


28

Muszę użyć sshpassdo uruchomienia polecenia zdalnego za pośrednictwem SSH z kodu Java.

Jeśli ręcznie wpiszę w konsoli:

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

działa idealnie, ale prosi o hasło. Więc próbowałem uruchomić 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'

i żaden z nich nie działa.

Odpowiedzi:


28

Może to być spowodowane sprawdzeniem klucza hosta przez ssh. Wygląda na to, sshpassże milczy na niepoprawnych kluczach hosta (brak danych wyjściowych stderrani na stdout), i istnieje z kodem statusu 6. W momencie pisania tego tekstu była to wersja 50, a stała dopasowania w kodzie to RETURN_HOST_KEY_UNKNOWN, co wskazuje na ten błąd.

Twój kod błędu może się różnić, a zapoznanie się z powyższym kodem może dać ci wgląd.

Jeśli Twoim problemem jest nieprawidłowy klucz hosta, powinieneś dwa razy pomyśleć o zastąpieniu błędu opcją CLI. Twoja maszyna może być zagrożona lub możesz zostać zaatakowany przez MITM! Jeśli masz 100% pewności, że tak nie jest i jeśli nie masz środków na aktualizowanie zweryfikowanych kluczy hosta, możesz użyć następującego polecenia:

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

2
W przypadku instalacji parzenia po -p potrzebne jest miejsce. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

UWAGA: Każdy powinien pamiętać, że bezpieczniej jest używać kluczy hosta SSH bez hasła, gdy tylko jest to możliwe! Z definicji użycie SSHPass jest mniej bezpieczne.
Znak zapytania

@Questionmark, chociaż jest to prawda, istnieją przypadki skrajne, w których zdalny punkt końcowy nie obsługuje uwierzytelniania za pomocą klucza. Przydaje się
sshpass

Tak, wiem. Dlatego powiedziałem „kiedykolwiek to możliwe” ...
zapytania

1
Jest wystarczająco dużo nowych SSH StrictHostKeyChecking=accept-new.
muru

5

sshpassdziała tylko wtedy, gdy pytanie o hasło kończy się na assword:.

Jeśli monit o hasło jest inny, konieczne może być dostosowanie kodu źródłowego, sshpassaby rozpoznać monit.

Widziałem monity o hasło, jak Password for user@host:w niektórych systemach, może to jest twój problem.


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

2
Ta nowa opcja (wymaga co najmniej wersji 1.0.6 sshpass) rozwiązuje ten problem.
rjs

Przepraszam. Tego rodzaju problem (rozwiązanie?) Zdarza się tak często, stare pytania, które zostały już naprawione w nowych wersjach. Dzięki.
m3nda

2

Myślę, że chcesz czegoś takiego:

sshpass -p yourpassword ssh user@ipaddress somecommand

Na przykład to działa dla mnie:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Czy skonfigurowałeś logowanie bez hasła?

Logowanie bez hasła za pomocą OpenSSH http://www.debian-administration.org/articles/152


Wolę trzymać się sshpass, ze względu na niedogodności związane z włączaniem logowania bez hasła w przedsiębiorstwie
Roman Rdgz

Czy próbowałeś tego: sshpass -p 'mypass' ssh nazwa_użytkownika@server.example.com
koni_raid

Zrobiłem, nie ma znaczenia, czy użyję „mypass” czy mypass. Zaczyna czekać wiecznie
Roman Rdgz

sshpass -V działa?
koni_raid

Drukuje: „Ten program jest wolnym oprogramowaniem i może być dystrybuowany na warunkach GPL. Aby uzyskać więcej informacji, zobacz plik KOPIOWANIE”. A potem kończy się jego wykonywanie i nie robi nic innego (próbowałem dodać -V na początku polecenia, które obsługiwałem, nie tylko wpisując sshpass -V)
Roman Rdgz

1

Jest na to wiele sposobów, oto moje sugerowane rozwiązanie:

Po pierwsze, przechowywanie hasła w zmiennej daje bardziej elastyczne polecenia. sshpassma na to opcję:

-e: ta opcja pozwala odczytać hasło z $SSHPASS zmiennej środowiskowej

Istnieją dwa sposoby ustawienia tej zmiennej:

  1. Ustaw bezpośrednio w kodzie:

    export SSHPASS='your_pass'
    
  2. Lub poproś o to:

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

Niż wykonajcie rozkaz;

  1. Jeśli twoje polecenie jest statyczne, uruchom je bezpośrednio:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Jeśli twoje polecenie będzie dynamiczne, użyj następującego:

    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'
    

mam nadzieję, że to komuś pomoże.


Czy w funkcji readPassword nie można po prostu wyeksportować SSHPASS?
kutschkem

@kutschkem, ufam, ale mój pomysł, że myślę tutaj; nie chcę zapisywać przepustki w pliku statycznym, ale zamiast pisać hasło wielokrotnie dla wielu serwerów (7+), piszę raz :) Nie musisz używać readPasswordfunkcji, możesz po prostu wpisać swoje hasło, to powinien działać :) Tylko chcę udostępnić mój kod, który pokazuje przykład przy użyciu sshpasspoleceń dynamicznych: D
veysiertekin

Nie, chodzi mi tylko o to, że ewaluacja nie jest konieczna po przeczytaniu, eksport nie wymaga przypisania. ss64.com/bash/export.html
kutschkem

problem z -e polega na tym, że eksport zostanie wymieniony w twojej historii
ejaenv

0

sshpassużywa pseudo terminali, a manstrona zawiera przeprosiny za okazjonalne złamanie. Możesz także spróbować fd0ssh. Działa, jeśli nie musisz wysyłać stdindo procesu na zdalnym komputerze. Działa to, jeśli po prostu wydasz polecenie i przechwycisz wynik.


0

Składnia sshpass to

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

Zauważ, że nie ma spacji między -p a hasłem.

Zauważyłem również, że musisz połączyć się z ssh przynajmniej raz ręcznie, aby uzyskać klucz RSA komputera, z którym się łączysz, aby przejść do ~/.ssh/known_hostspliku, zanim sshpass pozwoli ci się połączyć.

więc po uzyskaniu wpisu w pliku znane_hosty mogę uruchomić polecenie takie jak

sshpass -ffilename_with_password_in_it ssh user@server uname -a

i wykona polecenie uname -ana zdalnym serwerze i wyśle wyniki do standardowego wyjścia na komputerze lokalnym.


0

Potrzebujesz tego -f -t -t -t

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

Dodatkowo może być konieczne usunięcie „Requtty” z konfiguracji sudo (/ etc / sudoers) na zdalnym komputerze.


0
  1. zrób klucz

    ssh-keygen -t rsa

  2. utwórz folder .ssh na zdalnym serwerze, aby poprosił o hasło

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. skopiuj klucz do zdalnego serwera

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


Sprawdź, czy prosi o hasło, jeśli nie, powinno działać.

ssh $USER@SEVERNAME 'command'

0

@exhuma ma przykład, który doprowadził do tego, że działa dla mnie.

Hasło musi mieć postać -pPassword(bez spacji)

konieczne mogą być również cytaty: sshpass -p'Password&0' user@hostname

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.