AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 388826
Accepted
inf3rno
inf3rno
Asked: 2012-05-15 02:22:56 +0800 CST2012-05-15 02:22:56 +0800 CST 2012-05-15 02:22:56 +0800 CST

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

  • 772

我的问题是,我必须在服务器上设置环境变量(如 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 文件是空的。那些文件里有注释,如果你好奇我可以复制到这里。

  1. ~/.bash_profile 是来源(仅通过 bash 连接),
  2. ~/.bashrc 从来没有来源,
  3. ~/.profile 从来没有来源,
  4. ~/.ssh/environment 从来没有来源,
  5. ~/.ssh/rc 是来源(由 bash 和 remote 两者),但我认为它是在子 shell 中调用的,因为变量消失了。
  6. ~/.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

linux ssh environment-variables
  • 8 8 个回答
  • 42478 Views

8 个回答

  • Voted
  1. stew
    2012-05-15T02:50:55+08:002012-05-15T02:50:55+08:00

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

    auth required pam_env.so envfile=/etc/gitenv
    

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

    • 12
  2. Huygens
    2012-05-15T03:30:43+08:002012-05-15T03:30:43+08:00

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

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

    PermitUserEnvironment yes
    

    您需要重新加载 SSH 服务器配置。在 RHEL 或 Suse Linux 上你做(作为根)

    /sbin/service sshd reload
    

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

    在 Ubuntu 上(使用新贵)你做

    sudo reload ssh
    

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

    /etc/init.d/sshd reload
    

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

    • 5
  3. Best Answer
    inf3rno
    2012-05-17T13:08:35+08:002012-05-17T13:08:35+08:00

    我不再有 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 共享主机上没有其他解决方案。

    • 2
  4. David Spillett
    2012-05-15T03:37:54+08:002012-05-15T03:37:54+08:00

    如果您使用bashshell,请尝试将环境设置添加到.bashrc.

    首先检查它是否在登录时运行,它可能不是因为标准文件通常有类似的东西:

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

    在他们的开始。即使对于非交互式登录,您想要进行的任何更改都需要超出此类声明。

    .profile是放置这样的配置的更通用的地方,并且受到大多数 shell 的尊重(在默认的 Debian 设置中,它首先~/.profile调用~/.bashrc)。您可能需要更加小心地进行编辑.profile,以防它被其他 shell 解释——即尽量避免使用bash特定的扩展名。

    编辑

    如果你有一个.bash_profile编辑,而不是.profile: bash 将使用它来支持更通用的文件,你可以安全地在其中使用 bash 特定的东西。

    • 1
  5. GARCIN David
    2014-06-04T03:32:08+08:002014-06-04T03:32:08+08:00

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

    ForceCommand ~/connect.sh
    

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

    • 1
  6. Huygens
    2012-05-15T23:44:04+08:002012-05-15T23:44:04+08:00

    我建议你另一种方法。

    您使用环境变量的声明设置一个文件,然后在每次调用远程命令时获取它。

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

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

    • 0
  7. Ben
    2016-11-15T23:30:33+08:002016-11-15T23:30:33+08:00

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

    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
    
    • 0
  8. Jason416
    2019-11-09T00:50:15+08:002019-11-09T00:50:15+08:00

    /etc/profile 将在与 ssh-client 的每个连接上获取。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve