বাশ কেন command PATH সঠিকভাবে নির্দিষ্ট করা সত্ত্বেও আদেশ সন্ধান করতে অক্ষম?


9

আমি ফাইল / ইত্যাদি / প্রোফাইলে আমার কমান্ডের পথ উল্লেখ করছি :

export PATH=$PATH:/usr/app/cpn/bin

আমার কমান্ডটি এখানে অবস্থিত:

$ which ydisplay 
/usr/app/cpn/bin/ydisplay

সুতরাং, যখন আমি "প্রতিধ্বনি $ PATH" আউটপুট সম্পাদন করি তখন মনে হয়:

$ echo $PATH
...:/usr/app/cpn/bin

এবং সবকিছু ঠিক আছে, কিন্তু যখন আমি এসএসএইচ এর মাধ্যমে আমার কমান্ডটি চালু করার চেষ্টা করছি তখন আমি ত্রুটি পাচ্ছি:

$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found

তবে আমার পথটি এখনও বিদ্যমান:

$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

দয়া করে আমাকে ব্যাখ্যা করুন কেন বাশ এসএসএইচ অধিবেশন চলাকালীন ydisplay খুঁজে পেতে পারেনি এবং কীভাবে এই সমস্যাটি এড়াতে এসএসএইচকে সঠিকভাবে কনফিগার করা যায়।

আরও বেশি, যদি আমি স্থানীয় ফাইলে $ PATH নির্দিষ্ট করে থাকি তবে বর্তমান ব্যবহারকারীর মধ্যে বাশার্ক সমস্ত সঠিকভাবে কাজ করে। তবে আমি প্রতিটি ব্যবহারকারীর জন্য প্রচুর ফাইল নির্দিষ্ট করে কেবল একটি ফাইল পরিবর্তন করতে চাই। এই কারণেই আমি জিজ্ঞাসা করছি।


1
শুধু ydisplayকাজ চলছে ? না ssh 127.0.0.1 /usr/app/cpn/bin/ydisplayকাজ করে?
বনাঙ্গুইন

@ user1129682 হ্যাঁ, পূর্ণ নির্দিষ্ট নাম কাজের সঙ্গে ydisplay এবং মাত্র ydisplay কাজ
SIGSEGV

আপনি যখন লগইন না হয়ে থাকেন (আপনার কাছে রিমোট সেশন নেই) তবে কেবল কমান্ডটি রিমোট প্রেরণ করলেই আপনি একইভাবে পরিবেশের ভেরিয়েবলের অ্যাক্সেস পাবেন না কারণ আপনার .bashrc /। প্রোফাইল ফাইলগুলি কার্যকর হয় না। এ কারণেই তারা বর্তমান সেশনের জন্য ভেরিয়েবল সেট করার জন্য দায়বদ্ধ।
mnmnc

14
কেবলমাত্র একটি পার্শ্ব নোট: ssh 127.0.0.1 echo $PATHআপনি যা ভাবেন তা করেন না যা এটি করে: শ্যাশ এমনকি কার্যকর করার আগে AT PATH প্রসারিত করে, যাতে কোনও কিছুই প্রমাণিত বা অসন্তুষ্ট হয় না।
উলরিচ শোয়ার্জ

2
এই স্ট্যাকওভারফ্লো প্রশ্নটি কিছুটা সাহায্যের হতে পারে
বিএসডি

উত্তর:


5

TL; ড

পরিবর্তে চলমান ssh 127.0.0.1 ydisplayউত্স । পরিবর্তে আপনার পথ পরিবর্তন করুন ।~/.bashrc/etc/profile~/.bashrc

বিস্তারিত

/etc/profileআপনার শেলটি যখন "লগইন শেল" হয় কেবল তখনই পঠিত হয়।

থেকে ব্যাশ রেফারেন্স ম্যানুয়াল :

যখন ব্যাশটি লগইন শেল হিসাবে আহ্বান করা হয় ... ... এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে আদেশগুলি পড়ে এবং সম্পাদন করে

কিন্তু আপনি যখন চালানো ssh 127.0.0.1 ydisplay, bashলগ-ইন শেল হিসাবে শুরু করা হয় না। তবুও এটি আলাদা স্টার্টআপ ফাইলটি পড়ে না। ব্যাশ রেফারেন্স ম্যানুয়াল বলেছেন:

