`ssh <host> একটি লগইন শেল, তবে` ssh <হোস্ট> <কম্যান্ড> not না?


12

আমি লক্ষ্য করেছি যে আমি যখন ssh <host> <command>সিনট্যাক্স ব্যবহার করে সরাসরি কোনও এসএসএইচ হোস্টে একটি কমান্ড চালাই, তখন আমি আউটপুট দেখতে পাই .bashrcতবে .bash_profile(বা .profile) এর আউটপুট নয় ।

উদাহরণস্বরূপ, আমি যদি উভয় ফাইলের উপরে নীচের কমান্ডটি রাখি,

echo ${BASH_SOURCE[0]}

এবং ম্যানুয়ালি উত্স .bash_profile(যা উত্সে উত্সগুলি .bashrc), আমি দেখব

$ . .bash_profile
.bash_profile
.bashrc

ssh <host>কমান্ডের ফর্মটি ব্যবহার করে, আমি যদি এসএসএইচ এর মাধ্যমে এই কম্পিউটারে দূরবর্তীভাবে লগ ইন করে দেখি তবে এটি একই আউটপুট । (এবং আমি যদি .bash_profileঅস্থায়ীভাবে অন্য কোথাও স্টো করি তবে এই লাইনগুলির কোনওটিই প্রতিধ্বনিত হয় না।)

যাইহোক, যদি আমি ssh <host> <command>রূপের সাথে প্রত্যন্ত মেশিনে সরাসরি একটি কমান্ড কার্যকর করি তবে sshআউটপুটটি এরকম দেখাচ্ছে:

$ ssh <host> echo foo
/home/rlue/.bashrc
foo

আমার বোঝার মধ্যে পার্থক্য হল .bash_profileএবং এর মধ্যে পার্থক্যটি .bashrcহ'ল পূর্ববর্তীটি লগইন শেলগুলির জন্য হয় যখন উত্তরোত্তর ইন্টারেক্টিভ, অ লগইন শেলগুলির জন্য

আমি নিম্নলিখিতটি শেষ করেছি:

  1. ssh <host>উত্স শুধুমাত্র .bash_profile, যখন
  2. ssh <host> <command>উত্স শুধুমাত্র .bashrc, যার অর্থ
  3. পূর্ববর্তীটি লগইন শেল এবং পরেরটি হয় না।

এই সিদ্ধান্তগুলি কি সঠিক? কেন ssh <host> <command>একটি ইন্টারেক্টিভ, লগ-ইন শেল হিসাবে বিবেচনা করা হয়? কমান্ডটি কার্যকর করতে এসএসএইচ এখনও রিমোট মেশিনে লগইন করছে না?


আউটপুট .bashrc? এই ফাইলটি কোনও আউটপুট উত্পাদন করার কথা নয়। এর যে কোনও আউটপুট .bashrcএসএসএসকে তাদের পরিবহন হিসাবে ব্যবহার করে সমস্ত সরঞ্জামকে ভেঙে ফেলতে পারে।
ক্যাস্পারড

যথেষ্ট ফর্সা। এই ক্ষেত্রে, কয়েকটি লাইন .bashrcএকটি ত্রুটি ছুড়েছিল, একই ধরণের লাইনগুলি .bash_profileছিল না। আপত্তিজনক লাইনগুলি ঠিক করার আগে আমি তাত্পর্যটি অনুসন্ধানের সুযোগ নিয়েছি।
রায়ান লু

উত্তর:


12

ওপেনএসএইচএইচ (সম্ভবত আপনি যা চালাচ্ছেন) লগইন শেলটি তৈরি করবেন কিনা তা সিদ্ধান্ত নেয় এবং আপনি কেবল একটি নির্দিষ্ট কমান্ড না চালালে এটি কেবল এটি করে। থেকে man ssh:

 If command is specified, it is executed on the remote host instead of a
 login shell.

