আমি কীভাবে দূরবর্তী মেশিনে স্থানীয় স্ক্রিপ্ট কার্যকর করতে পারি এবং যুক্তিগুলি অন্তর্ভুক্ত করতে পারি?


116

আমি একটি স্ক্রিপ্ট লিখেছি যা স্থানীয়ভাবে মৃত্যুদন্ড কার্যকর করার সময় ভাল চলে:

./sysMole -time Aug 18 18

"-কালীন" , "আগস্ট" , "18" এবং "18" আর্গুমেন্টগুলি সাফল্যের সাথে স্ক্রিপ্টে দেওয়া হয়েছে।

এখন, এই স্ক্রিপ্টটি একটি দূরবর্তী মেশিনে চালিত করার জন্য ডিজাইন করা হয়েছে তবে স্থানীয় মেশিনের স্থানীয় ডিরেক্টরি থেকে। উদাহরণ:

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

এটিও ঠিক কাজ করে। তবে সমস্যাটি দেখা দেয় যখন আমি এই উল্লিখিত যুক্তিগুলিকে অন্তর্ভুক্ত করার চেষ্টা করি ( উদাহরণস্বরূপ 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 -sbashযুক্তিটি ব্যবহার করে নিজের জন্য বাকী কোনও কমান্ড লাইন আর্গুমেন্ট নেওয়া থেকে বিরত রেখে আপনি প্রশান্তি দিতে পারেন --

এটার মত:

$ 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। এটি কারণ শেলটি প্রথমে পুনর্নির্দেশের নির্দেশনাটি বাইরে নিয়ে যায় (এটি কমান্ডের যেখানেই থাকুক না কেন), তারপরে পুনর্নির্দেশটি নির্ধারণ করে, তারপরে পুনরায়নির্দেশের সাথে বাকী কমান্ড লাইনটি কার্যকর করে।
লেসমান

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

@ krb686 - আমি এটি একটি নতুন প্র: যেমন জিজ্ঞেস করবে না
SLM

5

স্বেচ্ছাসেবী যুক্তিগুলি পরিচালনা করার জন্য

আপনি যদি সত্যিই কেবল একটি একক স্ট্রিং ব্যবহার করে থাকেন, যেমন। -time Aug 18 18, তবে আপনি কেবল এটি হার্ডকোড করতে পারেন এবং বিদ্যমান উত্তরগুলি আপনাকে কীভাবে পর্যাপ্তভাবে এটি করতে হয় তা বলে tell অন্যদিকে, আপনার যদি অজানা যুক্তিগুলি (অন্য সিস্টেমে প্রদর্শিত বার্তা, বা এমন কোনও ফাইলের নাম তৈরি করা হয় যেখানে শেষ ব্যবহারকারীরা এটির নামটি নিয়ন্ত্রণ করতে পারে) দরকার হয়, তবে আরও যত্ন নেওয়া দরকার।


সাথে 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"
}

যে কোনও পসিক্স-কমপ্লায়েন্ট সহ /bin/sh

পর্যাপ্ত দূষিত আর্গুমেন্ট ডেটার বিরুদ্ধে নিরাপদ থাকতে ( বেসলাইন-পসিক্স (যেমন বা ) printf %q) এমন কোনও একটি দিয়েও, যথেষ্ট পরিমাণে দূষিত আর্গুমেন্ট ডেটার বিরুদ্ধে সুরক্ষিত থাকার জন্য (নন- প্রিন্টেবল অক্ষরগুলি স্ট্রিংয়ে উপস্থিত থাকা অবস্থায় ব্যাশ-এর দ্বারা ব্যবহৃত নন-পসিক্স অনুমানের উদ্ধৃতিটি গ্রহণের চেষ্টা করা ) এমনকি এটি কিছুটা আকর্ষণীয় হয়ে উঠেছে:/bin/shdashash

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

বলুন আ একটি স্থানীয় ফাইল যাতে এলএস থাকে

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

127.0.0.1 আপনার দূরবর্তী আইপি যাই হোক না কেন তা পরিবর্তন করুন

এই দু'জন ছদ্ম tty বরাদ্দ সম্পর্কে বার্তা দেয় কিন্তু তারা কাজ করে।

$ 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
এটি প্রশ্নের কতদূর উত্তর দেয় তা দেখার জন্য আমি লড়াই করছি।
ক্রিসউইউ

গুণমান এবং ফর্ম্যাটিং সন্দেহজনক। আমি কোনও নতুন দরকারী তথ্য দেখতে পাচ্ছি না যা গৃহীত উত্তরের মধ্যে নেই।
জুলি পেলেটিয়ার

@ জুলিপেল্টিয়ার আমি কিছু 'বিড়াল' উদাহরণ দিয়েছি যা গৃহীত উত্তরে নেই। জিনিসগুলি করার বিকল্প উপায়গুলি জেনে রাখা ভাল।
বার্লপ

এটি ভাল জিনিস নয়; আপনার বিড়াল অকেজো।
স্কট

2
ওহে আমার সদাপ্রভু আমি বিড়ালের অপব্যবহারের ব্যবহারের লিঙ্কটি ছেড়ে দিয়েছি কারণ আমি ধরে নিয়েছিলাম যে সকলেই কমপক্ষে এই শব্দগুচ্ছটি শুনেছি; স্পষ্টতই এটি আমার পক্ষে একটি খারাপ ধারণা ছিল।
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.