एक विशिष्ट शेल का उपयोग करने के लिए SSH को बाध्य करें


29

क्या एसएसएच को किसी विशेष शेल का उपयोग करने के लिए रिमोट एंड पर मजबूर करने का कोई तरीका है, भले ही उपयोगकर्ता का डिफ़ॉल्ट शेल क्या है?

मैंने हल करने की कोशिश की है:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

लेकिन दुर्भाग्य से दूरस्थ अंत पर डिफ़ॉल्ट शेल "जटिल, मल्टी-लाइन कमांड" भाग को पार्स करने के लिए जिम्मेदार है, और मुझे बैश और सी शेल उपयोगकर्ताओं दोनों के लिए काम करने के लिए इसे पर्याप्त रूप से भागने में कठिनाई हो रही है।


जवाबों:


8

मुझे विश्वास नहीं है कि यह संभव है, कम से कम ओपनशेड-आधारित सिस्टम के साथ। यदि आपके पास क्षमता है, तो एक बेहतर समाधान शेल-स्क्रिप्ट फ़ाइल को sftp करना हो सकता है, और फिर आपके द्वारा पोस्ट की गई विधि के साथ इसे निष्पादित कर सकता है। इससे आवश्यक बच निकलने की मात्रा को कम करने का लाभ होगा, लेकिन इसके पीछे एक फ़ाइल छोड़नी होगी जिसे हटाना होगा (शायद स्क्रिप्ट के अंतिम चरण के रूप में)।


1
यह वही है जो मैंने अंततः किया, लेकिन एससीपी का उपयोग करके। एक महान विचार।
प्लिहान

16

एक वंशानुगत का उपयोग करें:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

क्या आपको स्टड से कमांड पढ़ने के लिए बैश के लिए "-s" का उपयोग नहीं करना चाहिए?
Weboide

यह हमेशा आवश्यक नहीं है।
इग्नासियो वाज़क्वेज़-अब्राम्स

अगर मैं कर सकता हूं तो मैं इसे नीचे वोट करूंगा क्योंकि यह आदेशों को स्टडिन तक पहुंचने से रोकता है और सवाल एक विशेष शेल को लागू करने के बारे में था।
एरिक वुड्रूफ़

3
@ EricWoodruff, ... एक विशेष शेल (इस मामले में बैश) को लागू करना वास्तव में यही दर्शाता है कि यह कैसे करना है।
चार्ल्स डफी

1
FYI करें आप भी कर सकते हैं cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash। इसलिए एक कदम के बजाय आपके पास दो चरण हैं: चरण 1 अपनी स्क्रिप्ट को फ़ाइल में कॉपी करें, चरण 2 catको स्क्रिप्ट पर ssh
ट्रेवर बॉयड स्मिथ

10

पासवर्ड-आधारित नहीं, कुंजी-आधारित लॉगिन का उपयोग करें। फिर आप अपनी सार्वजनिक ssh कुंजी ( SSH1 के मामले में "विकल्प" फ़ील्ड में ) "मजबूर कमांड (s)" की सूची जोड़ सकते हैं जो SSH1 पर सर्वर ( ~ / .ssh / अधिकृत_keys फ़ाइल ) में स्थापित है। , ~ /। ssh2 / SSH2 के लिए प्राधिकरण )।

अपनी मजबूर कमांड बनाएं ताकि आपके वांछित शेल को कहा जाए ...

अधिक: आप किसी दिए गए कुंजी के लिए एक मजबूर कमांड पर जोड़ सकते हैं। यदि आपको अलग-अलग उद्देश्यों के लिए कई मजबूर कमांड की आवश्यकता होती है, तो आपको अलग-अलग कुंजी सेट करना होगा। (बेशक आप एक स्क्रिप्ट में कई चीजें रख सकते हैं, जिसे आप मजबूर कमांड के माध्यम से कहते हैं। लेकिन ध्यान रखें कि मजबूर कमांड हमेशा किसी दिए गए खाते / कुंजी के लिए चलाया जाता है यदि उपयोगकर्ता लॉग इन करता है, भले ही वह कुछ अलग चलाने के लिए कहे। यदि आप अभी भी मूल आदेश का सम्मान करना चाहते हैं, तो $SSH_ORIGINAL_COMMANDचर का फायदा उठाने के तरीके पर एक नज़र डालें ...)

