SSH - ตั้งค่า env vairables โดยทุกการเชื่อมต่อ - godaddy แชร์โฮสต์


16

ปัญหาของฉันคือฉันต้องตั้งค่าตัวแปร env (เช่น GIT_EXEC_PATH) บนเซิร์ฟเวอร์ ฉันต้องการตัวแปรนั้นทุกการเชื่อมต่อ (ดังนั้นโดยการทุบตีและโดยคำสั่งระยะไกลอย่างใดอย่างหนึ่ง) ฉันจัดการเพื่อตั้งค่าตัวแปรเหล่านั้นด้วยการทุบตีด้วย. bash_profile แต่ฉันมีปัญหากับคำสั่งระยะไกล ฉันพบว่าเป็นไปได้ที่จะเขียนคำสั่งใน ~ / .ssh / authorized_keys ก่อนหน้าคีย์ rsa จริง แต่ฉันไม่ต้องการเขียนที่นั่นเสมอฉันต้องการวิธีแก้ปัญหาอย่างถาวร ... ฉันพบว่า ~ / .ssh ไฟล์ / rc ถูกเรียกใช้งานโดยการเข้าสู่ระบบ ssh ทุกครั้งดังนั้นฉันจึงใส่การประกาศตัวแปร env ไว้ที่นั่น แต่มันไม่ทำงาน ตัวแปรถูกตั้งค่าในไฟล์ rc แต่หลังจากนั้นตัวแปรจะหายไป : S บางทีไฟล์ rc ทำงานใน subshell: S มีวิธีใดที่จะกำหนดตัวแปรเหล่านั้นใน bash และในคำสั่งระยะไกลโดยไม่ต้องทำรหัสซ้ำ?

แก้ไข:

ฉันแก้ไขคำถามเพราะเซิร์ฟเวอร์เป็นโฮสต์ที่ใช้ร่วมกัน godaddy ดังนั้นจึงมีการกำหนดค่าที่ไม่ซ้ำกัน ไฟล์ / etc / ssh / sshd_config และไฟล์ / etc / ssh / ssh_config ว่างเปล่า มีความคิดเห็นในไฟล์เหล่านั้นหากคุณสงสัยฉันสามารถคัดลอกได้ที่นี่

  1. ~ / .bash_profile มีที่มา (โดยการเชื่อมต่อทุบตีเท่านั้น)
  2. ~ / .bashrc ไม่เคยมีที่มา
  3. ~ / .profile ไม่เคยมีที่มา
  4. ~ / .ssh / environment ไม่เคยมีที่มา
  5. ~ / .ssh / rc มีที่มา (โดย bash และ remote ทั้งคู่) แต่ฉันคิดว่ามันถูกเรียกเป็น subshell เนื่องจากตัวแปรหายไป
  6. ~ / .ssh / authorized_keys มีที่มาทุกครั้ง แต่ฉันต้องเขียนคำสั่งก่อนทุกคีย์ rsa (ดังนั้นฉันไม่ต้องการกำหนดค่าด้วย)

สรุป:

ฉันสามารถกำหนดค่า bash ได้ดี (ด้วย. bash_profile) แต่ฉันไม่สามารถกำหนดค่าการโทรระยะไกลได้ นั่นคือปัญหา. ฉันกำลังมองหาไฟล์ที่มาจากคำสั่ง bash และ remote

ตัวอย่างเช่น:

คำสั่ง git-upload-pack ค้นหาไฟล์ exe เนื่องจากมีการตั้งค่าตัวแปร env GIT_EXEC_PATH แต่ด้วยระยะไกล: "git clone user@domain.com: myrepo local / myrepo" เซิร์ฟเวอร์ไม่พบคำสั่งนั้นเนื่องจาก GIT_EXEC_PATH ไม่ได้ตั้งค่า

Edit2:

ตามนี้และบันทึก printenv ของฉัน: ~ / .ssh / rc ทำงานในเชลล์ปกติไม่ใช่ใน subshell ดังนั้นมันเป็นปริศนาว่าทำไมตัวแปร env ไม่ติด ...

ฉันสร้างไฟล์เรียกทำงาน: ~ / logenv :

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

และใส่สิ่งนี้ลงใน~ / .ssh / rc :

export AAA=teszt
source ~/logenv

โดย bash login & "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 'exec ~ / 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

ดังนั้นไฟล์ rc จึงมีที่มา แต่หลังจากนั้นตัวแปรจะหายไป ... : S


ตัวเลือกบางตัวในชุดข้อความนี้ - stackoverflow.com/questions/216202/…
EightBitTony

"แตกต่างจาก / etc / sshrc ซึ่งประมวลผลโดยเชลล์เป้าหมายเสมอ (/ bin / sh) ไฟล์ rc ของคุณจะถูกประมวลผลโดยเชลล์ล็อกอินปกติของบัญชีของคุณ" - แปลกเพราะมันดูเหมือนว่ามันจะไม่ได้มาจากเปลือกปกติ: S
inf3rno

