我的问题是,我必须在服务器上设置环境变量(如 GIT_EXEC_PATH)。我需要每个连接的变量(所以通过 bash 和远程命令)。我设法通过 bash 和 .bash_profile 设置了这些变量,但是我在使用远程命令时遇到了问题。我发现可以在实际的 rsa 密钥之前在 ~/.ssh/authorized_keys 中编写命令,但我不想总是在那里写,我需要一个永久的解决方案......我发现 ~/.ssh /rc 文件由每个 ssh 登录执行,所以我把我的 env 变量声明放在那里,但它没有用。变量在 rc 文件中设置,但之后它们就消失了。:S 也许 rc 文件在子 shell 中运行 :S 有没有办法在 bash 和远程命令中定义这些变量而无需代码重复?
编辑:
我编辑了这个问题,因为服务器是一个 godaddy 共享主机,所以它有一个独特的配置。/etc/ssh/sshd_config 和 /etc/ssh/ssh_config 文件是空的。那些文件里有注释,如果你好奇我可以复制到这里。
- ~/.bash_profile 是来源(仅通过 bash 连接),
- ~/.bashrc 从来没有来源,
- ~/.profile 从来没有来源,
- ~/.ssh/environment 从来没有来源,
- ~/.ssh/rc 是来源(由 bash 和 remote 两者),但我认为它是在子 shell 中调用的,因为变量消失了。
- ~/.ssh/authorized_keys 每次都是来源,但我必须在每个 rsa 密钥之前编写命令(所以我不想用它进行配置)。
概括:
我可以很好地配置 bash(使用 .bash_profile),但我无法配置远程调用。那就是问题所在。我正在寻找一个由 bash 和远程命令提供的文件。
例如:
git-upload-pack 命令找到了 exe 文件,因为设置了 GIT_EXEC_PATH env 变量,但是使用 remote: "git clone [email protected]:myrepo local/myrepo" 服务器找不到该命令,因为 GIT_EXEC_PATH未设置。
编辑2:
根据这个,和我的 printenv 日志:~/.ssh/rc 在普通 shell 中运行,而不是在子 shell 中运行,所以这是一个谜,为什么环境变量没有粘住......
我创建了一个可执行文件:~/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 [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 文件是来源的,但之后变量消失了......:S
假设您有
UsePAM yes
in/etc/ssh/sshd_config
,并假设您希望为每个用户设置这些环境变量,您可以让 pam 为您设置环境变量。如果您在中定义了环境变量,则/etc/gitenv
可以将此行添加到/etc/pam.d/sshd
或者通过检查这个文件,你可能会发现已经有一个 pam_env.so 被使用,并且已经有一个你可以添加东西的文件。请小心,并确保在结束 ssh 会话之前已经彻底测试了您的更改,因为当您使用 pam 时,如果您不小心,可能会完全破坏您登录服务器的能力。
我正在为我的 SSH 连接设置一些环境变量,使用
~/.ssh/environment
. 该文件可以包含 form 中的变量VAR=value
,无需显式导出它们。但是,SSH 服务器进程默认忽略此用户配置文件,除非选项 PermitUserEnvironment 设置为 yes。因此,您需要确保在 SSH 服务器上编辑 /etc/sshd_config 以添加或更新此参数:
您需要重新加载 SSH 服务器配置。在 RHEL 或 Suse Linux 上你做(作为根)
(如果它不起作用,可能用 ssh 替换 sshd)
在 Ubuntu 上(使用新贵)你做
在任何其他 Linux 上,您可以尝试(以 root 身份)
(将 sshd 替换为 ssh 或 openssh 或与 SSH 服务器初始化脚本相对应的任何内容)
我不再有 godaddy 共享主机,所以我无法检查建议的解决方案是否有效。这将保留被接受的答案,因为当我问这个问题时它对我有效。其他答案也可能有效。我让社区通过投票来决定。
好的。解决方法是godaddy共享主机上没有解决方法。我尝试了一切,但没有任何效果,所以我决定继续使用 ~/.ssh/authorized_keys:
在 ~/connect.sh 中:
在 ~/.env_profile 中:
所以我必须将 command="..." 复制到 authorized_keys 中的每个 rsa 密钥。这是代码重复,但我认为在 godaddy 共享主机上没有其他解决方案。
如果您使用
bash
shell,请尝试将环境设置添加到.bashrc
.首先检查它是否在登录时运行,它可能不是因为标准文件通常有类似的东西:
在他们的开始。即使对于非交互式登录,您想要进行的任何更改都需要超出此类声明。
.profile
是放置这样的配置的更通用的地方,并且受到大多数 shell 的尊重(在默认的 Debian 设置中,它首先~/.profile
调用~/.bashrc
)。您可能需要更加小心地进行编辑.profile
,以防它被其他 shell 解释——即尽量避免使用bash
特定的扩展名。编辑
如果你有一个
.bash_profile
编辑,而不是.profile
: bash 将使用它来支持更通用的文件,你可以安全地在其中使用 bash 特定的东西。通过将此行添加到 sshd_config 文件,您可以对所有用户/密钥使用该命令,而无需在 authorized_keys 中添加命令部分:
在这种情况下,我建议您使用脚本的绝对路径
我建议你另一种方法。
您使用环境变量的声明设置一个文件,然后在每次调用远程命令时获取它。
示例:您将必要的变量放在 ~/.my_var.rc 中,然后为您执行的每个远程命令
ssh user@remote bash -c "source ~/.my_var.rc; <your command>"
如果这适合您,您可以改进这个概念并为方便起见编写脚本。如果你只需要它用于 git 命令,那么我会创建一个 git.sh 脚本来执行此操作:
假设此脚本位于您的主目录中,您可以将其命名为:
ssh user@remote git.sh pull origin master
注意:这是一个简单的起点。例如,它不支持带空格的参数。
这并没有回答有关 PATHS 的一般问题,但它确实允许您在远程服务器上使用 git 存储库,该远程服务器的路径中没有 git,并且您没有 root 访问权限。此解决方案来自此页面。
还要推送和获取:
/etc/profile 将在与 ssh-client 的每个连接上获取。