내 문제는 서버에서 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 파일이 비어 있습니다. 그 파일에 의견이 있습니다. 궁금한 점이 있으면 여기에 복사 할 수 있습니다.
- ~ / .bash_profile은 소스입니다 (bash 연결 만).
- ~ / .bashrc는 결코 소스되지 않습니다.
- ~ / .profile은 소스가되지 않습니다.
- ~ / .ssh / environment는 결코 소싱되지 않습니다.
- ~ / .ssh / rc는 (bash와 remote 둘 다에 의해) 제공되지만 변수가 사라지기 때문에 서브 쉘에서 호출 된 것 같습니다.
- ~ / .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
답변
당신이 가정 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 세션을 종료하기 전에 변경 사항을 철저히 테스트하고 철저히 테스트하십시오.
답변
를 사용하여 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 서버 초기화 스크립트에 해당하는 것으로 대체하십시오)
답변
더 이상 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 공유 호스트에 다른 솔루션이 있다고 생각하지 않습니다.
답변
bash
쉘로 사용 하는 경우 환경 설정을에 추가하십시오 .bashrc
.
로그인시 실행되는지 먼저 확인하십시오. 표준 파일에는 다음과 같은 내용이 없을 수도 있습니다.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
그들의 시작에. 비 대화식 로그인에도 변경하려는 사항은 해당 설명보다 높아야합니다.
.profile
이와 같은 설정을하는 것이 더 일반적인 장소이며 대부분의 쉘에 의해 존중됩니다 (기본 데비안 설정 에서는 처음에 ~/.profile
호출 ~/.bashrc
하는 것입니다). .profile
다른 쉘이 해석하는 경우를 대비하여 보다 신중하게 편집해야 할 수도 있습니다. 즉, bash
특정 확장자를 사용하지 마십시오 .
편집하다
bash .bash_profile
대신 편집하는 경우 .profile
bash는보다 일반적인 파일을 선호하여 bash 특정 항목을 안전하게 사용할 수 있습니다.
답변
다음 행을 sshd_config 파일에 추가하여 authorized_keys에 명령 파트를 추가하지 않고 모든 사용자 / 키에 대해 명령을 사용할 수 있습니다.
ForceCommand ~/connect.sh
이 경우 스크립트의 절대 경로를 사용하는 것이 좋습니다.
답변
다른 접근법을 제안하고 있습니다.
환경 변수 선언으로 파일을 설정 한 다음 원격 명령을 호출 할 때마다 해당 파일을 소싱합니다.
예 : ~ / .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
참고 : 간단한 시작점입니다. 예를 들어, 공백이있는 매개 변수를 지원하지 않습니다.
답변
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