প্রতি zanco এর উত্তর , আপনি একটি দূরবর্তী কমান্ড প্রদান করছি না sshদেওয়া কিভাবে শেল কমান্ড লাইন parses। এই সমস্যাটি সমাধান করার জন্য, আপনার sshকমান্ডের অনুরোধের সিনট্যাক্সটি পরিবর্তন করুন যাতে রিমোট কমান্ডটি সিনট্যাকটিক্যালি সঠিক, মাল্টি-লাইনের স্ট্রিং নিয়ে গঠিত।
বিভিন্ন সিনট্যাক্স ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, যেহেতু কমান্ডগুলি পাইপ করা যায় bashএবং shএবং সম্ভবত অন্যান্য শাঁসগুলিও, তাই সহজ সমাধান হ'ল sshহেরোডোকসের সাথে শেল ডাকে একত্রিত করা :
ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
মনে রাখবেন যে উপরেরটি বাদ দিয়ে কার্যকর করা /bin/bashসতর্কবার্তা হিসাবে দেখা দেয় Pseudo-terminal will not be allocated because stdin is not a terminal। এছাড়াও নোট করুন যে EOTএকক-কোট দ্বারা বেষ্টিত, যাতে হেরেডোককেbash একটি নওডোক হিসাবে স্বীকৃতি দেয় , স্থানীয় ভেরিয়েবল ইন্টারপোলেশনটি বন্ধ করে দেয় যাতে কমান্ড পাঠ্যটি যেমন পাঠানো হয় তেমন পাস হবে ssh।
আপনি যদি পাইপগুলির অনুরাগী হন তবে আপনি উপরের মতো নীচে আবার লিখতে পারেন:
cat <<'EOT' | ssh user@server /bin/bash
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
/bin/bashউপরের ক্ষেত্রে একই ক্যাভিয়েট প্রযোজ্য।
bashভেরিয়েবল ইন্টারপোলেশনের একাধিক স্তর নিম্নরূপ ব্যবহার করে একটি একক স্ট্রিং হিসাবে মাল্টি-লাইন রিমোট কমান্ডটি পাস করার জন্য আরেকটি বৈধ পন্থা :
ssh user@server "$( cat <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
)"
উপরের সমাধানটি নিম্নলিখিত পদ্ধতিতে এই সমস্যাটি সমাধান করে:
ssh user@serverব্যাশ দ্বারা পার্স করা হয়, এবং হতে ব্যাখ্যা করা হয় sshকমান্ড একটি আর্গুমেন্ট দ্বারা অনুসরণ user@serverপ্রেরণ করা sshকমান্ড
"একটি বিভক্ত স্ট্রিং শুরু হয়, যা শেষ হয়ে গেলে, sshকমান্ডে প্রেরণের জন্য একটি যুক্তি তৈরি করবে , যা এই ক্ষেত্রে sshকার্যকর করতে দূরবর্তী কমান্ড দ্বারা ব্যাখ্যা করা হবেuser@server
$( আউটপুটটি পার্শ্ববর্তী ইন্টারপোল্টেড স্ট্রিং দ্বারা ক্যাপচার করার সাথে সাথে একটি কমান্ড কার্যকর করা শুরু করে
catযা কিছু ফাইল অনুসরণ করে তার সামগ্রীর আউটপুট দেওয়ার একটি কমান্ড। এর আউটপুট catক্যাপচারিং ইন্টারপোলটেড স্ট্রিংয়ে ফিরে আসবে
<<একটি বাশ হেরডোক শুরু
'EOT'নির্দিষ্ট করে যে বংশের নাম EOT OT ইওটির' আশেপাশের একক উদ্ধৃতি উল্লেখ করে যে হেরডোককে একটি নওডোক হিসাবে পার্স করা উচিত , যা হেরডোকের একটি বিশেষ রূপ যেখানে বিষয়বস্তুগুলি ব্যাশ দ্বারা বিভক্ত হয় না, বরং আক্ষরিক বিন্যাসে চলে যায়
যেকোনো সামগ্রীকে মধ্যে সম্মুখীন হয় <<'EOT'এবং <newline>EOT<newline>nowdoc আউটপুট যোগ করা হবে
EOTনোডককে সমাপ্ত করে, ফলস্বরূপ একটি নোডক অস্থায়ী ফাইল তৈরি হয়েছিল এবং কলিং catকমান্ডে ফিরে যায় । catনাওডক আউটপুট দেয় এবং আউটপুটটিকে ক্যাপচারিং ইন্টারপোলটেড স্ট্রিংয়ে ফেরত দেয়
) কমান্ড কার্যকর করার জন্য সমাপ্ত
"ক্যাপচারিং ইন্টারপোলটেড স্ট্রিং শেষ করে। ইন্টারপোল্টেড স্ট্রিংয়ের বিষয়বস্তুগুলি sshএকটি একক কমান্ড লাইন আর্গুমেন্ট হিসাবে ফেরত দেওয়া sshহবে , যা কার্যকর করতে দূরবর্তী কমান্ড হিসাবে ব্যাখ্যা করবেuser@server
আপনার যদি বাহ্যিক সরঞ্জামগুলির মতো এড়ানো দরকার catএবং একটার পরিবর্তে দুটি বিবৃতি দেওয়া মনে না হয় readতবে এসএসএইচ কমান্ড জেনারেট করার জন্য হেরডোক সহ বিল্ট-ইনটি ব্যবহার করুন :
IFS='' read -r -d '' SSH_COMMAND <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
ssh user@server "${SSH_COMMAND}"
ssh user@server /bin/bash <<EOT…