मैं $ PATH को कैसे सेट करूं कि `ssh उपयोगकर्ता @ होस्ट कमांड` काम करता है?


129

मुझे ऐसा कोई नया $ PATH सेट करने के लिए प्रतीत नहीं हो सकता है जिसका उपयोग कमांड के माध्यम से निष्पादित करते समय किया जाता है ssh user@host command। मैंने export PATH=$PATH:$HOME/new_pathरिमोट मशीन पर ~ / .bashrc और ~ / .profile को जोड़ने की कोशिश की है , लेकिन निष्पादित करने से ssh user@host "echo \$PATH"पता चलता है कि परिवर्तन नहीं उठाया गया है (यह दिखाता है / usr / local / sbin: / usr / local / bin: / usb) sbin: / usr / bin: / sbin: / बिन: / usr / खेल)। रिमोट मशीन Ubuntu 8.04 चल रहा है।

मुझे यकीन है कि मैं इसे / etc / प्रोफाइल में हैक कर सकता हूं, लेकिन यह एक साफ समाधान नहीं है और यह तभी काम करता है जब किसी की रूट एक्सेस होती है।


1
मैंने export PATH=$PATH:$HOME/new_pathदोनों को जोड़ने की कोशिश की है ~ / .bash_login और ~ / .bash_profile (पहले-आज़माए गए ~ / .bashrc और ~ / .profile के अलावा)। न काम करता है। दोनों ही मामलों में मुझे फाइल बनानी थी।
डेनवर जिंजेरिच

मेरे विशेष उपयोग के मामले में, ssh को भेजे गए कमांड को संशोधित करना आसान नहीं है। मैं stfufs ( गुरु- group.fi/too/sw/stfufs ) का उपयोग कर रहा हूं , जो स्वयं ssh कमांड का निर्माण करता है। मुझे पता है कि इसकी विधि एक महान समाधान नहीं है, लेकिन इसे स्टफ्स को संशोधित किए बिना ठीक करना अच्छा होगा।
डेनवर जिंजरिच

आप stfufs के रास्ते में एक ssh आवरण रख सकते हैं, असली ssh को संशोधित आर्ग के साथ बुला सकते हैं, अगर यह आसान हो
Hasturkun

जवाबों:


179

जैसा कि ग्रेविटी ने कहा, ~ / .bashrc वही है जो आप चाहते हैं, क्योंकि यह गैर-संवादात्मक गैर-लॉगिन गोले द्वारा sourced है।

मुझे उम्मीद है कि आपको जो समस्या है वह डिफ़ॉल्ट Ubuntu ~ / .bashrc फ़ाइल के साथ करनी होगी। यह आमतौर पर कुछ इस तरह से शुरू होता है:

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

आप इस लाइन से पहले गैर-संवादात्मक गोले के लिए कुछ भी करना चाहते हैं ।


1
हां, मैंने export PATH=$PATH:$HOME/new_pathउस लाइन को ऊपर ले जाया और यह काम कर गया। धन्यवाद!
डेनवर जिंजरिच

3
.bashrc अविश्वसनीय है। आदमी बैश: "बैश यह निर्धारित करने का प्रयास करता है कि यह कब नेटवर्क कनेक्शन से जुड़े अपने मानक इनपुट के साथ चलाया जा रहा है"। यह आरएचईएल पर काम करता है, लेकिन आर्कलिनक्स पर नहीं। मुझे डिफ़ॉल्ट PATH को बदलने के लिए / etc / वातावरण को बदलना पड़ा
बेसिन

आपको .zshenvzsh उपयोगकर्ताओं के लिए उल्लेख करना चाहिए , मुझे अन्य उत्तरों पर टिप्पणियों में इसे खोजने में काफी समय लगा
माइक

30

क्या आपके पास ~/.bash_loginया है ~/.bash_profile?

इन फ़ाइलों के लिए इंटरैक्टिव मोड चेक में बैश करें, और इस क्रम में पहले मौजूदा एक का उपयोग करता है :

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

इसलिए यदि आपके पास एक है ~/.bash_profile, तो आप जो भी बदलाव करते हैं, ~/.profileवह अनदेखा रह जाएगा।

