मैं दूरस्थ मशीन पर स्थानीय स्क्रिप्ट को कैसे निष्पादित कर सकता हूं और तर्क शामिल कर सकता हूं?


116

मैंने एक स्क्रिप्ट लिखी है जो स्थानीय स्तर पर निष्पादित होने पर ठीक चलती है:

./sysMole -time Aug 18 18

तर्क "समय" , "अगस्त" , "18" , और "18" को स्क्रिप्ट पर सफलतापूर्वक पारित किया गया है।

अब, यह स्क्रिप्ट दूरस्थ मशीन पर निष्पादित की जाने वाली डिज़ाइन की गई है, लेकिन स्थानीय मशीन की स्थानीय निर्देशिका से। उदाहरण:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole

वह भी ठीक काम करता है। लेकिन समस्या तब पैदा होती है जब मैं उन उल्लिखित तर्कों (समय 18 अगस्त 18) को शामिल करने की कोशिश करता हूं , उदाहरण के लिए:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18

उस स्क्रिप्ट को चलाने के बाद मुझे निम्नलिखित त्रुटि मिलती है:

bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell

कृपया मुझे बताएं कि मैं क्या गलत कर रहा हूं, इससे बहुत निराशा होती है।


1
"बैश-एस" उन तरीकों में से एक है जिन्हें आप मानक इनपुट (यानी एक फ़ाइल) से स्क्रिप्ट निष्पादित कर सकते हैं।
एलनड

जवाबों:


160

आप अपने उदाहरण के साथ बहुत करीब थे। यह ठीक काम करता है जब आप इन जैसे तर्कों के साथ इसका उपयोग करते हैं।

नमूना स्क्रिप्ट:

$ more ex.bash 
#!/bin/bash

echo $1 $2

उदाहरण है कि काम करता है:

$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye

लेकिन यह इस प्रकार के तर्कों के लिए विफल है:

$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...

क्या चल रहा है?

आपके द्वारा सामना की जा रही समस्या यह है कि तर्क -time, या --timeमेरे उदाहरण में, एक स्विच के रूप में व्याख्या की जा रही है bash -s। आप bashतर्क का उपयोग करके शेष कमांड लाइन के किसी भी तर्क को लेने से इसे समाप्त करके शांत कर सकते हैं --

ऐशे ही:

$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18

उदाहरण

# 1:

$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye

# 2:

$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye

# 3:

$ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye

# 4:

$ ssh  < ./ex.bash serverA "bash -s -- --time bye"
--time bye

नोट: यह स्पष्ट करने के लिए कि कमांड लाइन पर जहाँ भी पुनर्निर्देशन दिखाई देता है, उससे कोई फर्क नहीं पड़ता, क्योंकि sshदूरस्थ तर्क के साथ दूरस्थ शेल को कॉल करता है, वैसे भी, उद्धृत करने से बहुत अंतर नहीं पड़ता, सिवाय इसके कि जब आपको रिमोट शेल पर उद्धृत करने की आवश्यकता हो उदाहरण में # 4:

$ ssh  < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'"
<--time bye> <end>

4
आप एक प्रतिभाशाली हैं! मुझे आपके स्तर पर आने के लिए क्या करना होगा? मेरे पास काम की एक बहुत कुछ है। बहुत बहुत धन्यवाद।
एलन

14
@ एलेनडीडी - बस सवाल पूछते रहें, और कोशिश करें और जितना हो सके साइट पर भाग लें। मैं हमेशा कोशिश करता हूं और प्रत्येक दिन कुछ नया सीखता हूं। आपके सवाल से पहले मुझे नहीं पता था कि यह कैसे करना है। 8-)। आपके प्रश्न के लिए धन्यवाद!
slm

5
ध्यान दें कि पुनर्निर्देशन कमांड में किसी भी बिंदु पर दिखाई दे सकता है: उदाहरण के लिए bash -s -- --time bye < ./ex.bashया यहां तक ​​कि < ./ex.bash bash -s -- --time bye। इसका कारण यह है कि शेल पहले रीडायरेक्शन निर्देश (चाहे वह कमांड में हो) को निकाल लेता है, फिर रीडायरेक्शन सेट करता है, फिर शेष कमांड लाइन को रीडायरेक्शन के साथ निष्पादित करता है।
lesmana

@ मैं इस सटीक चीज़ को करने की कोशिश कर रहा हूं, लेकिन स्क्रिप्ट के भीतर से, कमांड लाइन से नहीं। यह कैसे करना है का कोई विचार? किसी कारण के लिए, अपने सटीक उत्तर को बैकटिक्स में संलग्न करना बिल्कुल भी काम नहीं करता है। इसके बजाय यह स्थानीय रूप से निर्दिष्ट स्क्रिप्ट चलाता है, और आउटपुट को ssh
brb686