সুতরাং এটি লগইন শেলটি তৈরি করতে চায় কিনা এবং এসএস সার্ভারের জন্য এটি একটি বাস্তবায়ন পছন্দ এবং আপনি যদি চালনার জন্য কোনও আদেশ দেন তবে তা হয় না।

sshকোনও লগইন সম্পাদন করার সময় , যদি আপনি এটি একটি কমান্ড কার্যকর করেন এবং প্রস্থান করেন তবে এটি লগইন পরিবেশ পাওয়ার চেয়ে শেল তৈরির সাথে অনেকটা মিল that দেখে মনে হচ্ছে যে ওপেনএসএসএইচ লেখার লোকেরা এটিকে এই ধরণের কাজের মতো আচরণ করার সিদ্ধান্ত নিয়েছে।

তারা কমান্ডটি কার্যকর করতে একটি অ-ইন্টারেক্টিভ, অ-লগইন শেল তৈরি করে, কারণ এটি অন্য প্রসঙ্গে / শেলের মধ্যে একটি কমান্ড চালানোর আত্মা। সাধারণত, যদিও, অ-ইন্টারেক্টিভ শেলগুলি স্বয়ংক্রিয়ভাবে উত্স হয় না ~/.bashrcযা স্পষ্টভাবে এখানে ঘটছে। bashআসলে এখানে আমাদের সাহায্য করার চেষ্টা করছে। ডক্স থেকে

রিমোট শেল ডিমন দ্বারা আমন্ত্রিত

কোনও নেটওয়ার্ক সংযোগের সাথে সংযুক্ত তার স্ট্যান্ডার্ড ইনপুট দিয়ে কখন এটি চালিত হচ্ছে তা নির্ধারণের জন্য বাশ চেষ্টা করে, যেমন রিমোট শেল ডিমন দ্বারা চালিত হয়, সাধারণত আরশার্ড বা সুরক্ষিত শেল ডিমন এসএসডিডি হয়। যদি বাশ নির্ধারণ করে যে এটি এই ফ্যাশনে চালিত হচ্ছে, তবে যদি ফাইলটি বিদ্যমান থাকে এবং পঠনযোগ্য হয় তবে এটি ~ / .bashrc থেকে আদেশগুলি পড়ে এবং কার্যকর করে। Sh হিসাবে আহ্বান করা হলে এটি এটি করবে না। --Norc বিকল্পটি এই আচরণটি বাধা দেওয়ার জন্য ব্যবহার করা যেতে পারে, এবং --rcfile বিকল্পটি অন্য ফাইলটি পড়তে বাধ্য করতে ব্যবহৃত হতে পারে, তবে আরএসডি বা sshd উভয়ই সেই বিকল্পগুলির সাহায্যে শেলটি আহ্বান করে না বা তাদের নির্দিষ্ট করার অনুমতি দেয় না।


"... এটি লগইন শেলের পরিবর্তে দূরবর্তী হোস্টে কার্যকর করা হয়।" আমি এই দ্বৈতত্ত্ব পাই না। কমান্ড মৃত্যুদন্ড কার্যকর করা হয় দূরবর্তী হোস্ট-এ পরিবর্তে লগ-ইন শেল মধ্যে , বা কমান্ড দূরবর্তী হোস্ট-এ মৃত্যুদন্ড কার্যকর পরিবর্তে লগ-ইন শেল সেখানে মৃত্যুদন্ড কার্যকর হচ্ছে? যদি প্রাক্তন হয় তবে এটি / বা কীভাবে হয়? (এটি সাধারণত উভয়ই নয়? ) যদি পরবর্তীকালে, এটি এখনও কিছু শেলের প্রসঙ্গে নির্বাহ করা হয় , তাই না? (একটি ইন্টারেক্টিভ, অ-লগইন এক?) সুতরাং আমার প্রশ্নটি শব্দার্থবিজ্ঞান সম্পর্কেও রয়েছে - "লগইন শেল" কী বোঝায় এবং ওপেনএসএইচ কেন সিঙ্গল কমান্ডগুলির জন্য একটি তৈরি না করার জন্য ডিজাইন করা হবে?
রায়ান লু

