দূরবর্তী ব্যবহারকারীর লগইন শেল না জেনে ssh- র মাধ্যমে কীভাবে নির্বিচারে সাধারণ কমান্ড চালানো যায়?


26

ssh আপনি যখন চালনা করেন তাতে একটি বিরক্তিকর বৈশিষ্ট্য রয়েছে:

ssh user@host cmd and "here's" "one arg"

এটি cmdতার যুক্তি দিয়ে চালানোর পরিবর্তে host, এটি cmdএবং স্থানগুলির সাথে যুক্তিগুলি যুক্ত করে এবং hostফলস্বরূপ স্ট্রিংটি ব্যাখ্যা করার জন্য একটি শেল চালায় (আমি অনুমান করি যে এটি কেন বলা হয় sshএবং না sexec)।

সবচেয়ে খারাপ, আপনি জানেন না যে শেলটি সেই স্ট্রিংটির ব্যাখ্যার জন্য ব্যবহৃত হতে চলেছে কারণ এটি লগইন শেল userযা বোর্নের মতো গ্যারান্টিযুক্তও নেই কারণ এখনও লোকেরা tcshতাদের লগইন শেল হিসাবে ব্যবহার fishকরছে এবং বৃদ্ধি পাচ্ছে ।

যে কাছাকাছি একটি উপায় আছে কি?

ধরুন আমি একটি সংরক্ষিত আর্গুমেন্ট একটি তালিকা হিসাবে তোমার ভালো দখল আছে bashএরে, প্রতিটি যা অ নাল বাইটের কোনো ক্রম থাকতে পারে, সেখানে এটি মৃত্যুদন্ড কার্যকর করা আছে কোন উপায় আছে কি hostহিসাবে userযে লগ-ইন শেল নির্বিশেষে একটি সামঞ্জস্যপূর্ণ ভাবে userউপর host(যা আমরা ধরে নেব যে ইউনিক্সের অন্যতম প্রধান শেল পরিবার: বোর্ন, সিএসএস, আরসি / এসএস, ফিশ)?

আরেকটি যুক্তিসঙ্গত অনুমান যে আমার তৈরি করতে সক্ষম হওয়া উচিত তা হল বোর্ন-সামঞ্জস্যপূর্ণ সেখানে একটি shকমান্ড hostপাওয়া যায় $PATH

উদাহরণ:

cmd=(
  'printf'
  '<%s>\n'
  'arg with $and spaces'
  '' # empty
  $'even\n* * *\nnewlines'
  "and 'single quotes'"
  '!!'
)

আমি এটিকে স্থানীয়ভাবে ksh/ zsh/ bash/ দিয়ে চালাতে পারি yash:

$ "${cmd[@]}"
<arg with $and spaces>
<>
<even
* * *
newlines>
<and 'single quotes'>
<!!>

অথবা

env "${cmd[@]}"

অথবা

xterm -hold -e "${cmd[@]}"
...

আমি কিভাবে এটা চালানো হবে hostযেমন userওভার ssh?

ssh user@host "${cmd[@]}"

অবশ্যই কাজ করবে না।

ssh user@host "$(printf ' %q' exec "${cmd[@]}")"

কেবল তখনই কাজ করতে পারে যখন দূরবর্তী ব্যবহারকারীর লগইন শেলটি স্থানীয় শেলের মতোই ছিল (বা স্থানীয় শেলের মধ্যে একইভাবে উদ্ধৃতি বোঝা printf %qযায়) এবং একই লোকেলে চালিত হয়।


3
cmdযুক্তিটি যদি হয় যে /bin/sh -cআমরা সব ক্ষেত্রে 99% মধ্যে একটি পিক্সিক শেল দিয়ে শেষ করব, তাই না? অবশ্যই বিশেষ চরিত্রগুলি থেকে বাঁচা এইভাবে খানিকটা বেদনাদায়ক তবে এটি কি প্রাথমিক সমস্যার সমাধান করবে?
বনাঙ্গুইন

@Bananguin, কোন যদি আপনি চালাতে ssh host sh -c 'some cmd', যেমন একই ssh host 'sh -c some cmd', দূরবর্তী ব্যবহারকারীর লগ-ইন শেল আছে ব্যাখ্যা sh -c some cmdকমান্ড লাইন। সেই শেলটির সঠিক সংশ্লেষণে আমাদের কমান্ডটি লিখতে হবে (এবং এটি কোনটি তা আমরা জানি না) যাতে shসেখানে -cএবং some cmdযুক্তি দিয়ে ডাকতে হবে ।
স্টাফেন চেজেলাস

