Bagaimana cara menggunakan sshpass?


28

Saya perlu menggunakan sshpassuntuk meluncurkan perintah jarak jauh melalui SSH dari kode Java.

Jika saya secara manual mengetikkan konsol:

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

berfungsi dengan baik, tetapi meminta kata sandi. Jadi saya mencoba berlari 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'

dan tidak ada yang bekerja.

Jawaban:


28

Ini mungkin disebabkan oleh pemeriksaan kunci-host yang dilakukan oleh ssh. Sepertinya sshpasstetap diam pada kunci host yang tidak valid (tidak ada output pada keduanya stderratau tidak stdout) dan ada dengan kode status 6. Pada saat penulisan ini, ini adalah revisi 50, dan konstanta yang cocok dalam kode adalah RETURN_HOST_KEY_UNKNOWN, yang mengisyaratkan kesalahan itu.

Kode kesalahan Anda mungkin berbeda dan melihat kode yang ditautkan di atas dapat memberi Anda wawasan.

Jika masalah Anda adalah kunci-host yang tidak valid, Anda harus berpikir dua kali untuk mengganti kesalahan dengan opsi CLI. Mesin Anda dapat dikompromikan atau Anda mungkin mengalami serangan MITM! Jika Anda 100% yakin bahwa ini bukan masalahnya dan jika Anda tidak memiliki cara untuk menjaga agar kunci host yang diverifikasi tetap mutakhir, Anda dapat menggunakan perintah seperti ini:

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

2
Dengan brew instal, diperlukan ruang setelah -p. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

PEMBERITAHUAN: Semua orang harus ingat bahwa itu lebih aman untuk menggunakan Kunci Host SSH tanpa kata sandi bila memungkinkan! Menurut definisi, menggunakan SSHPass kurang aman.
Questionmark

@ Tanda tanya sementara itu benar, ada kasus tepi di mana titik akhir jarak jauh tidak mendukung otentikasi melalui kunci. Di situlah sshpass berguna
exhuma

Ya saya tahu. Itu sebabnya saya mengatakan "jika memungkinkan" ...
Questionmark

1
Dengan SSH yang cukup baru, ada StrictHostKeyChecking=accept-new.
muru

5

sshpasshanya berfungsi jika prompt kata sandi berakhir assword:.

Jika prompt kata sandi Anda berbeda, Anda mungkin harus menyesuaikan kode sumber sshpassuntuk mengenali prompt yang Anda miliki.

Saya telah melihat permintaan kata sandi seperti Password for user@host:pada beberapa sistem, mungkin ini masalah Anda.


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

2
Opsi baru ini (membutuhkan setidaknya V1.0.6 dari sshpass) menyelesaikan masalah itu.
rjs

Oh maaf. Masalah seperti ini (solusi?) Sering terjadi, pertanyaan lama yang sudah diperbaiki pada versi baru. Terima kasih.
m3nda

2

Saya pikir Anda menginginkan sesuatu seperti:

sshpass -p yourpassword ssh user@ipaddress somecommand

Misalnya, ini berfungsi untuk saya:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Apakah Anda mengatur login tanpa kata sandi?

Login tanpa password dengan OpenSSH http://www.debian-administration.org/articles/152


Saya lebih suka berpegang pada sshpass, karena ketidaknyamanan mengaktifkan login tanpa kata sandi di suatu perusahaan
Roman Rdgz

Apakah Anda mencoba ini: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

Saya lakukan, tidak masalah jika saya menggunakan 'mypass' atau mypass. Itu mulai menunggu selamanya
Roman Rdgz

sshpass -V berfungsi?
koni_raid

Mencetak: "Program ini adalah perangkat lunak gratis, dan dapat didistribusikan di bawah ketentuan GPL. Lihat file COPYING untuk informasi lebih lanjut". Dan kemudian mengakhiri pelaksanaannya dan tidak melakukan apa-apa lagi (saya mencoba menambahkan -V ke awal perintah yang saya tangani, tidak hanya mengetikkan sshpass -V)
Roman Rdgz

1

Ada banyak cara untuk melakukan itu, inilah solusi yang saya sarankan:

Pertama-tama, menyimpan kata sandi Anda dalam suatu variabel adalah memberi Anda perintah yang lebih fleksibel. sshpassmemiliki opsi untuk itu:

-e: opsi ini memungkinkan untuk membaca kata sandi dari $SSHPASSvariabel lingkungan

Anda memiliki dua cara untuk mengatur variabel ini:

  1. Ditetapkan langsung dalam kode Anda:

    export SSHPASS='your_pass'
    
  2. Atau tanyakan:

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

Daripada menjalankan perintah Anda;

  1. Jika perintah Anda statis, jalankan langsung:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Jika perintah Anda akan digunakan dinamis seperti ini:

    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'
    

Semoga ini bisa membantu seseorang.


Dalam fungsi readPassword Anda, tidak bisakah Anda melakukan ekspor SSHPASS saja?
kutschkem

@kutschkem, saya percaya tapi ide saya yang saya pikirkan di sini; saya tidak ingin menulis pass saya dalam file statis tetapi alih-alih menulis kata sandi lagi dan lagi untuk banyak server (7+), saya menulis sekali :) Anda tidak harus menggunakan readPasswordfungsi, Anda hanya dapat menulis kata sandi Anda, itu harus bekerja :) Hanya saya ingin berbagi kode saya yang menunjukkan contoh menggunakan sshpassuntuk perintah dinamis: D
veysiertekin

Tidak, saya hanya bermaksud bahwa eval tidak diperlukan setelah dibaca, ekspor tidak perlu tugas. ss64.com/bash/export.html
kutschkem

masalahnya dengan -e adalah bahwa ekspor akan terdaftar dalam sejarah Anda
ejaenv

0

sshpassmenggunakan terminal pseudo dan manhalaman tersebut menyertakan permintaan maaf karena melanggar sesekali. Anda juga bisa mencoba fd0ssh. Ini berfungsi jika Anda tidak perlu mengirim stdinke proses pada mesin jarak jauh. Itu bekerja jika Anda hanya mengeluarkan perintah dan menangkap hasilnya.


0

Sintaks sshpass adalah

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

Perhatikan bahwa tidak ada ruang antara -p dan kata sandi.

Juga saya perhatikan bahwa Anda harus terhubung dengan ssh setidaknya sekali secara manual untuk mendapatkan kunci RSA dari mesin yang Anda sambungkan, untuk masuk ke ~/.ssh/known_hostsfile sebelum sshpass akan memungkinkan Anda untuk terhubung.

jadi setelah mendapatkan entri dalam file known_hosts saya bisa menjalankan perintah seperti

sshpass -ffilename_with_password_in_it ssh user@server uname -a

dan itu akan mengeksekusi perintah uname -apada server jauh dan output hasilnya ke standar di mesin lokal.


0

Yang Anda butuhkan adalah -f -t -t -t

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

Selain itu Anda mungkin harus menghapus "Requiretty" dari sudo config (/ etc / sudoers) pada mesin remote.


0
  1. buat kunci

    ssh-keygen -t rsa

  2. membuat folder .ssh di server jauh itu akan meminta kata sandi

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. salin kunci ke server jarak jauh

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


Periksa apakah itu meminta kata sandi, jika tidak itu harus berfungsi.

ssh $USER@SEVERNAME 'command'

0

@ Exuma memiliki contoh yang membuatnya bekerja untuk saya.

Kata sandi harus dalam bentuk -pPassword(tanpa spasi)

mungkin juga diperlukan kutipan: sshpass -p'Password&0' user@hostname

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.