SSH - हर कनेक्शन द्वारा env vairables सेट करें - Godaddy साझा होस्ट


16

मेरी समस्या यह है, कि मुझे सर्वर पर env वैरिएबल (जैसे GIT_EXEC_PATH) सेट करने हैं। मुझे हर कनेक्शन के द्वारा वैरिएबल चाहिए (ताकि बैश द्वारा और रिमोट कमांड द्वारा या तो)। मैं .bash_profile के साथ बैश करके उन चर को सेट करने में कामयाब रहा, लेकिन मुझे दूरस्थ कमांड के साथ समस्या है। मैंने पाया कि वास्तविक rsa कुंजी से पहले ~ / .ssh / प्राधिकृत_पत्रों में कमांड लिखना संभव है, लेकिन मैं वहां हमेशा लिखना नहीं चाहता, मुझे एक स्थायी समाधान की आवश्यकता है ... मैंने पाया कि ~ / .ssh / आरसी फ़ाइल को हर ssh लॉगिन द्वारा निष्पादित किया जाता है, इसलिए मैंने अपना env वैरिएबल घोषणाओं को वहां रखा, लेकिन यह काम नहीं किया। चर आरसी फ़ाइल में सेट किए जाते हैं, लेकिन इसके बाद वे गायब हो गए। : S हो सकता है कि rc फाइल एक सबस्क्रिप्शन में चले: S क्या कोड डुप्लीकेशन के बिना bash में और रिमोट कमांड में उन वेरिएबल्स को परिभाषित करने का कोई तरीका है?

संपादित करें:

मैंने प्रश्न को संपादित किया, क्योंकि सर्वर एक गोडैडी शेयर्ड होस्ट है, इसलिए इसका एक अनूठा विन्यास है। / Etc / ssh / sshd_config और / etc / ssh / ssh_config फ़ाइलें खाली हैं। उन फ़ाइलों में टिप्पणियां हैं, यदि आप उत्सुक हैं तो मैं इसे यहां कॉपी कर सकता हूं।

  1. ~ / .Bash_profile को सॉर्ट किया जाता है (केवल बैश कनेक्शन द्वारा),
  2. ~ / .bashrc कभी भी खट्टा नहीं है,
  3. ~ / .प्रोफाइल कभी भी खट्टा नहीं है,
  4. ~ /। ssh / वातावरण कभी भी सुगंधित नहीं होता है,
  5. ~ /। ssh / rc को (bash और रिमोट दोनों के द्वारा) खट्टा किया जाता है, लेकिन मुझे लगता है कि इसे सब-उप में कहा जाता है, क्योंकि चर गायब हो जाते हैं।
  6. ~ / .Ssh / अधिकृत_कीप्स हर बार खट्टा हो जाता है, लेकिन मुझे हर rsa कुंजी से पहले कमांड लिखना होगा (इसलिए मैं उस से कॉन्फ़िगर नहीं करना चाहता)।

सारांश:

मैं बैश को अच्छी तरह से कॉन्फ़िगर कर सकता हूं (.bash_profile), लेकिन मैं दूरस्थ कॉल को कॉन्फ़िगर नहीं कर सकता। यही समस्या है। मैं एक ऐसी फाइल की तलाश कर रहा हूं, जो बैश और रिमोट कमांड दोनों से सोर्स की गई हो।

उदाहरण के लिए:

Git-upload-pack कमांड exe फाइल को ढूँढता है, क्योंकि GIT_EXEC_PATH env वैरिएबल सेट है, लेकिन रिमोट के साथ: "git clone user@domain.com: myrepo local / myrepo" सर्वर को वह कमांड नहीं मिलती है, क्योंकि GIT_EXEC_PATH सेट नहीं है।

EDIT2:

के अनुसार इस , और मेरे printenv लॉग्स: ~ / .ssh / आर सी, सामान्य खोल में चल रहा है, subshell में नहीं है, तो यह एक पहेली क्यों env चर चिपके हुए नहीं है ...