गैर-संवादात्मक मोड में बैश कभी - कभी फ़ाइल पढ़ता है ~/.bashrc(जो इंटरैक्टिव स्क्रिप्ट से भी अक्सर स्रोत होता है।) "कभी-कभी" से मेरा मतलब है कि यह वितरण-निर्भर है: काफी अजीब तरह से, इसे सक्षम करने के लिए संकलन-समय विकल्प है। । डेबियन ~/.bashrcपढ़ने में सक्षम बनाता है , जबकि आर्क नहीं करता है।

ssh लगता है कि गैर-इंटरैक्टिव मोड का उपयोग कर रहा है, इतना ~/.bashrcपर्याप्त होना चाहिए। इस तरह की समस्याएं होने पर, मैं आमतौर पर कुछ इको जोड़कर देखता हूं कि क्या फाइलें चलाई जा रही हैं।


इकोस को जोड़ने से मदद मिली ... लेकिन मैं अभी भी 'ssh -X remotemachine "xterm" को निष्पादित करने के लिए एक तरीके का पीछा कर रहा हूं और / etc / प्रोफाइल और / / होम / यूज़रनेम / .bb_profile से पूरी प्रणाली / उपयोगकर्ता पथ है। अगर मैं कमांड में दोनों फ़ाइल स्रोत, यह काम करता है .. लेकिन इसकी बदसूरत:)।
जेस

आप कैसे जानते हैं कि "गैर-इंटरैक्टिव मोड में बैश फ़ाइल पढ़ता है ~/.bashrc"? मैं इस कथन को मैनपेज में नहीं देखता। धन्यवाद
NKnight

4
यदि आप स्रोत के लिए एक गैर-संवादात्मक गैर-लॉगिन शेल चाहते हैं ~/.bashrc, तो ऐसा लगता है कि आपको पर्यावरण चर को अतिरिक्त रूप से सेट करने की आवश्यकता है BASH_ENV; देख superuser.com/a/585699/100843 । गैर-संवादात्मक लॉगिन गोले के लिए, आपको संभवतः आपके द्वारा उल्लिखित तीन स्टार्टअप लिपियों में से एक को संशोधित करना होगा।
एकरात्रि

3
ZSH के लिए गैर-संवादात्मक फ़ाइल है:.zshenv
गणित

2
@ हाथ .zshenvहमेशा खट्टे होते हैं; यह कोई फर्क नहीं पड़ता कि यह इंटरैक्टिव है या नहीं।
जोएल

19

ssh प्रलेखन कहता है:

यदि कमांड निर्दिष्ट है, तो इसे लॉगिन शेल के बजाय रिमोट होस्ट पर निष्पादित किया जाता है।

यही कारण है कि bashrc फ़ाइलों को जोड़ने से काम नहीं होता है। हालाँकि आपके पास निम्नलिखित विकल्प हैं:

  1. यदि PermitUserEnvironmentविकल्प sshd config में सेट है, तो आप अपनी PATH सेटिंग को इसमें जोड़ सकते हैं~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. यह मेरे sshd config में सेट नहीं है और man sshd_configयह डिफ़ॉल्ट रूप से बंद है, इसलिए यह संभव नहीं है कि यह समाधान अधिकांश लोगों के लिए काम करेगा। 2. यह काम करेगा, लेकिन मैं ssh को भेजे गए कमांड को आसानी से संशोधित नहीं कर सकता (मेरे प्रश्न पर दूसरी टिप्पणी देखें)।
डेनवर जिंजरिच

1
1. अपेक्षा के अनुसार काम नहीं करता है, क्योंकि ~ / .ssh / पर्यावरण में, आप पथ को पथ से नहीं जोड़ सकते, क्योंकि $ PATH हल नहीं होगा।
not2savvy

8

आप हमेशा कह सकते हैं:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

इस समाधान को दूरस्थ मशीन पर किसी भी बदलाव की आवश्यकता नहीं है, जो अच्छी बात है।
रॉनी एंडरसन

2

@Signpolyma जवाब के अलावा, आपको इन लाइनों से पहले अपना निर्यात जोड़ना होगा

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

मैंने वास्तव में इन पंक्तियों पर पूरी तरह से टिप्पणी की है - उबंटू में ~ / .bashrc 16.04 LTS डेस्कटॉप में पाया गया। सब कुछ काम नहीं करता। इसके अलावा PermitUserEnvironment को हां पर सेट करें।
एर्नी एस

2

बस अपने आप में एक ही समस्या थी, इसे हल किया:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.