Ssh द्वारा लॉगिन करें, एक कमांड निष्पादित करें और मैं बैश नहीं छोड़ना चाहता


0

मैं PS1 को बदलना चाहता हूं जब मैं एक और सेंट करता हूं

    strshell = 'PS1="remote!"'
    os.system("ssh -i %s -l%s -p%s %s %s"%(SSH_KEY,SSH_USER,SSH_PORT,des,strshell))  

ssh स्वचालित रूप से छोड़ दिया। मैं इस शेल में रहना चाहता हूं। इसे कैसे प्राप्त किया जाए।

मैं ऐसा करने का एक और तरीका बदल देता हूं

 tin = ' sudo -i ; export PS1="Remote! \W :"; exec /bin/bash -i'
 os.system("ssh  -i%s -l%s -p%s %s -t%s" % (SSH_KEY, SSH_USER, SSH_PORT, des, tin))  

लेकिन मैंने अपनी स्थानीय मशीन को बदल दिया रिमोट को नहीं। क्यों?
os.system एक अजगर फ़ंक्शन है


मुझे लगता है कि एक शेल प्राप्त करने के लिए जिसे आप वास्तव में उपयोग कर सकते हैं, आपको उस os.system से टर्मिनल एमुलेटर जैसे कि xterm / gnome-टर्मिनल / टर्मिनेटर को आमंत्रित करने की आवश्यकता होगी, और फिर उसी के भीतर से अपने SSH कमांड को लॉन्च करें। अन्यथा केवल आपके पायथन प्रोग्राम में ही os.system(..ssh..)लॉन्च की गई प्रक्रिया तक पहुंच होगी ।
स्लम

क्या आपने जाँच की है pexpect?
सिंपल_एमई

मैंने उन सभी रिमोट मशीनों के पीएस 1 सेटिंग को बदलकर, जिसे मैं (30+ सर्वर) पर काम कर रहा था, में बदल दिया। इसका मतलब कुछ सेटअप काम है, लेकिन तब आप मशीनों में बस ssh कर सकते हैं ..
daniel kullmann

जवाबों:


3

sudo -iलक्ष्य उपयोगकर्ता के रूप में एक लॉगिन शेल चलाता है। बाकी export PS1...को केवल उस शेल के समाप्त होने के बाद निष्पादित किया जाएगा।

इसके अलावा, आपके ~/.bashrcPS1 को ओवरराइड करने की संभावना है इसे पर्यावरण में पारित करने से संभवतः मदद नहीं मिलेगी।

तुम कोशिश कर सकते हो:

ssh -t host 'sudo env PROMPT_COMMAND="PS1=\"Remote! \W: \"
             unset PROMPT_COMMAND" bash -l'

(यह मानते हुए कि लक्ष्य उपयोगकर्ता ~/.bashrcसेट नहीं करता है $PROMPT_COMMAND)।


हाँ, यह सही है। जब मैं अपनी स्क्रिप्ट चलाता हूं, export PS1...तो समाप्त होने के बाद निष्पादित किया जाएगा। क्यों? क्या आप इसे और अधिक विवरण समझा सकते हैं?
michael_stackof

मैं अभी भी PS1 बदलने के बाद इस रिमोट मशीन से लिंक करना चाहता हूं, थोड़ा उलझन में ...
michael_stackof

0

यह काम करने के लिए प्रकट होता है:

ssh -t localhost "echo '. /dev/fd/2'|sudo bash -sil 2<<\FILE        
PS1='my prompt : '
exec 2>/dev/tty
exec </dev/tty
FILE
"
[sudo] password for mikeserv: 
my prompt : id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(log)
my prompt : 

sudoडिफ़ॉल्ट रूप से सभी फ़ाइल विवरणों को बंद कर देगा, लेकिन 0,1,2 और यह <&0पासवर्ड के लिए एक टर्मिनल पर चाहता है , लेकिन आप अक्सर अपहरण के साथ चुपके कर सकते हैं stderr। और यह अच्छे के लिए नहीं गया है, वैसे भी - व्यावहारिक रूप से पहली चीज जो मैं ऊपर करता हूं, उसे फिर से जोड़ना है ssh। अधिक वास्तविक रूप से आपके पास कुछ वास्तविक स्क्रिप्ट होगी जो आप $(cat file)वहां से गुजरेंगे जैसे कि मेरी $PS1परिभाषा और बाकी है। यह बहुत कष्टप्रद अप्रत्यक्ष है, हालांकि; यह बेहतर होगा कि मुझे लगता है कि इसके बजाय रिमोट प्रोफाइल में उस सामान को संभालना होगा।

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