मैंने एक निष्पादन योग्य बनाया: ~ / logenv :

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

और इसे ~ / .ssh / rc में डालें :

export AAA=teszt
source ~/logenv

बैश लॉगिन और "स्रोत लॉगेनव" द्वारा परिणाम था:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

दूरस्थ "ssh myuser@domain.com ' द्वारा ' ~ ~ logenv ' का परिणाम था:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

तो आरसी फ़ाइल को सॉर्ट किया गया है, लेकिन उसके बाद चर गायब हो रहे हैं ...: एस


इस सूत्र में कुछ विकल्प हैं - stackoverflow.com/questions/216202/…
EightBitTony

"विपरीत / आदि / sshrc, जो हमेशा बॉर्न शेल (/ बिन / श) द्वारा संसाधित होता है, आपकी आरसी फ़ाइल आपके खाते के सामान्य लॉगिन शेल द्वारा संसाधित होती है।" - यह अजीब है क्योंकि ऐसा लगता है कि यह सामान्य खोल द्वारा
खट्टा

जवाबों:


12

आप यह मानते हुए UsePAM yesमें /etc/ssh/sshd_config, और यह सोचते हैं आप चाहते हैं इन वातावरण चर प्रत्येक उपयोगकर्ता के लिए निर्धारित करते हैं, आप के लिए PAM सेट वातावरण चर हो सकता है। यदि आपके पास पर्यावरण चर हैं, /etc/gitenvतो आप इस लाइन को इसमें जोड़ सकते हैं/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

या इस फ़ाइल को सबसे ऊपर करके, आप पा सकते हैं कि पहले से ही एक pam_env.so का उपयोग किया जा रहा है, और पहले से ही एक फ़ाइल जिसमें आप सामान जोड़ सकते हैं। बस सावधान रहें, और सुनिश्चित करें कि आपने अपने ssh सत्र को समाप्त करने से पहले अपने परिवर्तनों का अच्छी तरह से परीक्षण किया है, जैसे कि जब आप pam के साथ खिलवाड़ कर रहे हैं, तो आप सावधानी से काम न करने पर, अपने सर्वर में प्रवेश करने की अपनी क्षमता को पूरी तरह से तोड़ सकते हैं।


मेरे पास एक साझा साझा खाता है, इसलिए मैं केवल ~ निर्देशिका को संशोधित कर सकता हूं। (इसमें
सेंटोस

@ inf3rno यह अच्छा जवाब देने के लिए नुकसान नहीं पहुँचाता है :) वैसे भी समाधान जो आपकी समस्या को हल करेगा एक अलग मतलब द्वारा चिह्नित किया जा सकता है।
Huygens

ठीक है। मैं करूंगा, लेकिन मैं केवल एक ही व्यक्ति नहीं हूं जो वोट कर सकता है ... :-)
inf3rno

उबंटू पर, ऐसा लगता है कि डिफ़ॉल्ट रूप /etc/environmentसे सोर्स किया pam_env.soगया है
rcoup

4

मैं अपने SSH कनेक्शन के लिए कुछ पर्यावरण चर का उपयोग कर रहा हूँ ~/.ssh/environment। फ़ाइल में रूप में चर हो सकता है VAR=value, उन्हें स्पष्ट रूप से निर्यात करने की कोई आवश्यकता नहीं है।

हालाँकि, इस उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइल को SSH सर्वर प्रक्रिया द्वारा डिफ़ॉल्ट रूप से अनदेखा किया जाता है जब तक कि विकल्प PermitUserEnvironment सेट नहीं है। इसलिए आपको इस पैरामीटर को जोड़ने या अपडेट करने के लिए SSH सर्वर पर / etc / sshd_config को संपादित करना सुनिश्चित करना होगा:

PermitUserEnvironment yes