@ রায়ানলিউ প্রতিটি শেলের বিভিন্ন "স্বাদ" কিছু নির্দিষ্ট কাজকে সহজ / আরও সুরক্ষিত / অনুকূলিতকরণ ইত্যাদি করে তোলে an sshএকটি লগইন করার সময় প্রয়োগকারীরা স্পষ্টতই সিদ্ধান্ত নিয়েছিলেন যে কোনও পরিস্থিতিতে যেমন একটি কমান্ড কার্যকর করে ফিরে যেতে বলে, লগইন শেলটি যে অতিরিক্ত পদক্ষেপ নেয় সেগুলি থেকে / লাভের প্রয়োজন হয় না এবং তাই তারা এড়িয়ে যায়। সুতরাং প্রকৃতপক্ষে একটি শেলটি চালিত আছে, আমি বেশিরভাগই পরিবেশ সেটআপ করার জন্য অনুমান করি এবং যেহেতু লগইন করা ব্যবহারকারীকে শেলটি সরবরাহ করা হবে না, তারা এটি ব্যবহার করে যেমন ব্যবহারকারী এটি চালানোর জন্য একটি নতুন শেল শুরু করেছিল had কমান্ড
এরিক রেনৌফ

"সুতরাং প্রকৃতপক্ষে একটি শেল রয়েছে যা চালানোর জন্য আমি বেশিরভাগরূপে পরিবেশ সেটআপ করার জন্য অনুমান করি ..." <তবে আমি কেবল এটি নিয়ে পরীক্ষা-নিরীক্ষা করেছি এবং দেখা যাচ্ছে যে ssh <host> <command>কোনও বিদ্যমান লগইন শেলের পরিবেশ উত্তরাধিকার সূত্রে প্রাপ্ত নয়। উদাহরণস্বরূপ, সোর্স ছাড়াই$ ssh <host> \$PATH পথটি এমনভাবে ফেরত দেয় (বা যেমন এটি ছিল) ... ব্যবহারিক অর্থে, আপনি কেন এই পদক্ষেপটি অবলম্বন করতে চান? .bash_profile.profile
রায়ান লু

"... প্রয়োগকারীরা স্পষ্টতই সিদ্ধান্ত নিয়েছিল যে কিছু পরিস্থিতিতে যেমন একটি কমান্ড কার্যকর করতে এবং ফিরে আসতে বলার জন্য, লগইন শেল থেকে নেওয়া অতিরিক্ত পদক্ষেপগুলি থেকে / উপকারের প্রয়োজন হয় না এবং তাই তারা এড়িয়ে যায়” " <এছাড়াও, বিশেষভাবে এই নকশা পছন্দ সম্পর্কে স্পষ্টতা / অন্তর্দৃষ্টি খুঁজছেন। আমি আমার সংজ্ঞায়িত PATHমধ্যে .profile- ঠিক জিনিস ধরনের আপনি একটি দূরবর্তী হোস্ট-এ একটি অবাধ কমান্ড চালানোর আগে লোড চাই নয় চান?
রায়ান লু

1
@ রায়ানলিউ দ্য বোকস এসএস সার্ভার এসএসএসের স্বতন্ত্র ব্যবহারগুলি পৃথক করে এবং প্রত্যেকটির জন্য অনুমতি দিতে পারে। রিমোট লগইন, রিমোট এক্সিকিউশন, রিমোট কপি, সম্ভবত এটি আপনার বর্ণনামূলক আচরণটি কেন করবে তা বুঝতে সহায়তা করে। রিমোট লগইন (ইন্টারেক্টিভ ব্যবহার) উচ্চ সুরক্ষা পরিবেশে জিজ্ঞাসা করার জন্য খুব বেশি হতে পারে। ওপেনশকে rbash / rksh এবং .Bash_profile বা chroot- এ 'লগআউট' ব্যবহারের মাধ্যমে সীমাবদ্ধ করা যেতে পারে।
bbaassssiiee

