Sshpass कैसे उपयोग करें?


28

मुझे sshpassजावा कोड से SSH के माध्यम से रिमोट कमांड लॉन्च करने के लिए उपयोग करने की आवश्यकता है ।

यदि मैं मैन्युअल रूप से कंसोल में टाइप करता हूं:

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

पूरी तरह से काम करता है, लेकिन पासवर्ड के लिए पूछता है। इसलिए मैंने दौड़ने की कोशिश की 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'

और उनमें से कोई भी काम नहीं करता है।

जवाबों:


28

यह मेजबान-कुंजी द्वारा किए गए चेक के कारण हो सकता है ssh। ऐसा लगता है कि sshpassअमान्य होस्ट कुंजी (न तो आउटपुट पर और न stderrही stdout) पर चुप है और स्थिति-कोड के साथ मौजूद है 6। इस लेखन के समय, यह संशोधन 50 था, और कोड में मिलान स्थिर है RETURN_HOST_KEY_UNKNOWN, जो उस त्रुटि को इंगित करता है।

आपका त्रुटि-कोड अलग हो सकता है और ऊपर दिए गए कोड को देखने से आपको कुछ जानकारी मिल सकती है।

यदि आपकी समस्या एक अमान्य होस्ट-कुंजी है, तो आपको सीएलआई विकल्प के साथ त्रुटि को ओवरराइड करने के बारे में दो बार सोचना चाहिए। आपकी मशीन से समझौता किया जा सकता है या आप किसी MITM हमले के अधीन हो सकते हैं! यदि आप 100% निश्चित हैं कि यह मामला नहीं है और यदि आपके पास सत्यापित होस्ट-की-अप रखने की कोई साधन नहीं है, तो आप इस तरह से एक कमांड का उपयोग कर सकते हैं:

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

2
काढ़ा स्थापित करने के साथ -p के बाद एक स्थान की आवश्यकता होती है। github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

सूचना: सभी को यह याद रखना चाहिए कि जब भी संभव हो, बिना पासवर्ड के SSH होस्ट कीज़ का उपयोग करना अधिक सुरक्षित है! परिभाषा के अनुसार, SSHPass का उपयोग करना कम सुरक्षित है।
प्रश्न-पत्र

@Questionmark जबकि यह सच है, ऐसे किनारे-मामले हैं जहां रिमोट एंडपॉइंट कुंजी के माध्यम से प्रमाणीकरण का समर्थन नहीं करता है। वह जगह है जहाँ sshpass काम में आता है
बजे

हाँ मैं जानता हूँ। यही कारण है कि मैंने कहा "जब भी संभव हो" ...
प्रश्न

1
नए पर्याप्त SSH के साथ, वहाँ है StrictHostKeyChecking=accept-new
मुरु

5

sshpassपासवर्ड प्रांप्ट समाप्त होने पर ही काम करता है assword:

यदि आपका पासवर्ड प्रांप्ट अलग है, तो आपको अपने पास sshpassमौजूद प्रॉम्प्ट को पहचानने के लिए सोर्सकोड को समायोजित करना पड़ सकता है।

मैंने Password for user@host:कुछ सिस्टम पर पासवर्ड के संकेत देखे हैं , शायद यह आपकी समस्या है।


1
माफ़ कीजिये? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
यह नया विकल्प (sshpass के कम से कम V1.0.6 की जरूरत है) उस समस्या को हल करता है।
आरजे

मुझे माफ करें। इस तरह का मुद्दा (समाधान?) अक्सर ऐसा होता है, पुराने प्रश्न जो पहले से ही नए संस्करणों में तय किए जाते हैं। धन्यवाद।
एम

2

मुझे लगता है कि आप कुछ चाहते हैं:

sshpass -p yourpassword ssh user@ipaddress somecommand

उदाहरण के लिए, यह मेरे लिए काम करता है:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

क्या आपने पासवर्ड रहित लॉगिन सेटअप किया था?

ओपनएसएसएच http://www.debian-administration.org/articles/152 के साथ पासवर्ड-कम लॉगिन


मैं बल्कि sshpass से चिपके रहना चाहता हूं, क्योंकि एंटरप्राइज में पासवर्ड-कम लॉगिन को सक्षम करने की असुविधाओं के कारण
रोमन Rdgz

क्या आपने यह कोशिश की: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

अगर मैं 'mypass' या mypass का उपयोग करता हूं तो मुझे कोई फर्क नहीं पड़ता। यह हमेशा के लिए इंतजार करना शुरू कर देता है
रोमन Rdgz

sshpass -V काम करता है?
koni_raid

यह प्रिंट करता है: "यह कार्यक्रम मुफ्त सॉफ्टवेयर है, और इसे जीपीएल की शर्तों के तहत वितरित किया जा सकता है। अन्य जानकारी के लिए कॉपी फाइल देखें।" और फिर इसके निष्पादन को समाप्त करता है और कुछ नहीं करता है (मैंने जो-जो कमांड मैं संभाल रहा था उसकी शुरुआत में -V को जोड़ने की कोशिश की, न कि केवल टाइपिंग sshpass -V को)
रोमन Rdgz

