প্রতি 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…