我的问题是,我必须在服务器上设置envvariables(如GIT_EXEC_PATH)。 我需要每个连接的variables(所以通过bash和远程命令)。 我设法通过bash与.bash_profile设置这些variables,但我有远程命令的问题。 我发现有可能在〜/ .ssh / authorized_keys之前编写实际的rsa键,但是我不想总是写在那里,我需要一个永久的解决scheme…我发现〜/ .ssh / rc文件是由每个sshlogin执行的,所以我把我的envvariables声明,但它没有工作。 variables在rc文件中设置,但是之后它们消失了。 :S也许rc文件运行在一个子shell:S有没有什么办法可以在bash和远程命令中定义这些variables而不会有代码重复?
编辑:
我编辑的问题,因为服务器是一个godaddy共享主机,所以它有一个独特的configuration。 / etc / ssh / sshd_config和/ etc / ssh / ssh_config文件是空的。 这些文件中有评论,如果你好奇,我可以在这里复制它。
概要:
我可以很好地configurationbash(使用.bash_profile),但是我不能configuration远程调用。 那就是问题所在。 我正在寻找一个由bash和远程命令来源的文件。
例如:
git-upload-pack命令查找exe文件,因为设置了GIT_EXEC_PATH envvariables,但是使用远程:“git clone [email protected]:myrepo local / myrepo”,服务器找不到该命令,因为GIT_EXEC_PATH没有设置。
EDIT2:
据此,我的printenv日志:〜/ .ssh / rc运行在正常的shell中,而不是在子shell中,所以这是一个谜语为什么envvariables不会粘住…
我创build了一个可执行文件: 〜/ logenv :
echo "" >> mylog.txt date >> mylog.txt printenv >> mylog.txt echo "" >> mylog.txt
把这个放到〜/ .ssh / rc中 :
export AAA=teszt source ~/logenv
通过bashlogin和“源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 [email protected]”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文件是来源的,但在此之后,variables消失…:S
假设你在/etc/ssh/sshd_config有UsePAM yes ,并假设你想为每个用户设置这些环境variables,你可以让pam为你设置环境variables。 如果你有在/etc/gitenv定义的环境variables,你可以添加这行到/etc/pam.d/sshd
auth required pam_env.so envfile=/etc/gitenv
或者通过检查这个文件,你可能会发现已经有一个pam_env.so被使用了,并且已经有一个文件可以添加。 只要小心一点,并确保在结束ssh会话之前彻底地testing了您的更改,就像当您在使用pam时一样,如果您不小心,就可能完全破坏login到服务器的能力。
我使用~/.ssh/environment为我的SSH连接设置了一些环境variables。 该文件可以包含VAR=valueforms的VAR=value ,不需要显式导出它们。
但是,除非选项PermitUserEnvironment设置为yes,否则SSH服务器进程将忽略此用户configuration文件。 因此,您需要确保在SSH服务器上编辑/ etc / sshd_config以添加或更新此参数:
PermitUserEnvironment yes
您需要重新加载SSH服务器configuration。 在RHEL或Suse Linux上,您(以root身份)
/sbin/service sshd reload
(如果不工作,可能用ssh代替sshd)
在Ubuntu(使用暴发户)你做
sudo reload ssh
在任何其他的Linux上,你可以尝试(以root身份)
/etc/init.d/sshd reload
(用ssh或opensshreplacesshd,或者对应于SSH服务器初始化脚本的东西)
如果您使用bash作为您的shell,请尝试将环境设置添加到.bashrc 。
首先检查这是否在login时运行,可能不会像标准文件那样经常有这样的事情:
# If not running interactively, don't do anything [ -z "$PS1" ] && return
在他们开始的时候。 即使对于非交互式login,您想要做的任何更改都需要高于此类声明。
.profile是一个更普通的地方,可以像这样放置configuration,并且被大多数shell(在默认的Debian安装程序~/.profile ,首先调用~/.bashrc )所尊重。 你可能需要更仔细的编辑.profile ,以防其它shell被解释 – 例如,尽量避免使用bash特定的扩展名。
编辑
如果你有.bash_profile编辑,而不是.profile :bash将使用它来支持更一般的文件,并且可以安全地使用bash中特定的东西。
您可以在所有用户/密钥中使用该命令,而无需在authorized_keys中添加命令部分,方法是将此行添加到sshd_config文件中:
ForceCommand ~/connect.sh
在这种情况下,我build议你使用脚本的绝对path
我不再有一个godaddy共享主机,所以我不能检查提出的解决scheme是否有效。 这将保留被接受的答案,因为当我问这个问题的时候,它是有效的。 其他答案也可以。 我让社区决定与upvotes。
好。 解决方法是在godaddy共享主机上没有解决scheme。 我尝试了一切,但没有任何工作,所以我决定留在〜/ .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
所以我必须将command =“…”复制到authorized_keys中的每个rsa密钥。 这是代码重复,但我不认为有一个godaddy共享主机上的另一个解决scheme。
我为你提出另一种方法。
你用你的环境variables的声明来build立一个文件,然后在你每次调用一个远程命令的时候给它一个源文件。
例如:把必要的variables放在〜/ .my_var.rc中,然后为每个远程命令做ssh user@remote bash -c "source ~/.my_var.rc; <your command>"
如果这适合你,那么你可以改进这个概念,并为了方便编写脚本。 如果你只需要git命令,那么我会创build一个git.sh脚本来做到这一点:
#!/bin/bash source ~/.my_var.rc git $@
假设这个脚本会在你的主目录下,你可以调用它: ssh user@remote git.sh pull origin master
注意:这是一个简单的起点。 例如,它不支持带空格的参数。
这并不回答关于PATHS的一般问题,但它确实允许您在远程服务器上使用git存储库,该服务器的path中没有git,并且没有root访问权限。 这个解决scheme来自这个页面 。
git clone -u relative/path/to/bin/git-upload-pack [email protected]: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