आपको SSH सर्वर कॉन्फ़िगरेशन को पुनः लोड करने की आवश्यकता है। RHEL या Suse Linux पर आप (रूट के रूप में)

/sbin/service sshd reload

(संभवतः sshd को ssh द्वारा प्रतिस्थापित करें यदि यह काम नहीं करता है)

उबंटू (अपस्टार्ट का उपयोग करके) आप करते हैं

sudo reload ssh

किसी भी अन्य लिनक्स पर, आप कोशिश कर सकते हैं (रूट के रूप में)

/etc/init.d/sshd reload

(Sshd को ssh या opensh या जो कुछ भी SSH सर्वर init स्क्रिप्ट के अनुरूप होगा, बदलें)


धन्यवाद, लेकिन मैं / etc डीआईआर में नहीं लिख सकता, ~ / .ssh / पर्यावरण खट्टा नहीं है।
inf3rno

2

मेरे पास अब कोई साझा साझा होस्ट नहीं है, इसलिए मैं यह नहीं जांच सकता कि प्रस्तावित समाधान मान्य हैं या नहीं। यह स्वीकृत उत्तर रहेगा, क्योंकि यह प्रश्न पूछने पर मेरे द्वारा काम किया गया था। अन्य उत्तर भी काम कर सकते हैं। मैंने समुदाय को यह निर्णय लेने दिया कि मैं उत्थान करूंगा।

ठीक है। इसका समाधान यह है कि एक साझा साझा होस्ट पर कोई समाधान नहीं है। मैंने सब कुछ करने की कोशिश की, लेकिन कुछ भी काम नहीं किया, इसलिए मैंने फैसला किया कि मैं ~ /। Ssh / अधिकृत_की के साथ रहता हूं:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

~ / Connect.sh में:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

और ~ / .env_profile में:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

इसलिए मुझे अधिकृत_की में हर rsa कुंजी को कमांड = "..." को कॉपी करना होगा। यह कोड डुप्लीकेशन है, लेकिन मुझे नहीं लगता कि एक गोडैडी शेयर्ड मेजबानों पर एक और समाधान है।


1

यदि आप bashअपने शेल के रूप में उपयोग कर रहे हैं , तो पर्यावरण सेटिंग्स को जोड़ने का प्रयास करें .bashrc

पहले जांचें कि यह लॉगिन पर चलता है, यह मानक फ़ाइलों के रूप में अक्सर ऐसा कुछ नहीं हो सकता है:

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

उन की शुरुआत में। कोई भी परिवर्तन जो आप गैर-संवादात्मक लॉगिन के लिए भी करना चाहते हैं, उसे इस तरह के बयान से ऊपर जाने की आवश्यकता होगी।

.profileइस तरह के कॉन्फ़िगरेशन को रखने के लिए एक अधिक सामान्य स्थान है और अधिकांश शेल द्वारा सम्मानित किया जाता है (डिफ़ॉल्ट डेबियन सेटअप पर यह पहली बार में ~/.profileकॉल ~/.bashrcहोता है)। यदि आपको .profileकभी भी अन्य गोले द्वारा व्याख्या की जाती है, तो आपको अधिक सावधान संपादन करने की आवश्यकता हो सकती है - अर्थात bashविशिष्ट एक्सटेंशन के उपयोग से बचने का प्रयास करें।

संपादित करें

यदि आपके पास एक .bash_profileसंपादन है जो इसके बजाय .profile: bash अधिक सामान्य फ़ाइल के पक्ष में इसका उपयोग करेगा, और आप वहां सुरक्षित रूप से bash विशिष्ट चीजों का उपयोग कर सकते हैं।


पढ़ें "संपादित करें" अनुभाग pls। (.profile काम नहीं कर रहा है)
inf3rno

1

