SSH-모든 연결마다 환경 설정 vairables-GoDaddy 공유 호스트


16

내 문제는 서버에서 env 변수 (예 : GIT_EXEC_PATH)를 설정해야한다는 것입니다. 모든 연결 (bash 및 원격 명령 중 하나)에 의해 변수가 필요합니다. bash_profile을 사용하여 bash로 변수를 설정했지만 원격 명령에 문제가 있습니다. 실제 rsa 키 이전에 ~ / .ssh / authorized_keys에 명령을 작성할 수 있다는 것을 알았지 만 항상 거기에 쓰지 않고 영구적 인 해결책이 필요합니다 ... ~ / .ssh / rc 파일은 모든 ssh 로그인에 의해 실행되므로 env 변수 선언을 넣었지만 작동하지 않았습니다. 변수는 rc 파일에 설정되었지만 그 후에 사라졌습니다. : S 아마도 rc 파일이 서브 쉘에서 실행될 수도 있습니다.

편집하다:

서버가 godaddy 공유 호스트이기 때문에 질문을 편집 했으므로 고유 한 구성이 있습니다. / etc / ssh / sshd_config 및 / etc / ssh / ssh_config 파일이 비어 있습니다. 그 파일에 의견이 있습니다. 궁금한 점이 있으면 여기에 복사 할 수 있습니다.

  1. ~ / .bash_profile은 소스입니다 (bash 연결 만).
  2. ~ / .bashrc는 결코 소스되지 않습니다.
  3. ~ / .profile은 소스가되지 않습니다.
  4. ~ / .ssh / environment는 결코 소싱되지 않습니다.
  5. ~ / .ssh / rc는 (bash와 remote 둘 다에 의해) 제공되지만 변수가 사라지기 때문에 서브 쉘에서 호출 된 것 같습니다.
  6. ~ / .ssh / authorized_keys는 매번 소스로 제공되지만 모든 rsa 키 앞에 명령을 작성해야합니다 (따라서 구성하지 않으려 고 함).

요약:

.bash_profile을 사용하여 bash를 잘 구성 할 수는 있지만 원격 호출을 구성 할 수는 없습니다. 그것이 문제이다. bash와 remote 명령 모두에 의해 제공되는 파일을 찾고 있습니다.

예를 들면 다음과 같습니다.

git-upload-pack 명령은 GIT_EXEC_PATH env 변수가 설정되어 있지만 원격 : "git clone user@domain.com : myrepo local / myrepo"로 인해 exe 파일을 찾습니다. GIT_EXEC_PATH 때문에 서버가 해당 명령을 찾지 못합니다. 설정되어 있지 않습니다.

편집 2 :

this 및 내 printenv 로그 에 따르면 ~ / .ssh / rc는 하위 쉘이 아닌 일반 쉘에서 실행되므로 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 파일은 소싱되지만 그 후에 변수는 disappering ... : S


이 스레드에서 일부 옵션 - stackoverflow.com/questions/216202/...
EightBitTony

"Bourne 쉘 (/ bin / sh)에 의해 항상 처리되는 / etc / sshrc와 달리, rc 파일은 계정의 일반 로그인 쉘에 의해 처리됩니다." - 정상적인 쉘에 의해 공급되지 것처럼 보이기 때문에 이상하다 그 : S를
inf3rno

답변:


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가 사용되고 있고 이미 파일을 추가 할 수있는 파일이 있음을 알 수 있습니다. pam을 엉망으로 만들 때 조심하지 않으면 서버에 로그인하는 기능을 완전히 깰 수 있으므로 ssh 세션을 종료하기 전에 변경 사항을 철저히 테스트하고 철저히 테스트하십시오.


godaddy 공유 호스트 계정이 있으므로 ~ 디렉토리 만 수정할 수 있습니다. (그것은 centos op 시스템을 가지고있다.)
inf3rno 11:14에

@ inf3rno 어쨌든 문제를 해결할 솔루션은 다른 수단으로 표시 될 수 있기 때문에 좋은 대답을 찬성하지 않아도됩니다.
Huygens

확인. 나는 것입니다,하지만 난 아니에요 유일한 사람 수 투표까지 ... :-)
inf3rno

우분투에서 그이 보인다 /etc/environment에 의해 공급된다 pam_env.so기본적으로
rcoup

4

를 사용하여 SSH 연결에 환경 변수를 설정하고 있습니다 ~/.ssh/environment. 파일은 형식으로 변수를 포함 할 수 있으며 VAR=value명시 적으로 내보낼 필요가 없습니다.