1
@ ওথিয়াস, হ্যাঁ, সমস্ত কটি শেলের মধ্যে sh -c 'some cmd'অ্যান্ড some cmdকমান্ড লাইনগুলির একই ব্যাখ্যা করা হবে। এখন যদি আমি echo \'দূরবর্তী হোস্টে বোর্ন কমান্ড লাইনটি চালাতে চাই ? echo command-string | ssh ... /bin/shআমি আমার উত্তরে একটি সমাধান দিয়েছি, তবে এর অর্থ আপনি সেই দূরবর্তী কমান্ডের স্টিডিনে ডেটা ফিড করতে পারবেন না।
স্টাফেন চেজেলাস

1
আরও দীর্ঘস্থায়ী সমাধানের মতো শব্দগুলি ssh এর জন্য একটি রেক্সেক প্লাগইন হবে, হ্যাঁ এফটিটিপি প্লাগইন।
ওথিয়াস 26'15

1
@ এমআরডিডি, না এটি নয়, শেল কমান্ড লাইনে যুক্তি আলাদা করতে আপনার প্রয়োজন হয় স্থান বা ট্যাব either যদি cmdহয় cmd=(echo "foo bar"), শেল কমান্ড লাইনটি passed ssh'প্রতিধ্বনি' 'foo বার' . The *first* space (the one before ইকো ) is superflous, but doen't harm. The other one (the ones before 'foo বার' ) is needed. With '% q' , we'd pass a 'ইকো''ফু বার'` কমান্ড লাইনের মতো হওয়া উচিত।
স্টাফেন চেজেলাস

উত্তর:


19

আমি মনে করি না যে কোনও প্রয়োগের sshশেলকে জড়িত না করে ক্লায়েন্ট থেকে সার্ভারে একটি আদেশ পাঠানোর স্থানীয় উপায় আছে।

এখন, বিষয়গুলি আরও সহজ হতে পারে যদি আপনি দূরবর্তী শেলটিকে কেবল একটি নির্দিষ্ট দোভাষী চালাতে (যেমন shআমরা প্রত্যাশিত বাক্য গঠন জানি) চালাতে এবং কোডটিকে অন্য মাধ্যমে কার্যকর করতে কোড দিতে পারি।

এটির অন্যান্য অর্থ উদাহরণ স্ট্যান্ডার্ড ইনপুট বা পরিবেশের পরিবর্তনশীল হতে পারে

যখন উভয়ই ব্যবহার করা যায় না, আমি নীচে একটি হ্যাকি তৃতীয় সমাধান প্রস্তাব করি।

স্টিডিন ব্যবহার করে

আপনার যদি কোনও ডেটা রিমোট কমান্ডে খাওয়ানোর প্রয়োজন না হয় তবে এটি সবচেয়ে সহজ সমাধান।

আপনি যদি জানেন যে রিমোট হোস্টের একটি xargsকমান্ড রয়েছে যা -0বিকল্পটি সমর্থন করে এবং কমান্ডটি খুব বড় নয়, আপনি এটি করতে পারেন:

printf '%s\0' "${cmd[@]}" | ssh user@host 'xargs -0 env --'

এই xargs -0 env --কমান্ড লাইনটি সমস্ত শেল পরিবারের সাথে একই ব্যাখ্যা করা হয়। xargsস্টিডিনে আর্গুমেন্টের নাল-সীমাবদ্ধ তালিকা পড়ে এবং সেগুলি আর্গুমেন্ট হিসাবে পাস করে env। এটি ধরে নিয়েছে প্রথম আর্গুমেন্ট (কমান্ডের নাম) এর মধ্যে =অক্ষর নেই।

অথবা আপনি shপ্রতিটি উপাদান shউদ্ধৃত বাক্য গঠন ব্যবহার করে দূরবর্তী হোস্টে ব্যবহার করতে পারেন ।

shquote() {
  LC_ALL=C awk -v q=\' '
    BEGIN{
      for (i=1; i<ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf "%s ", q ARGV[i] q
      }
      print ""
    }' "$@"
}
shquote "${cmd[@]}" | ssh user@host sh

পরিবেশের ভেরিয়েবল ব্যবহার করা

এখন, আপনার যদি ক্লায়েন্ট থেকে রিমোট কমান্ডের স্টিডিনে কিছু তথ্য খাওয়ানোর প্রয়োজন হয় তবে উপরের সমাধানটি কাজ করবে না।

কিছু sshসার্ভার মোতায়েন ক্লায়েন্ট থেকে সার্ভারে স্বেচ্ছাসেবী পরিবেশ পরিবর্তনশীল পাস করার অনুমতি দেয়। উদাহরণস্বরূপ, ডিবিয়ান ভিত্তিক সিস্টেমে অনেকগুলি ওপেনশ মোতায়েনগুলি যার নাম দিয়ে শুরু হয় ভেরিয়েবলগুলি পাস করার অনুমতি দেয় LC_

এই ক্ষেত্রে আপনি LC_CODEউদাহরণ হিসাবে উদাহরণস্বরূপ শ্যুইট sh কোড সহ একটি চলক থাকতে পারে এবং sh -c 'eval "$LC_CODE"'আপনার ক্লায়েন্টকে সেই ভেরিয়েবলটি পাস করার পরে বলার পরে (আবার, এটি একটি কমান্ড-লাইন যা প্রতিটি শেলের মধ্যে একই ব্যাখ্যা করে):

LC_CODE=$(shquote "${cmd[@]}") ssh -o SendEnv=LC_CODE user@host '
  sh -c '\''eval "$LC_CODE"'\'

সমস্ত শেল পরিবারের সাথে উপযুক্ত একটি কমান্ড লাইন তৈরি করা

যদি উপরের কোনও বিকল্প গ্রহণযোগ্য না হয় (কারণ আপনার স্টিডিন প্রয়োজন এবং এসএসডি কোনও পরিবর্তনশীল গ্রহণ করে না, বা আপনার জেনেরিক সমাধান প্রয়োজন বলে), তবে আপনাকে সকলের সাথে সামঞ্জস্যপূর্ণ দূরবর্তী হোস্টের জন্য একটি কমান্ড লাইন প্রস্তুত করতে হবে have সমর্থিত শাঁস

এটি বিশেষত জটিল কারণ কারণ all সমস্ত শেলগুলির (বোর্ন, সিএসএস, আরসি, এস, ফিশ) আলাদা আলাদা বাক্য গঠন রয়েছে এবং বিশেষত বিভিন্ন উদ্ধৃতিপ্রক্রিয়া এবং এর মধ্যে কয়েকটি সীমাবদ্ধতা রয়েছে যার চারপাশে কাজ করা শক্ত।

আমি এখানে এসেছি এমন একটি সমাধান, আমি এটি আরও নীচে বর্ণনা করছি:

#! /usr/bin/perl
my $arg, @ssh, $preamble =
q{printf '%.0s' "'\";set x=\! b=\\\\;setenv n "\
";set q=\';printf %.0s "\""'"';q='''';n=``()echo;x=!;b='\'
printf '%.0s' '\'';set b \\\\;set x !;set -x n \n;set q \'
printf '%.0s' '\'' #'"\"'";export n;x=!;b=\\\\;IFS=.;set `echo;echo \.`;n=$1 IFS= q=\'
};

@ssh = ('ssh');
while ($arg = shift @ARGV and $arg ne '--') {
  push @ssh, $arg;
}

if (@ARGV) {
  for (@ARGV) {
    s/'/'\$q\$b\$q\$q'/g;
    s/\n/'\$q'\$n'\$q'/g;
    s/!/'\$x'/g;
    s/\\/'\$b'/g;
    $_ = "\$q'$_'\$q";
  }
  push @ssh, "${preamble}exec sh -c 'IFS=;exec '" . join "' '", @ARGV;
}

exec @ssh;

এটি perlপ্রায় একটি মোড়ক স্ক্রিপ্ট ssh। আমি এটি কল sexec। আপনি এটিকে ডাকেন:

sexec [ssh-options] user@host -- cmd and its args

সুতরাং আপনার উদাহরণে:

sexec user@host -- "${cmd[@]}"

এবং মোড়ক cmd and its argsএকটি কমান্ড লাইনে পরিণত হয় যা সমস্ত শেলগুলি cmdতার আরোগুলি (তাদের সামগ্রীতে নির্বিশেষে) দিয়ে কল করার অর্থ ব্যাখ্যা করে ।

সীমাবদ্ধতা:

  • কমান্ডটি উদ্ধৃত করার উপস্থাপনা এবং উপায়টির অর্থ দূরবর্তী কমান্ড লাইনটি উল্লেখযোগ্য পরিমাণে বৃহত্তর হয়ে গেছে যার অর্থ একটি কমান্ড লাইনের সর্বাধিক আকারের সীমাটি শীঘ্রই পৌঁছে যাবে।
  • আমি এটির সাথে কেবল এটি পরীক্ষা করেছি: সাম্প্রতিক ডেবিয়ান সিস্টেমে পাওয়া বোর্ন শেল (উত্তরাধিকারী সরঞ্জামের কাস্টম থেকে), ড্যাশ, বাশ, জেডএস, এমএক্স, লক্ষ, যশ, কেএস 93, আরসি, এস, আকঙ্গা, সিএসএস, টিসিএস, মাছ বিন / শ, / ইউএসআর / বিন / কেএসএস, / বিন / সিএসএস এবং / ইউএসআর / এক্সপিজি 4 / বিন / এসএস সোলারিস 10 এ।
  • যদি yashরিমোট লগইন শেল হয় তবে আপনি কোনও কমান্ডটি পাস করতে পারবেন না যার আর্গুমেন্টে অবৈধ অক্ষর রয়েছে, তবে এটি এমন একটি সীমাবদ্ধতা yashযে আপনি কোনওভাবেই কাজ করতে পারবেন না।
  • কিছু কিছু শেল সিএসএস বা বাশের মতো কিছু স্টার্টআপ ফাইল পড়ে যখন এসএসএসের উপর চাপ দেওয়া হয়। আমরা ধরে নিলাম যারা নাটকীয়ভাবে আচরণটি পরিবর্তন করে না যাতে উপস্থাপনাটি এখনও কাজ করে।
  • পাশেই sh, এটি ধরেও নেয় দূরবর্তী সিস্টেমের printfকমান্ড রয়েছে।

এটি কীভাবে কাজ করে তা বোঝার জন্য, আপনাকে জানতে হবে যে বিভিন্ন শেলগুলিতে উদ্ধৃতি কীভাবে কাজ করে:

  • বোর্ন: '...'এর কোনও বিশেষ চরিত্রহীন দৃ strong় উক্তি । "..."দুর্বল উক্তি যেখানে "ব্যাকস্ল্যাশ দিয়ে পালানো যায়।
  • csh। বোর্ন হিসাবে একই যে এর বাইরে "পালানো যায় না "..."। এছাড়াও একটি নতুনলাইন চরিত্রটি ব্যাকস্ল্যাশ সহ উপস্থাপিত করতে হবে। এবং !একক উদ্ধৃতিতেও সমস্যা তৈরি করে।
  • rc। একমাত্র উদ্ধৃতিগুলি '...'(শক্তিশালী)। একক উদ্ধৃতিগুলির মধ্যে একটি একক উক্তি ''(যেমন '...''...') প্রবেশ করানো হয় । ডাবল উদ্ধৃতি বা ব্যাকস্ল্যাশগুলি বিশেষ নয়।
  • es। বাইরের উক্তি ব্যতীত আরসি হিসাবে একই, ব্যাকস্ল্যাশ একটি একক উদ্ধৃতি থেকে বাঁচতে পারে।
  • fish: বোর্ন হিসাবে একই যে ব্যাকস্ল্যাশ 'ভিতরে প্রবেশ করে '...'

এই সমস্ত প্রতিবন্ধকতাগুলির সাথে, এটি সহজেই দেখা যায় যে কেউ কমান্ড লাইন যুক্তি নির্ভরযোগ্যতার সাথে উদ্ধৃত করতে পারে না যাতে এটি সমস্ত শেলগুলির সাথে কাজ করে।

একক উদ্ধৃতি ব্যবহার হিসাবে:

'foo' 'bar'

সব মিলিয়ে কাজ করে:

'echo' 'It'\''s'

কাজ করবে না rc

'echo' 'foo
bar'

কাজ করবে না csh

'echo' 'foo\'

কাজ করবে না fish

তবে আমরা পরিষদবর্গকে বেশিরভাগ সমস্যার কাজ করতে সক্ষম যদি আমরা ভেরিয়েবল সেই সমস্যাযুক্ত অক্ষর সঞ্চয় করতে পরিচালিত ব্যাকস্ল্যাশ কেমন হওয়া উচিত $b, একক উদ্ধৃতি $qমধ্যে, NEWLINE $n(এবং !মধ্যে $xএকটি শেল স্বাধীন ভাবে csh এর মূল ইতিহাস সম্প্রসারণ জন্য)।

'echo' 'It'$q's'
'echo' 'foo'$b

সব শেল কাজ করবে। এটি এখনও নতুন লাইনের জন্য কাজ করবে না csh। যদি $nনিউলাইন থাকে তবে এটিতে একটি নতুন লাইনে প্রসারিত হওয়ার জন্য আপনাকে এটি cshলিখতে হবে $n:qএবং এটি অন্যান্য শেলের জন্য কাজ করবে না। সুতরাং, পরিবর্তে এখানে আমরা কী করছি তা কল করছে shএবং shসেগুলি প্রসারিত করবে $n। এর অর্থ হ'ল দুটি স্তরের উদ্ধৃতি, একটি রিমোট লগইন শেলের জন্য এবং একটির জন্য sh

$preambleযে কোডে trickiest অংশ। এটা তোলে কোড শাঁস মাত্র এক ব্যাখ্যা (যখন এটি অন্যদের জন্য মন্তব্য করা হয়েছে) প্রতিটি যা কেবলমাত্র সেই সংজ্ঞা কিছু বিভাগ রয়েছে সব শাঁস বিভিন্ন বিভিন্ন উদ্ধৃতি নিয়ম ব্যবহার করে $b, $q, $n, $xতাদের নিজ নিজ শেল জন্য ভেরিয়েবল।

এখানে শেল কোডটি দেওয়া হবে যা hostউদাহরণস্বরূপ দূরবর্তী ব্যবহারকারীর লগইন শেল দ্বারা ব্যাখ্যা করা হবে :

printf '%.0s' "'\";set x=\! b=\\;setenv n "\
";set q=\';printf %.0s "\""'"';q='''';n=``()echo;x=!;b='\'
printf '%.0s' '\'';set b \\;set x !;set -x n \n;set q \'
printf '%.0s' '\'' #'"\"'";export n;x=!;b=\\;IFS=.;set `echo;echo \.`;n=$1 IFS= q=\'
exec sh -c 'IFS=;exec '$q'printf'$q' '$q'<%s>'$b'n'$q' '$q'arg with $and spaces'$q' '$q''$q' '$q'even'$q'$n'$q'* * *'$q'$n'$q'newlines'$q' '$q'and '$q$b$q$q'single quotes'$q$b$q$q''$q' '$q''$x''$x''$q

সমর্থিত শেলগুলির কোনওর দ্বারা ব্যাখ্যা করা হলে সেই কোডটি একই কমান্ডটি চালানো শেষ করে।


1
এসএসএইচ প্রোটোকল ( আরএফসি 4254 §6.5 ) একটি রিমোট কমান্ডকে স্ট্রিং হিসাবে সংজ্ঞায়িত করে। সেই স্ট্রিংটির কীভাবে ব্যাখ্যা করা যায় তা সিদ্ধান্ত নেওয়ার জন্য এটি সার্ভারের উপর নির্ভর করে। ইউনিক্স সিস্টেমে, সাধারণ ব্যাখ্যার অর্থ হ'ল স্ট্রিংটি ব্যবহারকারীর লগইন শেলের কাছে পৌঁছে দেওয়া। একটি সীমাবদ্ধ অ্যাকাউন্টের জন্য, এটি আরএসএস বা রাশ এর মতো কিছু হতে পারে যা স্বেচ্ছাসেবী আদেশগুলি গ্রহণ করে না। এমনকি অ্যাকাউন্টে বা কীটিতে একটি বাধ্যতামূলক কমান্ডও থাকতে পারে যা ক্লায়েন্টের দ্বারা প্রেরিত কমান্ড স্ট্রিংকে উপেক্ষা করে।
গিলস

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

1
কিছু সাধারণ শেলের মধ্যে সিনট্যাক্সের মূল পার্থক্য সম্পর্কে একটি দরকারী রেফারেন্স হাইপারপলিগ্লোটে পাওয়া যায় ।
lcd047

0

TL; ড

ssh USER@HOST -p PORT $(printf "%q" "cmd") $(printf "%q" "arg1") \
    $(printf "%q" "arg2")

আরও বিস্তৃত সমাধানের জন্য, মন্তব্যগুলি পড়ুন এবং অন্য উত্তরটি পরীক্ষা করুন

বিবরণ

ভাল, আমার সমাধানটি অ- bashশেলগুলির সাথে কাজ করবে না । তবে bashএটি অন্য প্রান্তে ধরে নেওয়া, বিষয়গুলি সহজতর হয়। আমার ধারণা printf "%q"পালানোর জন্য পুনরায় ব্যবহার করা। এছাড়াও সাধারণত, অন্য প্রান্তে একটি স্ক্রিপ্ট থাকা আরও পঠনযোগ্য, এটি আর্গুমেন্টগুলি গ্রহণ করে। কমান্ডটি যদি সংক্ষিপ্ত হয় তবে এটি ইনলাইন করা ভাল। স্ক্রিপ্টগুলিতে ব্যবহার করার জন্য এখানে কয়েকটি উদাহরণ ফাংশন রয়েছে:

local.sh:

#!/usr/bin/env bash
set -eu

ssh_run() {
    local user_host_port=($(echo "$1" | tr '@:' ' '))
    local user=${user_host_port[0]}
    local host=${user_host_port[1]}
    local port=${user_host_port[2]-22}
    shift 1
    local cmd=("$@")
    local a qcmd=()
    for a in ${cmd[@]+"${cmd[@]}"}; do
        qcmd+=("$(printf "%q" "$a")")
    done
    ssh "$user"@"$host" -p "$port" ${qcmd[@]+"${qcmd[@]}"}
}

ssh_cmd() {
    local user_host_port=$1
    local cmd=$2
    shift 2
    local args=("$@")
    ssh_run "$user_host_port" bash -lc "$cmd" - ${args[@]+"${args[@]}"}
}

ssh_run USER@HOST ./remote.sh "1  '  \"  2" '3  '\''  "  4'
ssh_cmd USER@HOST:22 "for a; do echo \"'\$a'\"; done" "1  '  \"  2" '3  '\''  "  4'
ssh_cmd USER@HOST:22 'for a; do echo "$a"; done' '1  "2' "3'  4"

remote.sh:

#!/usr/bin/env bash
set -eu
for a; do
    echo "'$a'"
done

আউটপুট:

'1  '  "  2'
'3  '  "  4'
'1  '  "  2'
'3  '  "  4'
1  "2
3'  4

বিকল্পভাবে, আপনি printfনিজের কাজটি নিজেই করতে পারেন, আপনি যদি জানেন যে আপনি কী করছেন:

ssh USER@HOST ./1.sh '"1  '\''  \"  2"' '"3  '\''  \"  4"'

1
এটি ধরে নিয়েছে যে দূরবর্তী ব্যবহারকারীর লগইন শেলটি হ'ল বাশ (ব্যাশের ফ্যাশনে ব্যাশের প্রিন্টফ% কিউ কোট হিসাবে) এবং bashএটি দূরবর্তী মেশিনে উপলব্ধ। নিখোঁজ উদ্ধৃতিগুলির সাথে কয়েকটি সমস্যা রয়েছে যা শ্বেত স্থান এবং ওয়াইল্ডকার্ডগুলির সাথে সমস্যা সৃষ্টি করবে।
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস প্রকৃতপক্ষে, আমার সমাধান সম্ভবত কেবল bashশাঁসকে লক্ষ্য করে । তবে আশা করি লোকেরা এটি ব্যবহারের সার্থক হবে। আমি যদিও অন্যান্য সমস্যাগুলি সমাধান করার চেষ্টা করেছি। bashজিনিসটি বাদে আমি কিছু মিস করছি কিনা তা নির্দ্বিধায় আমাকে বলুন ।
এক্স-ইউরি

1
মনে রাখবেন যে এটি এখনও প্রশ্নের ( ssh_run user@host "${cmd[@]}") প্রশ্নে নমুনা কমান্ড দিয়ে কাজ করে না । আপনার কাছে এখনও কিছু অনুপস্থিত উদ্ধৃতি রয়েছে।
স্টাফেন চেজেলাস

1
এটা ভাল. নোট করুন যে printf %qবাশের আউটপুটটি আলাদা আলাদা লোকেল ব্যবহার করা নিরাপদ নয় (এবং এটি বেশ বগিও রয়েছে; উদাহরণস্বরূপ বিআইজি 5 চারসেট ব্যবহার করে লোকালগুলিতে এটি (4.3.48) এর উদ্ধৃতি εহিসাবে রয়েছে α`!)। তার জন্য, সব থেকে উদ্ধৃত করা এবং একক উদ্ধৃতি সহ কেবল shquote()আমার উত্তরের সাথে পছন্দ করা best
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.