คำตอบ:


12

สมมติว่าคุณมีUsePAM yesใน/etc/ssh/sshd_configและสมมติว่าคุณต้องการตัวแปรสภาพแวดล้อมเหล่านี้การตั้งค่าสำหรับผู้ใช้ทุกคนคุณสามารถมีตัวแปรสภาพแวดล้อมแพมชุดสำหรับคุณ หากคุณมีตัวแปรสภาพแวดล้อมที่กำหนดไว้ใน/etc/gitenvคุณสามารถเพิ่มบรรทัดนี้/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

หรือโดยการตรวจดูไฟล์นี้คุณอาจพบว่ามี pam_env.so อยู่แล้วและไฟล์ที่คุณสามารถเพิ่มรายการได้ เพียงระวังและตรวจสอบให้แน่ใจว่าคุณได้ทดสอบการเปลี่ยนแปลงอย่างละเอียดก่อนที่จะสิ้นสุดเซสชัน ssh ของคุณเช่นเมื่อคุณยุ่งกับ pam คุณสามารถทำลายความสามารถในการเข้าสู่ระบบเซิร์ฟเวอร์ของคุณหากคุณไม่ระวัง


ฉันมีบัญชีโฮสต์ที่ใช้ร่วมกัน godaddy ดังนั้นฉันจึงสามารถแก้ไขไดเรกทอรี ~ เท่านั้น (มันมีระบบ centos op)
inf3rno

@ inf3rno มันไม่เป็นอันตรายต่อคำตอบที่ดี upvote :) เช่นกันวิธีแก้ปัญหาที่จะแก้ปัญหาของคุณสามารถทำเครื่องหมายด้วยวิธีการที่แตกต่างกัน
Huygens

ตกลง. ฉันจะ แต่ฉันไม่ใช่คนเดียวที่สามารถโหวตได้ ... :-)
inf3rno

บน Ubuntu ดูเหมือนว่า/etc/environmentจะมีที่มาเป็นpam_env.soค่าเริ่มต้น
rcoup

4

ฉันตั้งตัวแปรสภาพแวดล้อมบางอย่างสำหรับการเชื่อมต่อ SSH ~/.ssh/environmentของฉันใช้ ไฟล์สามารถมีตัวแปรในรูปแบบVAR=valueไม่จำเป็นต้องส่งออกอย่างชัดเจน

อย่างไรก็ตามไฟล์คอนฟิกูเรชันผู้ใช้นี้จะถูกละเว้นโดยค่าเริ่มต้นโดยกระบวนการเซิร์ฟเวอร์ SSH ยกเว้นว่าตัวเลือก PermitUserEnvironment จะถูกตั้งค่าเป็นใช่ ดังนั้นคุณต้องแน่ใจว่าได้แก้ไข / etc / sshd_config บนเซิร์ฟเวอร์ SSH เพื่อเพิ่มหรืออัพเดทพารามิเตอร์นี้:

PermitUserEnvironment yes

คุณต้องโหลดการกำหนดค่าเซิร์ฟเวอร์ SSH ใหม่ บน RHEL หรือ Suse Linux คุณต้องทำ (เป็น root)

/sbin/service sshd reload

(อาจแทนที่ sshd ด้วย ssh หากไม่ได้ผล)

บน Ubuntu (ใช้พุ่งพรวด) คุณทำ

sudo reload ssh

บน Linux ตัวอื่นคุณสามารถลอง (เป็น root)

/etc/init.d/sshd reload

(แทนที่ sshd ด้วย ssh หรือ openssh หรืออะไรก็ตามที่จะสอดคล้องกับสคริปต์เซิร์ฟเวอร์เริ่มต้น SSH)


ขอบคุณ แต่ฉันไม่สามารถเขียนใน / etc dir, ~ / .ssh / สภาพแวดล้อมไม่ได้มา
inf3rno

2

ฉันไม่มีโฮสต์แชร์แชร์อีกต่อไปดังนั้นฉันจึงไม่สามารถตรวจสอบได้ว่าโซลูชันที่เสนอนั้นถูกต้องหรือไม่ นี่จะเป็นคำตอบที่ได้รับการยอมรับเนื่องจากฉันทำงานเมื่อฉันถามคำถาม คำตอบอื่น ๆ อาจทำงานได้เช่นกัน ฉันปล่อยให้ชุมชนตัดสินใจด้วยการ upvotes

ตกลง. ทางออกคือไม่มีวิธีแก้ปัญหาในโฮสต์ที่ใช้ร่วมกัน godaddy ฉันลองทุกอย่าง แต่ไม่มีอะไรเลยฉันจึงตัดสินใจว่าจะอยู่กับ ~ / .ssh / authorized_keys:

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 ใน authorized_keys นี่คือการทำสำเนารหัส แต่ฉันไม่คิดว่าจะมีวิธีแก้ไขปัญหาอื่นบนโฮสต์ที่ใช้ร่วมกันของ godaddy


