~/.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