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


16

我的问题是,我必须在服务器上设置环境变量(如GIT_EXEC_PATH)。我需要每个连接都具有该变量(因此也需要bash和远程命令)。我设法使用.bash_profile通过bash设置了这些变量,但是远程命令存在问题。我发现有可能在实际的rsa密钥之前在〜/ .ssh / authorized_keys中编写命令,但是我并不想一直写在那里,我需要一个永久的解决方案...我发现〜/ .ssh / rc文件由每个ssh登录执行,因此我在其中放置了env变量声明,但是没有用。这些变量在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和remote两者提供的,但是我认为它在subshel​​l中被调用,因为变量消失了。
  6. 〜/ .ssh / authorized_keys每次都源,但是我必须在每个rsa密钥之前编写命令(因此,我不需要对其进行配置)。

摘要:

我可以很好地配置bash(使用.bash_profile),但是不能配置远程调用。那就是问题所在。我正在寻找由bash和远程命令来源的文件。

例如:

git-upload-pack命令找到exe文件,因为设置了GIT_EXEC_PATH env变量,但是对于远程:“ git clone user@domain.com:myrepo local / myrepo”,服务器找不到该命令,因为GIT_EXEC_PATH未设置。

编辑2:

根据这个,我的printenv日志:的〜/ .ssh / RC在正常shell中运行,而不是在子shell,所以这就是为什么ENV变量不是坚持一个谜......

我创建了一个可执行文件:〜/ logenv

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

并将其放入〜/ .ssh / rc中

export AAA=teszt
source ~/logenv

通过bash登录和“ 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文件是源文件,但是之后变量就消失了...:S


在这个线程的某些选项- stackoverflow.com/questions/216202/...
EightBitTony

“与始终由Bourne shell(/ bin / sh)处理的/ etc / sshrc不同,rc文件由帐户的常规登录shell处理。” -这很奇怪,因为它似乎不是由普通shell来提供的:S
inf3rno 2012年

Answers:


12

假设您在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,可能完全破坏了登录服务器的能力。


我有一个godaddy共享主机帐户,因此只能修改〜目录。(它具有centos op系统。)
inf3rno,2012年

@ inf3rno推荐一个好的答案不是有害的:)因为无论如何,解决您问题的解决方案可以用不同的方式来表示。
惠更斯(Huygens)

好。我会的,但我不是唯一可以投票的人... :-)
inf3rno 2012年

在Ubuntu上,默认情况下似乎/etc/environmentpam_env.so默认来源
rcoup19年

4

我正在使用设置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

(用ssh或openssh替换sshd或与SSH服务器初始化脚本对应的任何东西)


谢谢,但是我不能在/ etc目录下写,〜/ .ssh / environment不是源代码。
inf3rno 2012年

2

我已不再是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密钥。这是代码重复,但是我认为Godaddy共享主机上没有其他解决方案。


1

如果要bash用作外壳程序,请尝试将环境设置添加到中.bashrc

首先检查它是否确实在登录时运行,但可能不是这样,因为标准文件通常具有以下内容:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

在他们的开始。您甚至希望为非交互式登录进行的任何更改都必须超出这样的声明。

.profile是放置这样的配置的更一般的地方,并且大多数shell都尊重它(在默认的Debian设置中,首先是~/.profile调用~/.bashrc)。您可能需要更加小心地进行编辑.profile,以防其他外壳程序对其进行解释-即,尝试避免使用bash特定的扩展名。

编辑

如果您进行的.bash_profile编辑不是.profile::bash将使用它来支持更通用的文件,并且可以安全地在其中使用bash特定的东西。


请阅读“编辑”部分。(.profile无法正常工作)
inf3rno,2012年

1

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

ForceCommand ~/connect.sh

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


0

我向您提出另一种方法。

您可以使用环境变量的声明来设置文件,然后在每次调用远程命令时都将其作为源。

示例:将必要的变量放入〜/ .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

注意:这是一个简单的起点。例如,它不支持带空格的参数。


我可以执行ofc,但是该配置并不适合我一个人,它应该与git gui一起使用,在该位置会自动生成命令...
inf3rno 2012年

您是否使用同一用户连接到ssh遥控器?如果是,那么〜/ .my_var.rc文件将是用户特定的,而git.sh将是所有用户的公用文件。如果没有,那么您可以在git.sh中添加一个额外的参数,以帮助您区分哪个.rc文件是源文件(或者使用固定IP的文件,您可以使用SSH_CLIENT env信息来区分用户)。该命令应与git gui一起使用,致电ssh -Y user@remote git.sh gui
惠更斯(Huygens)2012年

我需要为每个用户使用相同的环境设置。我不会在命令中添加多余的部分,这很荒谬……
inf3rno

好吧,如果所有用户的设置都相同,那么答案就完整了,您可以忽略我之前的评论。您可能需要将.rc和.sh文件放在所有用户都可以访问的目录中。
惠更斯(Huygens)

@ inf3rno如果您想要更多的答案,则应该已经对那些提出好的答案的人表示感谢,即使不适用于您的情况,因为原始问题中缺少信息。否则人们将不会尝试。
惠更斯(Huygens)

0

这不能回答有关PATHS的一般问题,但是它确实允许您在远程服务器上使用git存储库,该服务器的路径中没有git,并且您没有root访问权限。此解决方案来自此页面

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.