शश पर स्टार्टअप फ़ाइलें


10

मेरे पास कुछ महत्वपूर्ण कमांड हैं जिन्हें मुझे किसी भी शेल के शुरू होने से पहले निष्पादित करने की आवश्यकता है। SSH कमांड ( ssh host somecommand) और कमांड चलाने वाले अन्य प्रोग्राम में SSH कमांड को पास करने के लिए यह आवश्यक है ।

मेरे .profileपास यह है:

ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin

हालाँकि, यह विफल रहता है:

W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin

गायब पेटीएम विकल्पों पर ध्यान दें

श प्रोफाइल के लिए उचित नाम क्या है? नोट: मेरे पास रूट एक्सेस नहीं है और यह अन्य उपयोगकर्ताओं के लिए लागू नहीं है। क्या इसे करने का और कोई तरीका है?


संपादित करें: यह /bin/shलिंक के लिए प्रकट होता है bash, जो आश्चर्य की बात नहीं है। आश्चर्य की बात यह है कि मेरी प्रोफ़ाइल को अभी भी अनदेखा किया गया है। कोई सुझाव?


1
मुझे यह महसूस करने का मन नहीं है कि मैन पेज में क्या है, इसलिए अनुभाग 'इनवोकेशन' के अंतर्गत बैश मैन पेज देखें। यह शीर्ष के पास है और उन सभी का वर्णन करता है जिन्हें आपको जानना चाहिए।
कैमह

आप प्रयोग करके देख सकते हैं ssh name@host -t echo $PATH
गर्ट डिक

@ गर्ट आउटपुट एक ही है
TheLQ

@camh क्या आपको लगता है कि मैं यह सवाल पूछूंगा कि क्या मैंने पहले ही मैन पेज चेक नहीं किया है? मैंने उन्हें कई बार + अन्य पोस्ट पढ़ा है, लेकिन कभी भी इस विशिष्ट मुद्दे का जवाब नहीं मिल सका, क्योंकि मुझे यकीन नहीं है कि ssh कमांड और अन्य प्रोग्राम की कमांड्स
किसमें

1
@ TheLQ: मैं आपको नहीं जानता इसलिए मुझे नहीं पता कि आप मैन पेज की जाँच करेंगे। मुझे पता था कि उत्तर सही थे, इसलिए मैंने इसे शब्द के लिए दोहराने के बजाय, मैंने आपको इसे इंगित किया। एक अधिक विशिष्ट सूचक गैर-संवादात्मक गोले को देखना है क्योंकि यह आपके ssh परिदृश्य है। यदि मैन पेज में कुछ स्पष्ट नहीं है, तो शायद आप अधिक विशिष्ट प्रश्न पूछ सकते हैं।
Camh

जवाबों:


8

यह ध्यान देने योग्य है कि आप अपने प्रश्न में जिस कमांड का उल्लेख करते हैं

ssh name@host echo $PATH

बहुत ज्यादा उपयोगी कभी नहीं होगा। $ PATH के लिए चर प्रतिस्थापन आपके स्थानीय शेल द्वारा किया जाता है, और ssh को दिया जाता है जो पथ चर की सामग्री को प्रिंट करने के लिए दूरस्थ प्रणाली पर प्रतिध्वनित करता है, क्योंकि यह आपके स्थानीय सिस्टम पर विस्तारित होता है। यहाँ मेरा उदाहरण मेरे मैक और मेरे नेटवर्क पर एक लिनक्स मशीन के बीच कुछ ऐसा ही कर रहा है:

LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password: 
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$ 

ध्यान दें कि मुझे अपने स्थानीय शेल को चर का विस्तार करने से रोकने के लिए उद्धरणों का उपयोग करने की आवश्यकता है।


Windows Cygwin भूमि में, एकल उद्धरण Cygwin या कमांड प्रॉम्प्ट में कुछ नहीं करते हैं। अजीब तरह से, दोहरे उद्धरण पैठ का विस्तार पूरी तरह से साइग्विन में मेरे स्थानीय मशीन से करते हैं। इसलिए जो भी ssh मुझे दे रहा था वह मेरा रास्ता नहीं था, यह सर्वर का था
TheLQ

@ TheLQ एकल उद्धरण प्रॉम्प्ट (सिग्विन सहित) पर आवश्यक हैं, लेकिन आपको cmd प्रॉम्प्ट पर किसी भी उद्धरण की आवश्यकता नहीं है।
गिल्स एसओ- बुराई को रोकना '

12

~/.profileकेवल लॉगिन शेल द्वारा निष्पादित किया जाता है। शेल को कॉल करने वाला प्रोग्राम यह तय करता है कि शेल एक लॉगिन शेल होगा (शेल -इनवॉइस पर ज़रोथ तर्क के पहले चरित्र के रूप में डालकर )। जब आप किसी विशेष कमांड को निष्पादित करने के लिए लॉग इन करते हैं तो आमतौर पर इसे निष्पादित नहीं किया जाता है।