1

ถ้าคุณกำลังใช้เป็นเปลือกของคุณลองเพิ่มการตั้งค่าสภาพแวดล้อมbash.bashrc

ตรวจสอบก่อนว่าสิ่งนี้จะทำงานเมื่อลงชื่อเข้าใช้อาจไม่เป็นไฟล์มาตรฐานมักจะมีสิ่งต่อไปนี้:

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

ที่จุดเริ่มต้นของพวกเขา การเปลี่ยนแปลงใด ๆ ที่คุณต้องการแม้จะเป็นการลงชื่อเข้าใช้ที่ไม่ต้องมีการโต้ตอบก็ตาม

.profileเป็นสถานที่ทั่วไปมากขึ้นในการวางการกำหนดค่าเช่นนี้และเป็นที่เคารพโดยเชลล์ส่วนใหญ่ (ในการตั้งค่าเดเบียนเริ่มต้นมันคือการ~/.profileโทร~/.bashrcในครั้งแรก) คุณอาจต้องแก้ไขอย่างระมัดระวังมากขึ้น.profileในกรณีที่มีการตีความโดยเชลล์อื่น ๆ - เช่นพยายามหลีกเลี่ยงการใช้bashส่วนขยายเฉพาะ

แก้ไข

หากคุณมีการ.bash_profileแก้ไขแทนที่จะเป็น.profile: ทุบตีจะใช้มันแทนไฟล์ทั่วไปที่มากกว่าและคุณสามารถใช้ทุบตีสิ่งที่เฉพาะเจาะจงในนั้นได้อย่างปลอดภัย


อ่านส่วน "แก้ไข" กรุณา (. โปรไฟล์ไม่ทำงาน)
inf3rno

1

คุณสามารถใช้คำสั่งสำหรับผู้ใช้ / คีย์ทั้งหมดโดยไม่ต้องเพิ่มส่วนคำสั่งใน authorized_keys โดยเพิ่มบรรทัดนี้ลงในไฟล์ 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

หมายเหตุ: มันเป็นจุดเริ่มต้นที่เรียบง่าย ตัวอย่างเช่นไม่สนับสนุนพารามิเตอร์ที่มีช่องว่าง


ฉันสามารถทำเช่นนั้นได้ แต่การตั้งค่านั้นไม่ใช่สำหรับฉันคนเดียวและควรทำงานกับ git gui ซึ่งเป็นคำสั่งที่สร้างขึ้นโดยอัตโนมัติ ...
inf3rno

คุณเชื่อมต่อกับ ssh remote โดยใช้ผู้ใช้เดียวกันหรือไม่? ถ้าใช่แล้วไฟล์ ~ / .my_var.rc จะเป็นของผู้ใช้และ git.sh จะเป็นของผู้ใช้ทั้งหมด หากไม่เช่นนั้นคุณสามารถเพิ่มพารามิเตอร์พิเศษลงใน git.sh ที่สามารถช่วยให้คุณแยกแยะไฟล์. rc ใดไปยังแหล่งที่มา (หรือใช้ IP คงที่คุณสามารถใช้ข้อมูล env SSH_CLIENT เพื่อแยกแยะผู้ใช้ของคุณ) คำสั่งควรทำงานกับ git gui โทรssh -Y user@remote git.sh gui
Huygens

ฉันต้องการการตั้งค่า env เดียวกันสำหรับผู้ใช้ทุกคน ฉันจะไม่เพิ่มส่วนหนึ่งเป็นพิเศษในการคำสั่งที่มันไร้สาระ ...
inf3rno

ถ้าการตั้งค่าเหมือนกันสำหรับผู้ใช้ทั้งหมดคำตอบก็จะเสร็จสมบูรณ์และคุณสามารถเพิกเฉยต่อความคิดเห็นก่อนหน้าของฉันได้ คุณอาจต้องวางไฟล์. rc และ. sh ไว้ในไดเรกทอรีที่ผู้ใช้ทุกคนสามารถเข้าถึง / เข้าถึงได้
Huygens

@ inf3rno หากคุณต้องการคำตอบมากกว่านี้คุณควรจะขอบคุณผู้ที่เสนอคำตอบที่ดีแม้ว่าจะไม่สามารถใช้ได้กับกรณีของคุณเพราะข้อมูลหายไปจากคำถามเดิม หรือคนจะไม่ต้องพยายาม
Huygens

0

สิ่งนี้ไม่ได้ตอบคำถามทั่วไปเกี่ยวกับ PATHS แต่อนุญาตให้คุณใช้ที่เก็บ git บนเซิร์ฟเวอร์ระยะไกลที่ไม่มี git ในเส้นทางของมันและคุณไม่สามารถเข้าถึง root ได้ โซลูชันนี้มาจากหน้านี้

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

0

/ etc / profile จะมาจากการเชื่อมต่อแต่ละครั้งด้วย ssh-client


สำหรับล็อกอินเชลล์เท่านั้น
RalfFriedl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.