কখন ... এসএসডিডি দ্বারা মৃত্যুদন্ড কার্যকর করা হয়েছে ... এটি কমান্ডগুলি পড়ে এবং কার্যকর করে~/.bashrc

সুতরাং আপনার নিজের PATHসেটিংসটি .োকানো উচিত ~/.bashrc

বেশিরভাগ সিস্টেমে, ~/.bash_profileউত্সগুলিতে ~/.bashrc, যাতে আপনি নিজের সেটিংস ~/.bashrcদুটি ফাইলের মধ্যে না রেখে কেবলমাত্র এতে রেখে দিতে পারেন।

সেখানে সকল ব্যবহারকারীর জন্য সেটিং পরিবর্তন করার কোন মান পথ বাকি, কিন্তু অধিকাংশ সিস্টেমে একটি আছে /etc/bashrc, /etc/bash.bashrcবা অনুরূপ।

এটি ব্যর্থ হয়ে সেট আপ করুন pam_envএবং PATHসেটিংসটি ভিতরে রাখুন /etc/environment

আরো দেখুন:


1

Orতিহাসিকভাবে, প্রোফাইল ফাইলগুলি ( /etc/profileএবং ~/.profile) যখন আপনি লগইন করা হত (পাঠ্য কনসোলে, অন্য কী?) এবং বহু উদ্দেশ্য পূরণ করেছিলেন:

  • সেশনটির জন্য পরিবেশের ভেরিয়েবল এবং অন্যান্য প্যারামিটার (যেমন umask) সেট করুন।
  • অধিবেশন শুরুর দিকে অতিরিক্ত প্রোগ্রাম চালান (যেমন ইমেল বিজ্ঞপ্তি)।
  • শেল থেকে আলাদা হলে সেশনটির জন্য প্রোগ্রামটি চালান (উদাঃ অন্য শেল বা এক্স উইন্ডো)।
  • টার্মিনাল প্যারামিটার সেট করুন (যেমন stty)।
  • শেল প্যারামিটারগুলি সেট করুন (যেমন এলিয়াস)।

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

আপনি যদি নিজের প্রোফাইল স্ক্রিপ্টগুলি সম্পাদন করতে চান তবে আপনি সেগুলি স্পষ্টভাবে প্রার্থনা করতে পারেন।

ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'

.শেলের ভিতরে প্রোফাইল স্ক্রিপ্টগুলি লোড করার কমান্ডটি নোট করুন : এগুলি শেলটির অভ্যন্তরে কার্যকর করার জন্য আদেশ রয়েছে, বাহ্যিক প্রোগ্রাম নয়।

আপনি যদি সমস্ত ব্যবহারকারীর জন্য বিশ্বব্যাপী একটি পরিবেশের পরিবর্তনশীল সেট করতে চান তবে অনেক সিস্টেমে অন্য পদ্ধতি রয়েছে: এটির সংজ্ঞা দেওয়ার পরিবর্তে এটি /etc/profileসংজ্ঞায়িত করুন /etc/environment। এই ফাইলটি pam_envমডিউলটির মাধ্যমে পড়ে ; এটি পড়ার জন্য বেশিরভাগ লিনাক্স বিতরণ সেট আপ করা হয়।

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

  • ইন্টারেক্টিভ শেলগুলিতে যা লগইন শেল নয়;
  • অ-ইন্টারেক্টিভ শেলগুলিতে যেগুলি লগইন শেল নয়, যদি বাশ মনে করে যে এটি দ্বারা চালিত হয়েছে rshdবা sshd

আপনি যখন ssh ওভার কমান্ড চালান, আপনি দ্বিতীয় ক্ষেত্রে হন। আপনি পড়া দ্বারা আপনার প্রোফাইল পড়েছেন তা সাজাতে পারেন /etc/profileএবং .profileথেকে .bashrc। আপনার মধ্যে নিম্নলিখিত কোড অন্তর্ভুক্ত করুন ~/.bashrc:

case $- in
  *i*) :;; # this is an interactive shell, fine
  *) # This is not an interactive shell! This must be a non-interactive remote shell session.
    . /etc/profile; . ~/.profile
    return;;
esac
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.