`সিডি` কমান্ড এসএসএইচ এর মাধ্যমে কেন কাজ করে না?


41

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

ssh root@server /bin/sh -c "cd /boot && ls -l"

আমার বিস্ময়ের জন্য ফাইলগুলি তালিকাভুক্ত /rootনয় /boot। তবে আমি যদি /bin/shটার্মিনাল থেকে পুরো কমান্ডটি চালিত করি তবে এটি সঠিকভাবে ফাইলগুলি মুছে cdফেলবে /boot

এখানে কি হচ্ছে?


1
এটি উদাহরণ না হলে আপনি কেন ব্যবহার করছেন না ssh root@server /bin/sh -c "ls -l /boot"?
অচপল

আপনি জিজ্ঞাসা এটা মজার। আমি মন্তব্য করার আগে এটি করার চেষ্টা করেছি এবং এখনও ডিরেক্টরি তালিকা পাই নি।
আনংসট

2
@ নির্মোহ কারণ আমি সত্যিই টার চেয়েছিলাম, এবং টার / বুটে ফলাফলের মধ্যে বুট পাথ অন্তর্ভুক্ত করা হবে, যা আমি চাই না
আমরোজ বিজ্জাক

উত্তর:


35

ssh আপনাকে যেমন একটি কমান্ড সুনির্দিষ্টভাবে নির্দিষ্ট করতে দেয় না, যেমনটি আপনি করেছেন, দূরবর্তী হোস্টে এক্সিকিউপিতে পাস করার জন্য যুক্তিগুলির একটি সিরিজ হিসাবে। পরিবর্তে এটি সমস্ত আর্গুমেন্টকে স্ট্রিংয়ে যুক্ত করে এবং এগুলি একটি দূরবর্তী শেলের মাধ্যমে চালায়। এটি আমার মতে এসএসএস-এর একটি প্রধান নকশার ত্রুটি হিসাবে দেখা দেয় ... এটি বেশিরভাগ উপায়ে একটি ভাল-আচরণযুক্ত ইউনিক্স সরঞ্জাম, তবে যখন কোনও আদেশ সুনির্দিষ্ট করার সময় আসে তখন এটি আরগভের পরিবর্তে একক একক স্ট্রিং ব্যবহার করতে পছন্দ করে, যেমন এটি এমএসডোস বা অন্য কিছুর জন্য ডিজাইন করা হয়েছিল!

যেহেতু ssh আপনার কমান্ডটি একটি একক স্ট্রিং হিসাবে পাস করবে তাই sh -cআপনাকে নিজের সরবরাহ করার দরকার নেই sh -c। আপনি যখন করেন, ফলাফল হয়

sh -c '/bin/sh -c cd /boot && ls -l'

মূল উদ্ধৃতি হারিয়ে গেছে। সুতরাং পৃথক কমান্ডগুলি হ'ল &&:

`/bin/sh -c cd /boot`
`ls -l`

এর মধ্যে প্রথমটি "সিডি" এবং $0= কমান্ড পাঠ্য সহ একটি শেল চালায় "boot"। "সিডি" কমান্ডটি সাফল্যের সাথে শেষ করেছে, এটি $0অপ্রাসঙ্গিক, এবং /bin/sh -cসাফল্যের ইঙ্গিত দেয়, তারপরে ls -lঘটে।


2
যদিও আমি একমত যে এটি দুর্ভাগ্যজনক যে এটির sshমতো আচরণ করে, যদি তা না হয় তবে এটি বলা হত sexec, না ssh। (যা সে ক্ষেত্রে একই আচরণ করে) এবং ( কমান্ড লাইন পাস না হলে বলা হয় ) sshএর সুরক্ষিত সংস্করণ । এটি কেবল দুর্ভাগ্যজনক যে এটি কার্যকরও করে না । rshrloginrshrloginrexec
স্টাফেন চেজেলাস

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

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

ধন্যবাদ। এটি সত্যিই সাহায্য করেছে, এসএসপি। যেহেতু আমি ssh দিয়ে টানেল করছি। আউটপুট হিসাবে '1 && 2' পেতে আমাকে ssh -t machine1 'ssh -t machine2 "প্রতিধ্বনি 1" 1 && 2 \ "" করতে হয়েছিল। যে কয়েক ঘন্টা হত্যা।
ghayes

যদি আপনি কোনও কমান্ডটি যথাযথভাবে পাস করতে চান, যেমন "$ @" থেকে, আপনি এটি ব্যবহার করতে পারেন: "`printf "%q " "$@"`"বাশ এর printfসাথে একটি স্ট্রিং বা শেল পলায়নের সাথে স্ট্রিং উদ্ধৃত করতে পারেন ।
স্যাম ওয়াটকিন্স

36

