बैश $ PATH को ठीक से निर्दिष्ट करने पर भी कमांड को खोजने में असमर्थ क्यों?


9

मैं फ़ाइल / etc / प्रोफ़ाइल में अपने आदेश के लिए पथ निर्दिष्ट कर रहा हूँ :

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

मेरी आज्ञा में स्थित है:

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

इसलिए, जब मैं "इको $ पाथ" का प्रदर्शन करता हूं, तो आउटपुट ऐसा दिखता है:

$ 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

कृपया मुझे समझाएं कि SSH सत्र के दौरान ydisplay खोजने में असमर्थ बैश और इस समस्या से बचने के लिए SSH को ठीक से कैसे कॉन्फ़िगर करें।

अधिक, अगर मैं स्थानीय फ़ाइल में $ PATH निर्दिष्ट करता हूं। वर्तमान उपयोगकर्ता में .ashrc सभी सही ढंग से काम करते हैं। लेकिन मैं प्रत्येक उपयोगकर्ता के लिए बहुत सारी फ़ाइलों को निर्दिष्ट करने के बजाय केवल एक फ़ाइल को संशोधित करना चाहता हूं। यह मैं क्यों पूछ रहा हूं।


1
बस ydisplayकाम चल रहा है ? ssh 127.0.0.1 /usr/app/cpn/bin/ydisplayकाम करता है ?
बनगुंगिन

@ user1129682 हाँ, पूर्ण निर्दिष्ट नाम कार्यों के साथ ydisplay और बस ydisplay काम करता है
SIGSEGV

जब आप लॉग नहीं होते हैं (आपके पास एक दूरस्थ सत्र नहीं है) लेकिन केवल दूरस्थ रूप से एक कमांड भेजने से आपके पास पर्यावरण चर तक पहुंच नहीं होती है क्योंकि आपकी .bashrc / .profile फ़ाइलों को निष्पादित नहीं किया जाता है। यही कारण है कि वे वर्तमान सत्र के लिए चर सेट करने के लिए जिम्मेदार हैं।
mnmnc

14
बस एक तरफ ध्यान दें: ssh 127.0.0.1 echo $PATHऐसा नहीं करता है जो आप सोच सकते हैं कि यह करता है: शेल $ PATH का विस्तार करता है इससे पहले कि ssh को भी निष्पादित किया जाता है, ताकि कुछ भी साबित या अस्वीकृत न हो।
उलरिच श्वार्ज

2
इस सवाल का कुछ मदद हो सकती है
bsd

जवाबों:


5

tl; डॉ

के बजाए रनिंग ssh 127.0.0.1 ydisplayसोर्स । इसके बजाय अपना रास्ता बदलें ।~/.bashrc/etc/profile~/.bashrc

विवरण

केवल समय /etc/profileपढ़ा जाता है जब आपका शेल "लॉगिन शेल" होता है।

से बैश संदर्भ मैनुअल :

जब बैश को एक लॉगिन शेल के रूप में आमंत्रित किया जाता है, ... यह पहले फ़ाइल / etc / प्रोफाइल से कमांड पढ़ता है और निष्पादित करता है

लेकिन जब आप दौड़ते हैं ssh 127.0.0.1 ydisplay, bashतो लॉगिन शेल के रूप में शुरू नहीं किया जाता है। फिर भी यह एक अलग स्टार्टअप फ़ाइल पढ़ता है। बैश संदर्भ मैनुअल का कहना है:

जब ... द्वारा निष्पादित ... sshd। ... यह आदेशों को पढ़ता है और उन पर अमल करता है~/.bashrc

तो आपको अपनी PATHसेटिंग्स को अंदर रखना चाहिए ~/.bashrc

अधिकांश प्रणालियों, ~/.bash_profileस्रोतों पर ~/.bashrc, इसलिए आप अपनी सेटिंग्स को केवल ~/.bashrcदोनों फाइलों में डालने के बजाय रख सकते हैं।

वहाँ सभी उपयोगकर्ताओं के लिए सेटिंग बदलने के लिए कोई मानक तरीका है, लेकिन सबसे प्रणालियों एक है /etc/bashrc, /etc/bash.bashrc, या इसी तरह।

असफल होना, सेट अप करना pam_envऔर PATHसेटिंग को अंदर रखना /etc/environment

यह सभी देखें:


1

ऐतिहासिक रूप से, जब आपने (पाठ कंसोल पर, और क्या?) लॉग इन किया , तो प्रोफाइल फाइल ( /etc/profileऔर ~/.profile) का इस्तेमाल किया गया।

  • सत्र के लिए पर्यावरण चर और अन्य पैरामीटर (जैसे umask) सेट करें।
  • सत्र की शुरुआत में अतिरिक्त कार्यक्रम चलाएं (जैसे ईमेल अधिसूचना)।
  • सत्र के लिए प्रोग्राम चलाएं, यदि शेल से अलग है (उदाहरण के लिए एक और शेल या एक्स विंडो)।
  • टर्मिनल पैरामीटर (जैसे stty) सेट करें ।
  • शेल पैरामीटर सेट करें (जैसे उपनाम)।

इन सभी उद्देश्यों की पहचान बाद में अलग-अलग नहीं की गई थी। क्योंकि प्रोफाइल स्क्रिप्ट ऐसी चीजें कर सकती हैं, जो केवल एक संवादात्मक सत्र (टर्मिनल इंटरेक्शन, अन्य कार्यक्रमों को शुरू करने) में समझ में आती हैं, जब दूरस्थ शेल मंगलाचरण ( आरएचएस ) पेश किया गया था, आरएच के मेक ने दूरस्थ शेल को लॉगिन शेल के रूप में लागू नहीं करने का फैसला किया, ताकि प्रोफाइल स्क्रिप्ट निष्पादित न हो। (कुछ संस्करणों में rshdदूरस्थ शेल को लॉगिन शेल के रूप में चलाने का विकल्प होता है।) SSH ने rsh के लिए ड्रॉप-इन प्रतिस्थापन होने के लिए इस व्यवहार की प्रतिलिपि बनाई।

यदि आप अपनी प्रोफ़ाइल स्क्रिप्ट निष्पादित करना चाहते हैं, तो आप उन्हें स्पष्ट रूप से लागू कर सकते हैं।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.