কীভাবে একটি রিমোট কমান্ড কার্যকর করা যায় এবং স্থানীয় ফাইলে ইনপুট হিসাবে পাস করতে পারি?


22

এটা করা কি সম্ভব:

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

এর অর্থ, আমি প্রথমে scpফাইলটি অনুলিপি না করেই এক ধাপে একটি স্থানীয় ফাইল ব্যবহার করে একটি রিমোট কমান্ড কার্যকর করতে চাই ।


এটি সম্ভব যদি দূরবর্তী কম্পিউটারে স্থানীয় মেশিনের ফাইলের প্যারেন্ট ডিরেক্টরিগুলির নেটওয়ার্ক মাউন্ট থাকে বা আপনি যদি ফাইলটি ssh কমান্ডে পুনর্নির্দেশ করেন
h3rrmiller

উত্তর:


23

আপনি কেবল একটি প্রতীক মিস করেছেন =)

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

অবশ্যই! আমি ভাবছি কেন আমি এসএসএসের মাধ্যমে ইনপুট পুনঃনির্দেশ বিবেচনা করিনি ?!
jsj

রিমোট কমান্ড কেবল একটি ফাইল আর্গুমেন্ট নিতে পারে এবং স্টিডিন থেকে না পড়লে কী হবে?
iruvar

@ চন্দ্ররাভুরি এই ক্ষেত্রে আপনার scpআগে এটির অনুলিপি করা উচিত ।
নলখাগড়া

4
@ চন্দ্ররাভুরি আপনি এটিকে ফাইল আর্গুমেন্ট দেওয়ার চেষ্টা করতে পারেন /dev/stdinবা -। মে বা না কাজ করতে পারে ( /dev/stdinএকটি ফাইল, তবে এটির চেষ্টা ব্যর্থ হবে)
ডার্বার্ট

1
@ডারবার্ট এবং হুড়োহুড়ি, এর সাথে কিছুটা খেলা হয়েছিল এবং ব্যাশের অধীনে প্রক্রিয়া বিকল্প ব্যবহার করে এটি করার একটি হ্যাকি উপায় আবিষ্কার করেছে। এটি এখনও সীমাবদ্ধতার সন্ধানের সাপেক্ষে এবং প্রয়োজনীয় সমস্ত অতিরিক্ত উদ্ধৃতি দিয়ে অকার্যকর পেতে পারে। উদাহরণ অনুসরণ। বিড়াল test.file | ssh ব্যবহারকারীর @ মেশিন 'bash -c "wc -l <(cat -)" "
ইরুভর

4

কমান্ড নির্বিশেষে কাজ করার একটি উপায় হ'ল দূরবর্তী মেশিনে একটি দূরবর্তী ফাইল সিস্টেমের মাধ্যমে ফাইলটি উপলব্ধ করা। যেহেতু আপনার একটি এসএসএইচ সংযোগ রয়েছে:

  1. একটি বিপরীত এসএসএইচ টানেল স্থাপন করুনএসএসএইচ সহজেই স্থানীয় সিস্টেমে ফাইলের অনুলিপি দেখুন
  2. রিমোট মেশিনে এসএসএইচএফএসের সাথে ভাগ করে নেওয়ার জন্য ফাইল যুক্ত আপনার মেশিনের একটি ডিরেক্টরি ট্রি মাউন্ট করুন । ( উদাহরণ )

যাইহোক এইভাবে কমান্ড কার্যকর করার আগে অতিরিক্ত গতিবিধির প্রয়োজন।
নলখাগড়া

@ গিলস: আমি মনে করি মূল শিরোনামটি বিভ্রান্তিকর ছিল এবং আপনি বিভ্রান্তকারী শিরোনামের ভিত্তিতে তাঁর প্রশ্নটি বুঝতে পেরেছিলেন। যতদুর আমি বলতে পারেন, মনে হয়েছে, তিনি আসলে চায়নি কাজ উপর স্থানীয় ফাইল, কিন্তু ইনপুট হিসাবে এটা পাস। (তবে আপনার উত্তরটি আশ্চর্যজনক, যদি আমি এটি সঠিকভাবে বুঝতে পারি! আপনি যে উত্তরটি উত্তর দিয়েছিলেন সেখানে কেবল উত্তর দেওয়ার মতো একটি জায়গা দেওয়ার জন্য আপনার উত্তর দেওয়া প্রশ্নটি আমার জিজ্ঞাসা করা উচিত)) আমি প্রশ্নের শিরোনাম সম্পাদনা করেছি এটি শরীরের সাথে এবং নির্বাচিত উত্তরের সাথে সামঞ্জস্যপূর্ণ করতে।
আইকনোক্লাস্ট

@ আইকনোক্লাস্ট আমি যখন লিখলাম তখন আমার মনের অবস্থা মনে নেই, তবে আমি এই উত্তরটি দিয়ে চলেছি। এটির জন্য কিছু সেটআপ প্রয়োজন তবে তাত্ক্ষণিক প্রয়োজনের বাইরে অন্যান্য ক্ষেত্রে সাধারণীকরণ করার সুবিধা রয়েছে যেখানে এটি ইনপুট অনুলিপি করার পক্ষে যথেষ্ট নয়। অন্য কেউ এটি না করে থাকলে আমি পুনঃনির্দেশেরও উল্লেখ করতাম। আরও সাধারণ প্রশ্নটি বেশ কয়েকবার কিছুটা ভিন্ন আকারে জিজ্ঞাসা করা হয়েছিল।
গিলস 'অশুভ হওয়া বন্ধ করুন'

ঠিক আছে, আমি অবশ্যই আপনার উত্তর ভুল বুঝেছি। আমি এটি চেষ্টা করে দেখিনি, তবে অনুমান করা হয়েছে যেহেতু আপনি একটি বিপরীত সুড়ঙ্গ স্থাপন করছেন (দূরবর্তী থেকে স্থানীয় হোস্টে?) আপনি স্থানীয় ফাইলটিকে দূরবর্তী মেশিনের মাধ্যমে সংশোধন করার অনুমতি দিচ্ছিলেন। এটা কি হয় না?
আইকনোক্লাস্ট

@ আইকনোক্লাস্ট হ্যাঁ, এটি দূরবর্তী মেশিনকে স্থানীয় ফাইলটি সংশোধন করার অনুমতি দেয় (এটি এটি পড়ার অনুমতি দেওয়ার পাশাপাশি, যা প্রশ্নটির প্রয়োজন)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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)"'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.