एक दूरस्थ कमांड को कैसे निष्पादित करें और इनपुट के रूप में स्थानीय फ़ाइल में पास करें?


22

क्या इसे करना संभव है:

ssh user@socket command /path/to/file/on/local/machine

यह कहना है, मैं एक फ़ाइल में एक स्थानीय फ़ाइल का उपयोग करके दूरस्थ कमांड को निष्पादित करना चाहता हूं, पहले scpफ़ाइल की प्रतिलिपि बनाए बिना ।


यदि दूरस्थ कंप्यूटर में स्थानीय मशीन की फ़ाइल के मूल निर्देशिका का नेटवर्क माउंट है या यदि आप ssh कमांड में फ़ाइल को पुनर्निर्देशित करते हैं तो यह
संभव है

जवाबों:


23

आप सिर्फ एक प्रतीक से चूक गए =)

ssh user@socket command < /path/to/file/on/local/machine

बेशक! मुझे आश्चर्य है कि मैं ssh पर इनपुट पुनर्निर्देशन पर विचार क्यों नहीं किया ?!
jsj

क्या होगा अगर रिमोट कमांड केवल एक फ़ाइल तर्क ले सकता है और स्टड से नहीं पढ़ा जा सकता है?
इरूवर

उस मामले में @ChandraRavoori को आपको scpपहले कॉपी करना होगा ।
भीड़

4
@ChandraRavoori आप इसे फ़ाइल तर्क देने की कोशिश कर सकते हैं /dev/stdinया -। मई या काम नहीं कर सकता है ( /dev/stdinएक फ़ाइल है, लेकिन यह
मांगना

1
@derobert और रश, इसके साथ एक सा बजाया और बैश के तहत प्रक्रिया प्रतिस्थापन का उपयोग करते हुए इसे करने के लिए एक हैकी तरीका खोजा। यह अभी भी मांग की सीमा के अधीन है और जरूरत पड़ने वाले सभी अतिरिक्त उद्धरणों के साथ यह अस्पष्ट हो सकता है। उदाहरण इस प्रकार है। cat test.file | ssh उपयोगकर्ता @ मशीन 'बैश -c "wc -l <(कैट -)" "
इरुवर

4

एक तरीका जो कमांड की परवाह किए बिना काम करता है, वह है रिमोट मशीन पर फाइल को रिमोट फाइल सिस्टम के जरिए उपलब्ध कराना। चूंकि आपके पास SSH कनेक्शन है:

  1. एक रिवर्स एसएसएच सुरंग स्थापित करेंSSH को आसानी से स्थानीय सिस्टम में फ़ाइल की प्रतिलिपि भी देखें
  2. SSHFS के साथ दूरस्थ मशीन पर साझा करने के लिए अपनी मशीन की निर्देशिका ट्री माउंट करें । ( उदाहरण )

वैसे भी इस तरह से कमांड निष्पादन से पहले अतिरिक्त आंदोलनों की आवश्यकता होती है।
भीड़

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

जब मैंने यह लिखा था, तो मुझे अपनी मन: स्थिति याद नहीं है, लेकिन मैं इस जवाब से जाता हूं। इसके लिए कुछ सेटअप की आवश्यकता होती है लेकिन अन्य मामलों में तत्काल आवश्यकता से परे सामान्यीकरण का लाभ होता है जहां यह इनपुट कॉपी करने के लिए पर्याप्त नहीं है। अगर किसी और ने ऐसा नहीं किया होता, तो मैंने पुनर्निर्देशन का भी उल्लेख किया होता। अधिक सामान्य प्रश्न थोड़ा अलग रूपों में कई बार पूछा गया है।
गिल्स एसओ- बुराई को रोकना '

ठीक है, मुझे आपका जवाब गलत लगा होगा। मैंने यह कोशिश नहीं की, लेकिन यह अनुमान लगाया कि चूंकि आप एक रिवर्स सुरंग स्थापित कर रहे थे (रिमोट से स्थानीय होस्ट तक?) आप स्थानीय फ़ाइल को रिमोट मशीन द्वारा संशोधित करने की अनुमति दे रहे थे। क्या यह मामला नहीं है?
iconoclast

@ डायनोसॉल्स्ट हाँ, यह रिमोट मशीन को स्थानीय फ़ाइल को संशोधित करने की अनुमति देता है (इसके अलावा इसे पढ़ने के लिए अनुमति देता है, जिसे प्रश्न की आवश्यकता है)।
गिलेस एसओ- बुराई को रोकना '

1
# What if remote command can only take a file argument and not read from stdin? (1_CR)
ssh user@socket command < /path/to/file/on/local/machine
...
cat test.file | ssh user@machine 'bash -c "wc -l <(cat -)"'  # 1_CR

करने के लिए एक विकल्प के रूप bashप्रक्रिया प्रतिस्थापन <(cat -)या < <(xargs -0 -n 1000 cat)(नीचे देखें) तुम सिर्फ उपयोग कर सकते हैं xargsऔर catकरने के लिए निर्दिष्ट फ़ाइलों की सामग्री को पाइप के लिए wc -l(जो अधिक पोर्टेबल है)।

# Assuming that test.file contains file paths each delimited by an ASCII NUL character \0
# and that we are to count all those lines in all those files (provided by test.file).

#find . -type f -print0 > test.file
# test with repeated line count of ~/.bash_history file
for n in {1..1000}; do printf '%s\000' "${HOME}/.bash_history"; done > test.file

# xargs & cat
ssh localhost 'export LC_ALL=C; xargs -0 -n 1000 cat | wc -l' <test.file

# Bash process substitution
cat test.file | ssh localhost 'bash -c "export LC_ALL=C; wc -l < <(xargs -0 -n 1000 cat)"'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.