এটি একটি উদ্ধৃতি ইস্যু। Ssh ইতিমধ্যে কমান্ডটি চালায় যা আপনি এটি শেলের মধ্যে দিয়ে যান। আপনি একাধিক প্যারামিটারগুলি পাস করার পরে, তারা স্ট্রিং তৈরির জন্য একটি স্পেস দিয়ে সংযুক্ত করা হয়। সুতরাং আপনি যে রিমোট কমান্ডটি দূরবর্তীভাবে চালাচ্ছেন তা হ'ল /bin/sh -c cd /boot && ls -l(কোনও উদ্ধৃতি নেই, কারণ আপনার কমান্ডের উদ্ধৃতিগুলি স্থানীয় শেল দ্বারা ব্যাখ্যা করা হয়েছিল)।

/bin/sh -c cd /bootরান করে /bin/shএবং কমান্ডটি চালাতে cdএবং সেট করতেও $0বলে /boot। এটি সম্পন্ন হয়ে গেলে, প্যারেন্ট শেলটি (যার দ্বারা চালু করা হয় sshd) চালিত হয় ls -l

আপনার ক্ষেত্রে, sh -cআপনার রিমোট শেল (যেমন /etc/passwdবা অন্য পাসওয়ার্ডের ডাটাবেসে উল্লিখিত ) এই আদেশটি না বোঝে কেবল এটিকে সম্পূর্ণ অকেজো ।

ssh root@server "cd /boot && ls -l"

আপনার যদি অন্য কোনও শেলটি চালিত করতে হয়, তবে আপনাকে অবশ্যই রিমোট কমান্ডটি উদ্ধৃত করতে হবে যাতে এটি দ্বারা আটকানো দূরবর্তী শেলটি দ্বারা বিস্তার থেকে রক্ষা পাওয়া যায় sshd। উদাহরণস্বরূপ, যদি আপনার লগইন শেলটি ড্যাশ হয় এবং আপনি বাশ কমান্ডটি চালাতে চান:

ssh root@server 'bash -c "cd ~bob && ls -l"'

8

আমি মনে করি কীভাবে শেল দ্বারা বিকল্পগুলি পার্স করা হচ্ছে তার সাথে এর আরও করার আছে। উদাহরণস্বরূপ, এটি কাজ করে:

$ ssh root@server /bin/sh -c '"cd /boot && ls -l"'

এটি আপনার আদেশ হিসাবে একই সমস্যা আছে:

$ ssh root@server /bin/sh -c 'cd /boot && ls -l'

আপনি যদি -vস্যুইচ সক্ষম করে থাকেন তবে আপনি sshকী দেখতে পাচ্ছেন তা দেখতে পাবেন:

প্রথম আদেশ:

ডিবাগ 1: পাঠানো কমান্ড: / বিন / শ-সি "সিডি / বুট && ls -l"

২ য় আদেশ:

ডিবাগ 1: পাঠানো কমান্ড: / বিন / শ-সিসি / বুট && ls -l

সাধারণত sshআপনার মাধ্যমে কমান্ডগুলি প্রেরণ করার সময় বিভিন্ন স্তরগুলি সরিয়ে ফেলার কারণে আপনার উদ্ধৃতিগুলিতে উদ্ধৃতি এবং মোড়কের মুদ্রায় বিশেষ মনোযোগ দিতে হবে। প্রেরণেও বিরক্ত করবেন না /bin/sh

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

$ ssh root@server 'free -m' > /tmp/memory.status

বা এটি, যেখানে আপনি একটি দূরবর্তী সার্ভারে একটি ডিরেক্টরি ট্যারি করেন এবং এটি স্থানীয় সিস্টেমে তৈরি করেন:

$ ssh remotehost 'tar zcvf - SOURCEDIR' | cat > DESTFILE.tar.gz

তথ্যসূত্র


4

সাধারণত কোন শেলটি ব্যবহার করা উচিত তা আপনাকে নির্দিষ্ট করতে হবে না। এইটা কাজ করে:

ssh user@host "cd /boot && pwd"

তবে যদি আপনার ডিফল্ট শেল সমস্যাযুক্ত হয়, তবে নিশ্চিত হয়ে নিন যে আপনি শেল অনুরোধ সহ পুরো কমান্ডটি উদ্ধৃত করেছেন । নীচের যে কোনও একটি কাজ

ssh user@host '/bin/sh -c "cd /boot && pwd"'
ssh user@host "/bin/sh -c \"cd /boot && pwd\""

মনে রাখবেন যে cd /boot && pwdবড় পরিবারগুলির সমস্ত শেলগুলিতে (বোর্ন, সিএসএস, আরসি) /bin/sh -c "cd /boot && pwd"কাজ করার সময়, যদি রিমোট শেলটি rcপরিবারের "বিশেষ না হয় তবে কাজ করবে না ।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.