Sshpass nasıl kullanılır?


28

sshpassJava kodundan SSH üzerinden uzak bir komut başlatmak için kullanmam gerekiyor .

Bir konsolu manuel olarak yazarsam:

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

mükemmel çalışıyor, ancak şifre istiyor. Bu yüzden kaçmayı denedim 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'

ve hiçbiri çalışmıyor.

Yanıtlar:


28

Bu, tarafından yapılan ana bilgisayar anahtar kontrollerinden kaynaklanabilir ssh. sshpassGeçersiz ana bilgisayar tuşlarında sessiz kalıyor (ne hiçbirinde ne stderrde hiçbir çıktı yok stdout) ve durum kodu var gibi görünüyor 6. Bu yazının yapıldığı sırada, bu, revizyon 50 idi ve koddaki eşleşme sabiti, RETURN_HOST_KEY_UNKNOWNbu hataya işaret ediyordu.

Hata kodunuz farklı olabilir ve yukarıdaki bağlantılı koda bakmak size biraz fikir verebilir.

Sorununuz geçersiz bir ana makine anahtarıysa, hatayı CLI seçeneğiyle geçersiz kılmayı iki kez düşünmelisiniz. Makineniz tehlikeye girmiş olabilir veya MITM saldırısına maruz kalabilirsiniz! Durumun böyle olmadığından% 100 eminseniz ve doğrulanmış ana bilgisayar anahtarlarını güncel tutmak için hiçbir yolunuz yoksa, aşağıdaki gibi bir komut kullanabilirsiniz:

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

2
Demlemek kurulum ile, -p sonra bir boşluk gereklidir. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

DİKKAT: Herkes mümkün olduğunda şifresiz SSH Ana Bilgisayar Anahtarlarını kullanmanın daha güvenli olduğunu hatırlamalıdır! Tanım olarak, SSHPass kullanmak daha az güvenlidir.
Soru

@ Soru işareti doğru iken, uzak uç noktanın anahtar yoluyla kimlik doğrulamayı desteklemediği kenar durumları vardır. Hangi sshpass kullanışlı geliyor nerede
exhuma

Evet biliyorum. Bu yüzden "mümkün olduğunda" dedim ...
Questionmark

1
Yeterince yeni SSH ile, var StrictHostKeyChecking=accept-new.
muru

5

sshpasssadece şifre istemi sona erdiğinde çalışır assword:.

Parola isteminiz farklıysa sshpass, isteminizi tanıması için kaynak kodunu ayarlamanız gerekebilir .

Password for user@host:Bazı sistemlerde olduğu gibi şifre uyarıları gördüm , belki de bu senin problemin.


1
üzgünüm? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
Bu yeni seçenek (en az V1.0.6 sshpass'a ihtiyacı var) bu sorunu çözdü.
rjs

Ay pardon. Bu tür bir sorun (çözüm?) Çok sık gerçekleşir, yeni sürümlerde zaten düzeltilmiş olan eski sorular. Teşekkürler.
m3nda

2

Sanırım şöyle bir şey istiyorsun:

sshpass -p yourpassword ssh user@ipaddress somecommand

Örneğin, bu benim için çalışıyor:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Parolasız giriş ayarladınız mı?

OpenSSH ile şifresiz girişler http://www.debian-administration.org/articles/152


Bir işletmede şifresiz giriş yapmanın zorluğundan dolayı sshpass'a bağlı kalmayı tercih ederim
Roman Rdgz

Bunu denedin mi: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

Yaptım, 'mypass' veya mypass kullanmamın bir önemi yok. Sonsuza kadar beklemeye başlar
Roman Rdgz

sshpass -V çalışıyor mu?
koni_raid

Yazdırıyor: "Bu program ücretsiz bir yazılımdır ve GPL koşulları altında dağıtılabilir. Daha fazla bilgi için COPYING dosyasına bakın". Ve sonra yürütmesini sonlandırır ve başka hiçbir şey yapmaz (yalnızca sshpass yazarak değil -S komutunu yazarken -V'yi eklemeye çalıştım)
Roman Rdgz

1

Bunu yapmanın çok yolu var, işte önerdiğim çözüm:

Öncelikle şifrenizi bir değişkende saklamak size daha esnek komutlar vermektir. sshpassbunun için bir seçenek var:

-e: bu seçenek $SSHPASSortam değişkeninden şifreyi okumanıza izin verir

Bu değişkeni ayarlamanın iki yolu vardır:

  1. Doğrudan kodunuzda ayarlayın:

    export SSHPASS='your_pass'
    
  2. Veya bunun için isteyin:

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

Daha sonra emrini yerine getir;

  1. Komutunuz statikse, doğrudan çalıştırın:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Komutunuz dinamik olacaksa, şunun gibi kullanın:

    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'
    

umarım bu birine yardımcı olur.


ReadPassword işlevinizde, yalnızca SSHPASS dışa aktaramaz mısınız?
kutschkem

@kutschkem, güveniyorum ama fikrim burada düşünüyorum; geçiş kartımı statik bir dosyaya yazmak istemiyorum ancak birçok sunucu için tekrar tekrar tekrar yazmak (7+), bir kez yazıyorum :) readPasswordİşlevini kullanmak zorunda değilsiniz , sadece şifrenizi yazabilirsiniz. çalışmalı :) Yalnızca sshpassdinamik komutlar için örnek olarak gösterilen kodumu paylaşmak istiyorum : D
veysiertekin

Hayır, sadece okuduktan sonra değerlendirmenin gerekli olmadığını, ihracatın bir ödev yapması gerekmediğini söylüyorum. ss64.com/bash/export.html
kutschkem

-e ile ilgili sorun şu ki, dışa aktarma geçmişinizde listelenecek
ejaenv 5:18

0

sshpasssözde terminalleri kullanır ve mansayfa zaman zaman kırmak için özür diler. Ayrıca deneyebilirsiniz fd0ssh. stdinUzak makinedeki bir işleme göndermeniz gerekmiyorsa çalışır . Bu sadece bir komut verirseniz ve sonucu alırsanız işe yarar.


0

sshpass sözdizimi

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

-P ile şifre arasında boşluk olmadığına dikkat edin.

Ayrıca, bağlandığınız makinenin RSA anahtarını edinmek için ~/.ssh/known_hostssshpass ile bağlanmanıza izin vermeden önce dosyaya gitmek için ssh ile en az bir kez manuel olarak bağlanmanız gerektiğini fark ettim .

Bu yüzden known_hosts dosyasındaki girişi aldıktan sonra, bunun gibi bir komut çalıştırabilirim.

sshpass -ffilename_with_password_in_it ssh user@server uname -a

ve uname -auzak sunucudaki komutu çalıştıracak ve sonuçları yerel makinedeki standarda gönderecektir.


0

İhtiyacın olan şey -f -t -t -t

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

Ek olarak, uzaktaki makinedeki sudo config (/ etc / sudoers) dizininden "requetty" yi kaldırmanız gerekebilir.


0
  1. anahtar yapmak

    ssh-keygen -t rsa

  2. uzak sunucuda bir .ssh klasörü oluşturun, bu parola ister

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. anahtarı uzak sunucuya kopyala

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


Çalışması gerekip gerekmediğini bir şifre isteyip istemediğini kontrol edin.

ssh $USER@SEVERNAME 'command'

0

@exhuma benim için çalışmasını sağlayan bir örneğe sahipti.

Parola biçiminde olması gerekir -pPassword(boşluksuz)

ayrıca alıntılar gerekli olabilir: sshpass -p'Password&0' user@hostname

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.