Ssh, लॉगिन पर एक कमांड चलाएं, और फिर लॉग इन रहें?


29

मैंने उम्मीद के साथ यह कोशिश की, लेकिन यह काम नहीं किया: यह अंत में कनेक्शन बंद कर दिया।

क्या हम ssh के माध्यम से एक स्क्रिप्ट चला सकते हैं जो दूरस्थ मशीनों में लॉग इन करेगा, एक कमांड चलाएगा, और डिस्कनेक्ट नहीं होगा?

तो एक मशीन में ssh, इस तरह के और इस तरह के एक निर्देशिका के लिए सीडी, और फिर एक कमांड चलाते हैं, और लॉग इन रहें।

-Jonathan

(मुझे उम्मीद थी)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
क्या यह सिर्फ मैं हूं या आप इस तरह से पासवर्ड प्रमाणीकरण को "स्वचालित" कर रहे हैं, बजाय पबियों या अन्य साने विधि का उपयोग करने के?
२०१

जवाबों:


25

; /bin/bashरिमोट कमांड पर अपनी कमांड लाइन के अंत में एक जोड़ें ? अर्थात्:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

इससे भी बेहतर, रूट की .bashrc को कुछ इस तरह बदलें:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
आप -iउस बैश में जोड़ना चाह सकते हैं ।
टेडी

हां, मुझे लगता है :)
बिल वीस

जब मैं ऐसा करता हूं, टैब शेल नए शेल में टूट जाता है ("-i" के साथ भी) - कोई भी विचार क्यों / कैसे ठीक करना है?
कोडर

1
मैंने यहां अपने नए उत्तर का परीक्षण किया, यह बहुत अच्छा काम करता है। थोड़ा मोटा, लेकिन यह काम करता है।
बिल वेइस

7
ssh -tएक पाई आवंटित करने का प्रयास करें ।
अगली सूचना तक रोक दिया गया।

4

यदि आप पायथन में ऐसा करने के साथ ठीक हैं, तो pexpect का एक उदाहरण है जो लगभग वही करता है जो आप पूछ रहे हैं:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

एफ़टीपी के बजाय ssh के साथ ऐसा करने के लिए, आप निम्न के समान कोड चाहते हैं (उदाहरण pexpect में फ़ाइल में अधिक विवरण और जानकारी है, लेकिन यहां मूल बातें हैं):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

मुझे गलत मत समझो, मैं उम्मीद करता हूं (विशेष रूप से ऑटोफ़ेक्ट), लेकिन अजगर सिर्फ मेरे लिए बहुत आसान है जो मुझे करना है।


मैं भी pexpect की उम्मीद से संक्रमण कर रहा हूँ। अजगर अब बहुत अधिक सर्वव्यापी है।
जेएम बेकर

4

सर्वर में ssh करने के लिए संभवतः सबसे आसान और सबसे साफ तरीका है, एक इंटरेक्टिव शेल को स्पॉन करें और उस शेल के अंदर कमांड रन करें जो bash के लिए एक कस्टम आरसी फाइल बनाना है।

सर्वर पर आपके कस्टम बैश आर्क फ़ाइल में, पहले डिफ़ॉल्ट फ़ाइल को स्रोत करें और फिर अपने कस्टम कमांड्स जोड़ें, उदा

~ / .Bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

इसके बाद आप अपना SSH सत्र शुरू कर सकते हैं:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

-tविकल्प बलों एक छद्म tty आवंटन, तो टैब-पूरा होने के काम की तरह है कि चीजें।

--rcfileविकल्प निर्दिष्ट करता है जो rcfile बजाय डिफ़ॉल्ट एक के लोड करने के लिए। महत्वपूर्ण: आपको पहचाने जाने के लिए एकल-वर्ण विकल्पों से पहले कमांड लाइन पर "डबल-डैश तर्क" रखना चाहिए।

-i/ Bin / bash करने के लिए तर्क एक इंटरैक्टिव खोल वहाँ आह्वान करने के लिए है।


असल में नहीं। यदि मैं प्रत्येक कनेक्शन के लिए अलग-अलग कमांड चलाना चाहता हूं तो मुझे क्या करना चाहिए?
यूजेन कोनकोव

1

अगर किसी को पृष्ठभूमि में क्या हो रहा है, इस बारे में जानकारी चाहिए, तो आपको sshd मैनुअल को देखना चाहिए:

जब कोई उपयोगकर्ता सफलतापूर्वक लॉग इन करता है, sshd निम्न कार्य करता है:

  1. यदि लॉगिन एक ट्टी पर है, और कोई कमांड निर्दिष्ट नहीं किया गया है, तो अंतिम लॉगिन समय और / etc / motd प्रिंट करता है (जब तक कि कॉन्फ़िगरेशन फ़ाइल में या ~ / .hushlogin द्वारा रोका नहीं जाता है; FILES अनुभाग देखें)।
  2. यदि लॉगिन ट्टी पर है, तो लॉगिन समय रिकॉर्ड करता है।
  3. चेक / etc / nologin और / var / run / nologin; यदि कोई मौजूद है, तो यह सामग्री को प्रिंट करता है और क्विट करता है (जब तक कि रूट नहीं)।
  4. सामान्य उपयोगकर्ता विशेषाधिकारों के साथ चलने के लिए परिवर्तन।
  5. बुनियादी वातावरण तैयार करता है।
  6. फ़ाइल को पढ़ता है ~ / .ssh / पर्यावरण, अगर यह मौजूद है, और उपयोगकर्ताओं को अपने वातावरण को बदलने की अनुमति है। Sshd_config (5) में PermitUserEnvironment का विकल्प देखें।
  7. उपयोगकर्ता की होम निर्देशिका में परिवर्तन।
  8. यदि ~ / .ssh / rc मौजूद है, तो इसे चलाता है; और अगर / etc / ssh / sshrc मौजूद है, तो इसे चलाता है; अन्यथा xauth (1) चलाता है। `` आरसी '' फ़ाइलों को मानक इनपुट में एक्स 11 प्रमाणीकरण प्रोटोकॉल और कुकी दिया जाता है। नीचे SSHRC देखें।
  9. उपयोगकर्ता के शेल या कमांड चलाता है ।

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

आप आम तौर पर इस तरह से ssh का उपयोग करने से बचना चाहिए क्योंकि यह पराजित होता है।
ए करें

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

यह देखने के लिए कि क्या आपकी कुंजी ssh सक्रिय सत्र पूल में सूचीबद्ध है या फिर इसे स्वयं (ssh-add के साथ) जोड़ें।

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