SSH-通过每个连接设置环境变量-godaddy共享主机

SSH-通过每个连接设置环境变量-godaddy共享主机

我的问题是,我必须在服务器上设置环境变量(例如 GIT_EXEC_PATH)。每次连接我都需要这些变量(因此 bash 和远程命令都需要)。我设法通过 bash 和 .bash_profile 设置这些变量,但在使用远程命令时遇到问题。我发现可以在实际 rsa 密钥之前在 ~/.ssh/authorized_keys 中写入命令,但我不想总是在那里写入,我需要一个永久的解决方案...我发现每次 ssh 登录都会执行 ~/.ssh/rc 文件,因此我将我的环境变量声明放在那里,但没有用。变量在 rc 文件中设置,但之后它们就消失了。:S 也许 rc 文件在子 shell 中运行 :S 有没有办法在 bash 和远程命令中定义这些变量而不重复代码?

编辑:

我编辑了这个问题,因为服务器是 godaddy 共享主机,所以它有一个唯一的配置。/etc/ssh/sshd_config 和 /etc/ssh/ssh_config 文件是空的。这些文件中有注释,如果你感兴趣我可以把它复制到这里。

  1. ~/.bash_profile 的来源(仅通过 bash 连接),
  2. ~/.bashrc 从未被引用,
  3. ~/.profile 从未被引用,
  4. ~/.ssh/environment 从未被引用,
  5. ~/.ssh/rc 是有来源的(由 bash 和远程两者),但我认为它是在子 shell 中调用的,因为变量消失了。
  6. 每次都会获取 ~/.ssh/authorized_keys,但是我必须在每个 rsa 密钥之前写入命令(所以我不想用它来进行配置)。

概括:

我可以很好地配置 bash(使用 .bash_profile),但无法配置远程调用。这就是问题所在。我正在寻找一个由 bash 和远程命令提供的文件。

例如:

git-upload-pack 命令找到 exe 文件,因为设置了 GIT_EXEC_PATH 环境变量,但使用远程:“git clone[电子邮件保护]: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 &“源 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”[电子邮件保护]‘执行〜/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

答案1

假设您UsePAM yes在 中有/etc/ssh/sshd_config,并且假设您希望为每个用户设置这些环境变量,您可以让 pam 为您设置环境变量。如果您在 中定义了环境变量,则/etc/gitenv可以将此行添加到/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

或者通过检查此文件,您可能会发现已经有一个 pam_env.so 正在使用,并且已经有一个可以添加内容的文件。请务必小心,并确保在结束 ssh 会话之前彻底测试了您的更改,因为当您摆弄 pam 时,如果您不小心,您可能会完全破坏登录服务器的能力。

答案2

我正在使用 为我的 SSH 连接设置一些环境变量~/.ssh/environment。该文件可以包含 形式的变量VAR=value,无需明确导出它们。

但是,除非选项 PermitUserEnvironment 设置为 yes,否则 SSH 服务器进程默认会忽略此用户配置文件。因此,您需要确保在 SSH 服务器上编辑 /etc/sshd_config 以添加或更新此参数:

PermitUserEnvironment yes

您需要重新加载 SSH 服务器配置。在 RHEL 或 Suse Linux 上,您可以(以 root 身份)执行此操作

/sbin/service sshd reload

(如果不起作用,可以用 ssh 替换 sshd)

在 Ubuntu 上(使用 upstart),你可以

sudo reload ssh

在任何其他 Linux 上,你可以尝试(以 root 身份)

/etc/init.d/sshd reload

(将 sshd 替换为 ssh 或 openssh 或任何与 SSH 服务器初始化脚本相对应的脚本)

答案3

我不再拥有 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

所以我必须将 command="..." 复制到 authorized_keys 中的每个 rsa 密钥。这是代码重复,但我认为在 godaddy 共享主机上没有其他解决方案。

答案4

您可以将这一行添加到 sshd_config 文件,从而对所有用户/密钥使用该命令,而无需在 authorized_keys 中添加命令部分:

ForceCommand ~/connect.sh

在这种情况下,我建议您对脚本使用绝对路径

相关内容