~/.profile
जब आप चलाते हैं तो आम तौर पर पढ़ा नहीं जाता है ssh somecommand
, जैसा कि एक इंटरैक्टिव ssh सत्र (या अन्य लॉगिन विधि जहां आप एक इंटरैक्टिव सत्र शुरू करते हैं) के विपरीत।
Ssh पर्यावरण चर भेजने का समर्थन करता है। OpenSSH में, SendEnv
निर्देश का उपयोग करें ~/.ssh/config
। हालाँकि विशिष्ट वातावरण चर को सर्वर कॉन्फ़िगरेशनAcceptEnv
में एक निर्देश के साथ सक्षम किया जाना चाहिए , इसलिए यह आपके लिए कारगर नहीं हो सकता है।
OpenSSH भी सर्वर पर वातावरण चर सेट करने की अनुमति देता है। फिर से, यह सर्वर कॉन्फ़िगरेशन में सक्षम होना चाहिए, यहां PermitUserEnvironment
निर्देश के साथ । चर को फ़ाइल में सेट किया जा सकता है ~/.ssh/environment
। मान लें कि आप सार्वजनिक कुंजी प्रमाणीकरण का उपयोग, आप भी प्रति-कुंजी चर में सेट कर सकते हैं ~/.ssh/authorized_keys
जोड़ने: environment="FOO=bar"
प्रासंगिक पंक्ति के आरंभ में।
एक चीज जो मुझे लगता है कि हमेशा काम करती है (अजीब तरह से) जब तक आप सार्वजनिक कुंजी प्रमाणीकरण का उपयोग कर रहे हैं (ab)command=
authorized_keys
फ़ाइल में विकल्प का उपयोग करें । एक command
विकल्प के साथ एक कुंजी केवल निर्दिष्ट कमांड चलाने के लिए अच्छा है; लेकिन authorized_keys
फ़ाइल SSH_ORIGINAL_COMMAND
में कमांड निर्दिष्ट उपयोगकर्ता के लिए पर्यावरण चर के साथ चलता है जो निर्दिष्ट उपयोगकर्ता (इंटरेक्टिव सत्र के लिए खाली) है। तो आप इस तरह से कुछ का उपयोग कर सकते हैं ~/.ssh/authorized_keys
(निश्चित रूप से, यह लागू नहीं होगा यदि आप इस कुंजी को प्रमाणित करने के लिए उपयोग नहीं करते हैं):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
ध्यान दें कि मैंने पठनीयता के लिए लाइन ब्रेक को ऊपर रखा है, लेकिन यह वास्तव में एक लाइन पर होना चाहिए।
एक और संभावना ~/bin/rsync-wrapper
सर्वर पर एक आवरण स्क्रिप्ट लिखने की है, कुछ इस तरह
#!/bin/sh
. ~/.profile
exec rsync "$@"
फिर कमांड लाइन --rsync-path='bin/rsync-wrapper'
पर पास करें rsync
। तर्क को --rsync-path
शेल द्वारा विस्तारित किया जाता है, इसलिए यदि आप पसंद करते हैं तो आप कुछ ऐसा पास करके 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