Google के माध्यम से "मजबूर कमांड" के बारे में पढ़ें ।


अच्छी चीज़। ओ'रेली पृष्ठ पर वह ग्राफिक बहुत अच्छा है। मेरे विशेष मामले में, हालांकि, मैं किसी भी उपयोगकर्ता के लिए इसे लागू करने में सक्षम होना चाहता हूं, न कि केवल उन उपयोगकर्ताओं के लिए जिन्होंने अपनी चाबियाँ सही तरीके से सेट की हैं। मेरे पास सर्वर मशीनों पर रूट नहीं है, इसलिए मैं फ़ाइलों को संपादित नहीं कर सकता /etc/sshrc
३० बजे प्लिहान

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

यदि ग्राहक मनमाना कमांड चला सकता है तो क्लाइंट एक कमांड के रूप में भी एक मनमाना शेल चला सकता है।
एरिक वुड्रूफ़

@ कर्टपाइफल जो ओ'रिली से जुड़ा हुआ है, वह टूटा है
ब्रायन

@BrianVandenberg: संकेत के लिए Thx। मैंने अब उस लिंक को हटा दिया।
कर्ट फ़िफ़ेल

2

-tजिस प्रोग्राम को आप शुरू करना चाहते हैं, उसके लिए आप छद्म ट्टी के आवंटन को बाध्य करने के विकल्प का उपयोग कर सकते हैं , जैसे कि आप मानक शेल को निष्पादित कर रहे थे। फिर उस शेल को पास करें जिसे आप एक पुराने पुराने तर्क के रूप में चाहते हैं।

इस तकनीक के साथ आप न केवल स्थापित किए गए किसी भी शेल का उपयोग कर सकते हैं, बल्कि आप वीआईएम और अन्य प्रोग्राम भी खोल सकते हैं, जिन्हें एक कमांड से TTY की आवश्यकता होती है। यदि आप एक शेल स्क्रिप्ट लिख रहे हैं जो शांत है, जो आपको कहीं और लॉग इन करता है और विम, या htop या कुछ पर एक फ़ाइल खोलता है।

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

यह सुनिश्चित नहीं है कि यह एक लॉगिन शेल है लेकिन लॉगिन शेल की तरह बैश एक्ट बनाने के विकल्प हैं, इसलिए आपके शेल में भी ऐसा हो सकता है।


1

आश्चर्यजनक रूप से मुझे निम्नलिखित के साथ अलग-अलग परिणाम दिखाई दे रहे हैं:

पानी में बहना:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

बनाम बैश:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

पूरी तरह से उद्धृत कमांड दिखा रहा है कि यह अपेक्षित है।


1
आश्चर्य की बात नहीं है। दूरस्थ ssh डेमॉन प्रभावी रूप से चलता है sh -c "$*"। इस प्रकार, आप भाग रहे हैं sh -c "/bin/bash -c echo <(cat)"; echoआदेश में ही केवल तर्क के लिए पारित किया है -c, और <(cat)एक अलग तर्क पूरी तरह है।
चार्ल्स डफी

0

मुझे कुछ समय पहले इसी तरह की स्थिति का सामना करना पड़ा था, जहां मुझे sqlplus के लिए ksh कोप्रोसेस का उपयोग करने की आवश्यकता थी और मेरे पास केवल एक ssh था जिसके माध्यम से पढ़ना और लिखना होता है।

ऐसा करने का एक तरीका रिमोट मशीन पर अपने सभी आश्रित कमांड को एक लाइन (उपयोग?) / Usr / bin / ksh में पाइप करना है। उदाहरण के लिए:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.