आप इस लाइन को sshd_config फ़ाइल में जोड़कर अधिकृत_कीलों में कमांड भाग को जोड़े बिना सभी उपयोगकर्ताओं / कुंजी के लिए कमांड का उपयोग कर सकते हैं:

ForceCommand ~/connect.sh

इस मामले में मेरा सुझाव है कि आप स्क्रिप्ट के लिए एक निरपेक्ष पथ का उपयोग करें


0

मैं आपको एक और दृष्टिकोण का प्रस्ताव दे रहा हूं।

आप अपने परिवेश चर की घोषणा के साथ एक फ़ाइल सेट करते हैं और तब आप इसे हर बार जब आप एक दूरस्थ कमांड कहते हैं, तो स्रोत।

उदाहरण: आप ~ / .my_var.rc में आवश्यक चर डालते हैं और फिर आपके द्वारा किए गए प्रत्येक दूरस्थ कमांड के लिए ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

यदि यह आपको सूट करता है, तो आप इस अवधारणा को परिष्कृत कर सकते हैं और इसे सुविधा के लिए स्क्रिप्ट कर सकते हैं। यदि आपको केवल git कमांड के लिए इसकी आवश्यकता है, तो मैं एक git.sh स्क्रिप्ट बनाऊंगा जो यह करेगी:

#!/bin/bash

source ~/.my_var.rc

git $@

इस स्क्रिप्ट को आपके होम डायरेक्टरी में माना जाएगा, तो आप इसे कॉल करेंगे: ssh user@remote git.sh pull origin master

नोट: यह एक सरल प्रारंभिक बिंदु है। उदाहरण के लिए, यह रिक्त स्थान के साथ मापदंडों का समर्थन नहीं करता है।


मैं उस toc कर सकता हूं, लेकिन वह config मेरे लिए अकेले नहीं है, और यह git gui के साथ काम करना चाहिए, जहां कमांड अपने आप उत्पन्न होती हैं ...
inf3rno

क्या आप उसी उपयोगकर्ता का उपयोग करके ssh रिमोट से कनेक्ट करते हैं? यदि हाँ, तो फ़ाइल ~ / .my_var.rc उपयोगकर्ता विशिष्ट और सभी के लिए git.sh सामान्य होगी। यदि नहीं, तो आप git.sh में एक अतिरिक्त पैरामीटर जोड़ सकते हैं जो आपको अंतर करने में मदद कर सकता है। जो कि स्रोत में .rc फ़ाइल (या यह निश्चित आईपी का उपयोग करके, आप अपने उपयोगकर्ताओं को अलग करने के लिए SSH_CLIENT env जानकारी का उपयोग कर सकते हैं)। कमांड को git gui के साथ काम करना चाहिए, कॉल करेंssh -Y user@remote git.sh gui
Huygens

मुझे हर उपयोगकर्ता के लिए समान एनवी सेटिंग्स की आवश्यकता है। मैं कमांड्स में अतिरिक्त भाग नहीं
जोड़ूंगा

ठीक है तो अगर सेटिंग्स सभी उपयोगकर्ताओं के लिए समान हैं तो उत्तर पूर्ण है और आप मेरी पिछली टिप्पणी की उपेक्षा कर सकते हैं। आपको संभवतः एक निर्देशिका में .rc और .sh फ़ाइलों को रखने की आवश्यकता होगी जो सभी उपयोगकर्ताओं द्वारा / सुलभ हो।
ह्यूजेंस

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

0

यह PATHS के बारे में सामान्य प्रश्न का उत्तर नहीं देता है, लेकिन यह आपको दूरस्थ सर्वर पर git रिपॉजिटरी का उपयोग करने की अनुमति देता है, जिसके पथ में git नहीं है, और जिसकी आपको रूट एक्सेस नहीं है। यह समाधान इस पृष्ठ से आता है ।

git clone -u relative/path/to/bin/git-upload-pack username@host.com:relative/path/to/remote_repository.git

पुश करने और लाने के लिए:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.