@ krb686 - मैं इसे एक नया प्रश्न के रूप में पूछना चाहते हैं
SLM

5

मनमानी तर्क को संभालने पर

यदि आप वास्तव में केवल एक ही स्ट्रिंग का उपयोग कर रहे हैं, यानी। -time Aug 18 18, तो आप बस इसे हार्डकोड कर सकते हैं, और मौजूदा उत्तर आपको बताएंगे कि पर्याप्त रूप से कैसे करें। दूसरी ओर, यदि आपको अज्ञात तर्कों को पारित करने की आवश्यकता है (जैसे कि अन्य सिस्टम पर प्रदर्शित होने वाला संदेश, या एक फ़ाइल का नाम जहां अंत उपयोगकर्ता अपने नाम को नियंत्रित कर सकते हैं), तो अधिक देखभाल की आवश्यकता है।


साथ bashया के kshरूप में/bin/sh

यदि आपका रिमोट /bin/shबैश या ksh द्वारा प्रदान किया गया है, तो आप सुरक्षित रूप से एक अविश्वसनीय तर्क सूची के साथ कर सकते हैं, जैसे कि दुर्भावनापूर्ण नाम (जैसे $(rm -rf $HOME).txt) सुरक्षित रूप से तर्क के रूप में पारित किए जा सकते हैं:

runRemote() {
  local args script

  script=$1; shift

  # generate eval-safe quoted version of current argument list
  printf -v args '%q ' "$@"

  # pass that through on the command line to bash -s
  # note that $args is parsed remotely by /bin/sh, not by bash!
  ssh user@remote-addr "bash -s -- $args" < "$script"
}

किसी भी POSIX- शिकायत के साथ /bin/sh

पर्याप्त रूप से दुर्भावनापूर्ण तर्क डेटा के विरुद्ध सुरक्षित होने के लिए (गैर-पोसिक्स कंप्लेंट का लाभ उठाने का प्रयास करते हुए, printf %qजब बैश में उपयोग किए जाने वाले गैर- ज्वलनशील पात्र स्ट्रिंग में मौजूद होते हैं) तब भी /bin/shआधारभूत- POSIX (जैसे dashया ash) के साथ होता है, यह थोड़ा और दिलचस्प हो जाता है:

runRemote() {
  local script=$1; shift
  local args
  printf -v args '%q ' "$@"
  ssh user@remote-addr "bash -s" <<EOF

  # pass quoted arguments through for parsing by remote bash
  set -- $args

  # substitute literal script text into heredoc
  $(< "$script")

EOF
}

उपयोग (ऊपर के दोनों के लिए)

ऊपर दिए गए कार्यों को इस प्रकार लागू किया जा सकता है:

# if your time should be three arguments
runRemote /var/www/html/ops1/sysMole -time Aug 18 18

... या ...

# if your time should be one string
runRemote /var/www/html/ops1/sysMole -time "Aug 18 18"

-3

आ एक स्थानीय फ़ाइल है जिसमें ls शामिल है

$ssh servername "cat | bash" < a.a

जो भी आपका रिमोट आईपी है, उसे 127.0.0.1 बदलें

ये दोनों छद्म ट्टी आवंटन के बारे में एक संदेश देते हैं लेकिन वे काम करते हैं।

$ cat a.a | ssh 127.0.0.1

$ ssh 127.0.0.1 <a.a

या

$ cat a.a | ssh 127.0.0.1 bash or

$ ssh 127.0.0.1 bash < a.a


2
मैं यह देखने के लिए संघर्ष कर रहा हूं कि यह सवाल कितना दूर है।
क्रिसव्यू

गुणवत्ता और स्वरूपण संदिग्ध है। मुझे कोई भी नई उपयोगी जानकारी दिखाई नहीं दे रही है जो स्वीकृत उत्तर में मौजूद नहीं है।
जूली पेलेटियर

@ जूलीपैलेटियर I ने स्वीकार किए गए उत्तर में कुछ 'बिल्ली' उदाहरण दिए। चीजों को करने के वैकल्पिक तरीकों को जानना अच्छा है।
बार्लोप

यह अच्छी बात नहीं है; तुम्हारी बिल्लियाँ बेकार हैं।
स्कॉट

2
हे भगवान। मैंने बिल्ली के बेकार उपयोग के लिंक को छोड़ दिया क्योंकि मैंने यह मान लिया था कि हर कोई कम से कम अब तक वाक्यांश के बारे में सुना था; जाहिर है कि मेरी ओर से एक बुरी धारणा थी।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.