OpenSSH विशेष रूप से एक लॉगिन शेल को केवल तब ही आमंत्रित करता है जब आप एक कमांड निर्दिष्ट नहीं करते हैं। इसलिए यदि आप एक आदेश निर्दिष्ट करते हैं, ~/.profileतो पढ़ा नहीं जाएगा।

OpenSSH सर्वर साइड पर वातावरण चर सेट करने की अनुमति देता है। यह निर्देशन के साथ सर्वर कॉन्फ़िगरेशन में सक्षम होना चाहिए PermitUserEnvironment। चर को फ़ाइल में सेट किया जा सकता है ~/.ssh/environment। मान लें कि आप सार्वजनिक कुंजी प्रमाणीकरण का उपयोग, आप भी प्रति-कुंजी चर में सेट कर सकते हैं ~/.ssh/authorized_keysजोड़ने: environment="FOO=bar"प्रासंगिक पंक्ति के आरंभ में।

Ssh भी पर्यावरण चर भेजने का समर्थन करता है। OpenSSH में, SendEnvनिर्देश का उपयोग करें ~/.ssh/config। हालाँकि विशिष्ट वातावरण चर को AcceptEnvसर्वर कॉन्फ़िगरेशन में एक निर्देश के साथ सक्षम किया जाना चाहिए , इसलिए यह आपके लिए कारगर नहीं हो सकता है।

एक चीज जो मुझे लगता है कि हमेशा काम करती है (अजीब तरह से) जब तक आप सार्वजनिक कुंजी प्रमाणीकरण का उपयोग कर रहे हैं (ab) फ़ाइल command=में विकल्प का उपयोग करेंauthorized_keys । एक commandविकल्प के साथ एक कुंजी केवल निर्दिष्ट कमांड चलाने के लिए अच्छा है; लेकिन authorized_keysफाइल में कमांड पर्यावरण चर के साथ चलती है SSH_ORIGINAL_COMMANDजो उपयोगकर्ता को निर्दिष्ट कमांड पर सेट करता है। यह चर खाली है यदि उपयोगकर्ता ने कमांड निर्दिष्ट नहीं किया है और इसलिए एक इंटरैक्टिव शेल की उम्मीद है। तो आप इस तरह से कुछ का उपयोग कर सकते हैं ~/.ssh/authorized_keys(निश्चित रूप से, यह लागू नहीं होगा यदि आप इस कुंजी को प्रमाणित करने के लिए उपयोग नहीं करते हैं):

command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa 

एक अन्य संभावना सर्वर पर एक आवरण स्क्रिप्ट लिखने की है। निम्नलिखित में से कुछ की तरह ~/bin/ssh-wrapper:

#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"

तो फिर इस स्क्रिप्ट कहा जाता है के सांकेतिक लिंक बनाने rsync, unisonआदि दर्रे --rsync-path='bin/rsync'पर rsyncइतने पर अन्य कार्यक्रमों के लिए कमांड लाइन, और। वैकल्पिक रूप से, कुछ कमांड आपको दूरस्थ रूप से चलाने के लिए एक पूरे शेल स्निपेट को निर्दिष्ट करने की अनुमति देते हैं, जो आपको कमांड को स्व-निहित बनाने की अनुमति देता है: उदाहरण के लिए, rsync के साथ, आप उपयोग कर सकते हैं --rsync-path='. ~/.profile; rsync'

एक और एवेन्यू है जो आपके लॉगिन शेल पर बैश या zsh होने पर निर्भर करता है। बैश हमेशा पढ़ता है ~/.bashrcजब इसे rshd या sshd द्वारा आमंत्रित किया जाता है, भले ही यह इंटरएक्टिव न हो (लेकिन अगर इसे कहा जाता है तो नहीं sh)। Zsh हमेशा पढ़ता है ~/.zshenv

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

उन आदेशों के बारे में जो अन्य कमांड निष्पादित करते हैं? इस मामले में यह मर्क्यूरियल हुक होगा। हुक के काम करने के बारे में सोचने के लिए भी मर्क्यूरियल की जरूरत है
10LQ

आपकी प्रोफ़ाइल को गैर-सक्रिय ssh कमांड में चलाने के लिए मैंने जो भी तकनीक बताई है, उसका उपयोग करें। उन्हें (में से एक command=में authorized_keys) पारदर्शी रूप से काम करता है। दूसरों को ssh सर्वर कॉन्फ़िगरेशन में एक विशिष्ट शेल या विकल्प की आवश्यकता होती है। के बराबर --rsync-pathहै --remotecmd
गिल्स एसओ- बुराई को रोकें '

कुछ ही पूर्ण शामिल करने के लिए करने के लिए यह उपयोगी हो सकता है command=अपनी पोस्ट में के रूप में आदेश superuser.com/a/207262/137762
mforbes

