मैं दूरस्थ rsync प्रक्रिया के लिए पर्यावरण चर कैसे सेट कर सकता हूं?


12

जब मैं एक कंप्यूटर से दूसरे कंप्यूटर में फ़ाइलों को कॉपी करने के लिए rsync का उपयोग करता हूं, तो दोनों सिरों पर rsync प्रक्रिया शुरू की जाती है। हालाँकि, दूरस्थ छोर पर, शेल आरंभीकरण फ़ाइलें स्पष्ट रूप से नहीं पढ़ी जाती हैं, इसलिए मैं दूरस्थ rsync प्रक्रिया के लिए पर्यावरण चर सेट नहीं कर सकता। दुर्भाग्य से, एक सर्वर है जिसे मुझे rsync करने की आवश्यकता है जिस पर rsync को काम करने के लिए एक पर्यावरण चर की आवश्यकता होती है। मैं सर्वर पर व्यवस्थापक नहीं हूं, इसलिए मैं वैश्विक कॉन्फ़िगरेशन नहीं बदल सकता। दूरस्थ rsync प्रक्रिया के लिए मैं पर्यावरण varaibles सेट करने के लिए क्या कर सकता हूं?


आप सर्वर पर rsync प्रक्रिया कैसे शुरू करते हैं? आप ssh के माध्यम से एक स्क्रिप्ट ट्रिगर कर सकते हैं?
21

जब आप करते हैं rsync localfilename remotehost:remotefilename, सर्वर पर एक rsync प्रक्रिया शुरू हो जाती है। मुझे यकीन नहीं है कि कैसे, लेकिन यह किसी भी शेल आरंभीकरण फ़ाइलों को नहीं पढ़ता है।
रयान सी। थॉम्पसन

जवाबों:


20

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

खैर, यह बहुत ज्यादा यह रकम है। मुझे उम्मीद थी कि एक रैपर स्क्रिप्ट का उपयोग करने से बेहतर तरीका था।
रयान सी। थॉम्पसन

लेकिन एक मिनट रुकिए। यदि मेरी शेल इनइट फाइलें नहीं पढ़ी जा रही हैं, तो यह सर्वर पर rsync बाइनरी को कैसे खोज सकता है? मैंने ~ / usr में स्थापित किया, एक गैर-मानक स्थान जिसे मुझे $PATHअपने शेल इनिट स्क्रिप्ट में जोड़ना है ।
रयान सी। थॉम्पसन

@Ryan: मैं वास्तव में सबसे प्रत्यक्ष विधि (मेरा संपादन देखें) भूल गया हूँ, लेकिन यह भी सर्वर विन्यास में सक्षम करने के लिए एक निर्देश की आवश्यकता है। यदि आपको अपने PATHखाते को लेने का कोई रास्ता मिल गया है, तो आपको वहाँ कोई अन्य चर सेट करने में सक्षम होना चाहिए। (यदि वह काम नहीं करता है, तो आप set -xकिसी भी शेल स्क्रिप्ट के साथ शुरू होने वाले कई निशान जोड़ने की कोशिश कर सकते हैं ; rsyncबाइनरी को एक आवरण स्क्रिप्ट द्वारा बदल सकते हैं जो पर्यावरण को एक फ़ाइल में डंप करता है, फिर वास्तविक बाइनरी को कॉल करता है।)
गिल्स एसओ - being

किस बारे में ~/.ssh/rc?
रयान सी। थॉम्पसन

@ रियान: ~/.ssh/rcएक अलग शेल प्रक्रिया द्वारा निष्पादित किया जाता है। मुझे लगता है कि आपकी सबसे अच्छी शर्त एक रैपर स्क्रिप्ट या है --rsync-path='. ~/.profile; rsync'। या rsyncअपने अन्य प्रश्न के अनुसार एक उपयुक्त rpath के साथ recompiling ।
गाइल्स का SO- अनिष्ट होने पर रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.