SSH – 通过每个连接设置env可变物 – godaddy共享主机

我的问题是,我必须在服务器上设置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文件是空的。 这些文件中有评论,如果你好奇,我可以在这里复制它。

  1. 〜/ .bash_profile来源(仅限bash连接),
  2. 〜/ .bashrc永远不会被find,
  3. 〜/ .profile从来没有来源,
  4. 〜/ .ssh /环境永远不会来源,
  5. 〜/ .ssh / rc源于(通过bash和远程两者),但我认为这是在子shell中调用,因为variables消失。
  6. 〜/ .ssh / authorized_keys是每次都来源的,但是我必须在每个rsa键之前写下命令(所以我不想configuration这个)。

概要:

我可以很好地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_configUsePAM 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