그러나 PermitUserEnvironment 옵션이 yes로 설정되어 있지 않으면 SSH 서버 프로세스에서이 사용자 구성 파일은 기본적으로 무시됩니다. 따라서이 매개 변수를 추가하거나 업데이트하려면 SSH 서버에서 / etc / sshd_config를 편집해야합니다.

PermitUserEnvironment yes

SSH 서버 구성을 다시로드해야합니다. RHEL 또는 Suse Linux에서 (루트로)

/sbin/service sshd reload

(sshd가 작동하지 않으면 sshd를 ssh로 교체하십시오)

우분투 (업 스타트 사용)

sudo reload ssh

다른 Linux에서는 (루트로) 시도 할 수 있습니다

/etc/init.d/sshd reload

(sshd를 ssh 또는 openssh 또는 SSH 서버 초기화 스크립트에 해당하는 것으로 대체하십시오)


고맙지 만 ~ / .ssh / environment는 / etc 디렉토리에 쓸 수 없습니다.
inf3rno

2

더 이상 godaddy 공유 호스트가 없으므로 제안 된 솔루션이 유효한지 확인할 수 없습니다. 내가 질문을했을 때 저에게 효과가 있었기 때문에 허용 된 답변을 유지합니다. 다른 답변도 효과가있을 수 있습니다. 나는 공동체가 공감대를 가지고 그것을 결정하게했습니다.

확인. 해결책은 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

따라서 authorized_keys의 모든 rsa 키에 command = "..."를 복사해야합니다. 이것은 코드 복제이지만 godaddy 공유 호스트에 다른 솔루션이 있다고 생각하지 않습니다.


1

bash쉘로 사용 하는 경우 환경 설정을에 추가하십시오 .bashrc.

로그인시 실행되는지 먼저 확인하십시오. 표준 파일에는 다음과 같은 내용이 없을 수도 있습니다.

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

그들의 시작에. 비 대화식 로그인에도 변경하려는 사항은 해당 설명보다 높아야합니다.

.profile이와 같은 설정을하는 것이 더 일반적인 장소이며 대부분의 쉘에 의해 존중됩니다 (기본 데비안 설정 에서는 처음에 ~/.profile호출 ~/.bashrc하는 것입니다). .profile다른 쉘이 해석하는 경우를 대비하여 보다 신중하게 편집해야 할 수도 있습니다. 즉, bash특정 확장자를 사용하지 마십시오 .

편집하다

bash .bash_profile대신 편집하는 경우 .profilebash는보다 일반적인 파일을 선호하여 bash 특정 항목을 안전하게 사용할 수 있습니다.


"편집"섹션 pls를 읽으십시오. (.profile이 작동하지 않습니다)
inf3rno

1

다음 행을 sshd_config 파일에 추가하여 authorized_keys에 명령 파트를 추가하지 않고 모든 사용자 / 키에 대해 명령을 사용할 수 있습니다.

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

참고 : 간단한 시작점입니다. 예를 들어, 공백이있는 매개 변수를 지원하지 않습니다.


나는 그 ofc를 할 수 있지만 그 설정은 나만을위한 것이 아니며 명령이 자동으로 생성되는 git gui와 함께 작동해야합니다 ...
inf3rno

동일한 사용자를 사용하여 SSH 원격에 연결합니까? 그렇다면 ~ / .my_var.rc 파일은 사용자마다 다르며 git.sh는 모두 공통입니다. 그렇지 않다면 git.sh에 추가 매개 변수를 추가하여 어떤 .rc 파일을 소스로 구별 할 수 있습니다 (또는 고정 IP를 사용하는 경우 SSH_CLIENT env 정보를 사용하여 사용자를 구별 할 수 있음). 명령은 git gui와 함께 작동해야합니다.ssh -Y user@remote git.sh gui
Huygens

모든 사용자에 대해 동일한 환경 설정이 필요합니다. 나는 ... 그것은 터무니없는, 명령에 여분의 부분을 추가하지 않습니다
inf3rno

그렇다면 모든 사용자에 대해 설정이 동일하면 답변이 완료되어 이전 의견을 무시할 수 있습니다. 모든 사용자가 공통적으로 액세스 할 수있는 디렉토리에 .rc 및 .sh 파일을 넣어야합니다.
Huygens

더 많은 답변을 원할 경우 @ inf3rno 원문에 정보가 누락되어 사례에 해당되지 않더라도 좋은 답변을 제안한 사람들에게 이미 감사해야합니다. 아니면 사람들은 노력하지 않을 것입니다.
Huygens

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.