1

आमतौर पर लॉगिन पर, bash कमांड से पढ़ता है:

~ / .bash_profile
~ / .bashrc

बैश मैन पेज से:

~ / .bash_profile
व्यक्तिगत आरंभ फ़ाइल, लॉगिन गोले के लिए निष्पादित

~ / .bashrc
व्यक्तिगत प्रति-इंटरैक्टिव-शेल स्टार्टअप फ़ाइल


0

मैं इसका परीक्षण करने के लिए समय से बाहर चला जाता हूं, लेकिन यह देख रहा हूं कि मैन पेज मुझे मिले:

आदमी बैश: जब बैश को गैर-अंतःक्रियात्मक रूप से शुरू किया जाता है, तो शेल स्क्रिप्ट को चलाने के लिए, उदाहरण के लिए, यह वातावरण में चर BASH_ENV की तलाश करता है, यदि यह वहां दिखाई देता है, तो इसका मान बढ़ाता है, और एक फ़ाइल के नाम के रूप में विस्तारित मान का उपयोग करता है पढ़ें और निष्पादित करें। बैश ऐसा व्यवहार करता है जैसे कि निम्नलिखित आदेश निष्पादित किए गए थे: यदि [-n "$ BASH_ENV"]; फिर । "$ BASH_ENV"; फाई लेकिन फ़ाइल नाम की खोज करने के लिए पेट वैरिएबल के मान का उपयोग नहीं किया जाता है।

आदमी ssh: ~ / .ssh / पर्यावरण में पर्यावरण चर के लिए अतिरिक्त परिभाषाएं शामिल हैं; ऊपर देखें, पर्यावरण।

संयोजन बताता है कि आप ssh को अपने .profile को कैसे निष्पादित कर सकते हैं

दुर्भाग्य से मेरे सर्वर में नहीं के डिफ़ॉल्ट मान के लिए PermitUserEnvironment है, जो बनाता है कि यह मेरे लिए काम नहीं करता है (और जैसे मैंने कहा कि मेरे पास इसके साथ खेलने का समय नहीं है)।


यहां तक ​​कि अगर मैं वातावरण में कुछ पर्यावरण चर को स्पष्ट रूप से बताकर काम करने के लिए एसएसएच प्राप्त कर सकता हूं, तो यह अभी भी मेरी प्रोफ़ाइल को ठीक करने में मदद नहीं करेगा जब अन्य कार्यक्रमों को आदेश दिया जाता है
TheLQ

आपके उदाहरण में आप जो कर रहे हैं वह सभी पर्यावरण चर स्थापित कर रहा है, आप और क्या करना चाहते हैं?
kasterma

0

(हटा दिया ... केवल एक हाइपरलिंक हो सकता है नए उपयोगकर्ता के रूप में ~)

अपडेट करें

क्षमा करें, मैंने नहीं देखा है कि यह एक गैर-संवादात्मक सत्र के बारे में है, जिसमें उपरोक्त लिंक लागू नहीं होता है।

जब बैश एसएच कॉम्पिटिटैलिटी मोड में शुरू होता है, तो यह पोसिक्स® मानक के अनुरूप होने के साथ-साथ यथासंभव समीप के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है। पढ़ी गई प्रोफ़ाइल फ़ाइलें / etc / प्रोफ़ाइल और ~ / .profile हैं, अगर यह एक लॉगिन शेल है।

यदि यह एक लॉगिन शेल नहीं है, तो पर्यावरण चर ENV का मूल्यांकन किया जाता है और परिणामस्वरूप फ़ाइलनाम को स्टार्टअप फ़ाइल के नाम के रूप में लिया जाता है।

स्टार्टअप फ़ाइलों को पढ़ने के बाद, बैश ने POSIX (r) कंपेटिबिलिटी मोड (चलाने के लिए, शुरू करने के लिए नहीं!) में प्रवेश किया।

बैश शुरू हो जाता है जब कंपिटिटैलिटी मोड में:

  • argv में आधार फ़ाइल नाम [0] sh है (:!: ध्यान प्रिय uber- चतुर लिनक्स उपयोगकर्ता ... / bin / sh को / bin / bash से जोड़ा जा सकता है, लेकिन इसका मतलब यह नहीं है कि यह / bin / bash की तरह कार्य करता है : :)

तो सवाल यह है कि यह इसे निष्पादित क्यों नहीं करता है, भले ही आपका शेल इस तरह से शुरू किया गया हो।

स्रोत


मैंने देखा है लेकिन जैसा कि मैंने बताया कि मुझे नहीं पता कि किस चरण में ssh कमांड और अन्य प्रोग्राम कमांड निष्पादित होते हैं। मैंने मैन पेज और अन्य गाइड को पहले ही कई बार पढ़ा है
TheLQ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.