1

ऐसा करने का बहुत तरीका है, यहाँ मेरा सुझाया समाधान है:

सबसे पहले, एक चर में अपना पासवर्ड संग्रहीत करना आपको अधिक लचीली कमांड देता है। sshpassउसके लिए एक विकल्प है:

-e: यह विकल्प $SSHPASSपर्यावरण चर से पासवर्ड पढ़ने की अनुमति देता है

इस चर को सेट करने के लिए आपके पास दो तरीके हैं:

  1. अपने कोड में सीधे सेट करें:

    export SSHPASS='your_pass'
    
  2. या इसके लिए पूछें:

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

अपनी आज्ञा पर अमल करो;

  1. यदि आपकी कमांड स्थिर है, तो इसे सीधे चलाएं:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. यदि आपका कमांड इस तरह गतिशील होगा:

    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'
    

आशा है कि यह किसी की मदद करता है।


अपने readPassword फ़ंक्शन में, क्या आप सिर्फ SSHPASS निर्यात नहीं कर सकते?
कुत्स्कम

@kutschem, मुझे भरोसा है लेकिन मेरा विचार है कि मुझे लगता है कि यहाँ; मैं एक स्टैटिक फ़ाइल में अपना पास नहीं लिखना चाहता, लेकिन बहुत सारे सर्वर (7+) के लिए बार-बार पासवर्ड लिखने के बजाय, मैं एक बार लिखता हूं :) आपको readPasswordफ़ंक्शन का उपयोग करने की आवश्यकता नहीं है , आप बस अपना पासवर्ड लिख सकते हैं, यह काम करना चाहिए :) केवल मैं अपना कोड साझा करना चाहता हूं जो sshpassगतिशील आदेशों का उपयोग करके एक उदाहरण दिखाता है : D
veysiertekin

नहीं, मेरा तात्पर्य यह है कि वाचन के बाद eval आवश्यक नहीं है, निर्यात को असाइनमेंट की आवश्यकता नहीं है। ss64.com/bash/export.html
kutschkem

-e के साथ समस्या यह है कि निर्यात आपके इतिहास में सूचीबद्ध होगा
ejaenv

0

sshpassछद्म टर्मिनलों का उपयोग करता है और manपृष्ठ में कभी-कभी तोड़ने के लिए माफी भी शामिल है। आप भी आजमा सकते हैं fd0ssh। यह काम करता है अगर आपको stdinरिमोट मशीन पर एक प्रक्रिया को भेजने की आवश्यकता नहीं है । यह काम करता है अगर आप सिर्फ एक आदेश जारी करते हैं और परिणाम पर कब्जा करते हैं।


0

sshpass सिंटैक्स है

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

ध्यान दें कि -p और पासवर्ड के बीच कोई स्थान नहीं है।

इसके अलावा, मैंने देखा है कि जिस मशीन से आप कनेक्ट कर रहे हैं उसका आरएसए कुंजी प्राप्त करने के लिए आपको ssh से कम से कम एक बार मैन्युअल रूप से कनेक्ट करना होगा, ~/.ssh/known_hostsफ़ाइल को sshpass से पहले कनेक्ट करने की अनुमति देगा।

इसलिए ज्ञात_होस्ट फ़ाइल में प्रविष्टि प्राप्त करने के बाद मैं एक कमांड चला सकता हूं जैसे कि

sshpass -ffilename_with_password_in_it ssh user@server uname -a

और यह uname -aरिमोट सर्वर पर कमांड को निष्पादित करेगा और परिणामों को स्थानीय मशीन पर मानक के रूप में आउटपुट करेगा।


0

आपको क्या चाहिए -f -t -t -t

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

इसके अतिरिक्त आपको रिमोट मशीन पर sudo config (/ etc / sudoers) से "रिक्वायरमेंट" को हटाना पड़ सकता है।


0
  1. एक चाबी बनाओ

    ssh-keygen -t rsa

  2. रिमोट सर्वर पर .ssh फोल्डर बनायें जो यह पासवर्ड मांगेगा

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. दूरस्थ सर्वर के लिए कुंजी की प्रतिलिपि बनाएँ

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


जांचें कि क्या यह पासवर्ड मांगता है, यदि यह काम नहीं करना चाहिए।

ssh $USER@SEVERNAME 'command'

0

@exhuma के पास एक उदाहरण था जो मेरे लिए काम कर रहा था।

पासवर्ड -pPasswordको अंतरिक्ष के बिना () के रूप में होना चाहिए

उद्धरण भी आवश्यक हो सकते हैं: sshpass -p'Password&0' user@hostname

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.