4

কেন শাঁস কম পর্যায়ে এই আচরণ মিথ্যার: ssh host( "লগ-ইন শেল" কেস) একটি ব্যবহার pseudoterminal দূরবর্তী হোস্ট-এ মধ্যে যোগাযোগ করতে sshdসার্ভার প্রক্রিয়া এবং শেল; পরিবর্তে এবং এর ssh host commandমধ্যে পাইপ ব্যবহার করে। সিউডোটারমিনালগুলি একটি কমান্ড দোভাষী, যেমন শেল, বা স্ক্রিপ্টিং ভাষার " রিড-ইভাল-প্রিন্ট " মোডের ইন্টারেক্টিভ ব্যবহার করতে প্রয়োজনীয় ; তারা টাইপসকে ব্যাকস্পেসে সক্ষম করার মতো একগুচ্ছ মানব-বান্ধব বৈশিষ্ট্য প্রয়োগ করে। তবে তাদের আরও ওভারহেড রয়েছে এবং (কনফিগারেশনের উপর নির্ভর করে) স্বেচ্ছাসেবক ডেটা অযৌক্তিকভাবে পাস করার অনুমতি দেয় না, সুতরাং এসএসএইচ যখন তাদের সাথে মিথস্ক্রিয়াটি ঘটছে না তখন এগুলি ব্যবহার করা এড়িয়ে যায়।sshdcommand

কখনও কখনও এসএসএইচের কমান্ড / নো কম্যান্ড হিউরিস্টিক এটিকে ভুল করে; এটা দিয়ে ওভাররাইড করা যেতে পারে -tএবং -Tসুইচ। উদাহরণস্বরূপ, একটি রিমোট মেশিনে লগইন করতে এবং তাত্ক্ষণিকভাবে একটি সাসপেন্ড screenসেশনটি পুনরায় সংযুক্ত করতে, আপনাকে এটি করতে হবে ssh -t host screen -R; টার্মিনালের সাথে সংযুক্ত না হওয়ার বিষয়ে অভিযোগ করার ssh host screen -Rকারণ হবে screen। আপনি যখন বাস্তবে ব্যবহার করতে চান তখন আমি এমন পরিস্থিতির কথা ভাবতে পারি না -T, তবে আপনি যদি কখনও কোনওটি খুঁজে পান তবে তা সেখানে।


1

প্রথমে আপনাকে বিভিন্ন ধরণের দেখতে হবে, আপনি এটি পড়তে পারেন:

/unix/170493/login-non-login-and-interactive-non-interactive-shells

এখন আপনি যদি আপনার বাশার্ক খুলেন তবে আপনি এটি শুরুতে দেখতে যাবেন:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

এর অর্থ হ'ল আপনি কীভাবে সিস্টেমে অ্যাক্সেস করছেন তার উপর নির্ভর করে এই ফাইলটি কোডটির ভিতরে কোড লোড করে বা না।


ঠিক আছে, তবে এটি একটি আকর্ষণীয় প্রশ্ন উত্থাপন করে: .bashrcএটি একটি ইন্টারঅ্যাক্টিভ প্রসঙ্গে ( যেমন, যদি কোনও "প্রম্পট বিবৃতি" / $PS1পরিবর্তনশীল না থাকে) বলা হয় তবে এটি উত্সাহিত না হওয়ার জন্য রচনা করা যেতে পারে । তবে সিদ্ধান্তগতভাবে ssh <host> <command> অ-ইন্টারেক্টিভ ; এটি কোনও কমান্ড প্রম্পট উত্থাপন করে না । সুতরাং কেন ওপেনএসএইচ .bashrcএই আপাতদৃষ্টিতে লগইন, অ ইন্টারেক্টিভ ব্যবহারের ক্ষেত্রে নন-লগইন, ইন্টারেক্টিভ প্রম্পট (উত্সের চেষ্টা করে এমন একটি) তৈরির জন্য ডিজাইন করা হবে ??
রায়ান লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.