通过SSH git push设置环境变量

时间:2015-10-24 11:50:13

标签: git ssh environment-variables public-key-encryption githooks

我正在阅读Scott Chacon的Git书,只是想确认一下。这部分:

  

如果通过SSH运行推送,您还可以访问执行推送的用户。如果您允许每个人通过公钥身份验证与单个用户(如“git”)连接,您可能必须为该用户提供一个shell包装器,以确定哪个用户基于公钥进行连接,并且相应地设置一个环境变量。这里我们假设连接用户在$ USER环境变量中,所以你的更新脚本首先收集你需要的所有信息:

#!/usr/bin/env ruby

$refname = ARGV[0]
$oldrev  = ARGV[1]
$newrev  = ARGV[2]
$user    = ENV['USER']

puts "Enforcing Policies..."
puts "(#{$refname}) (#{$oldrev[0,6]}) (#{$newrev[0,6]})"

我认为推送者需要安装包围ssh命令的脚本。例如,脚本可能会将GIT_SSH或GIT_SSH_COMMAND环境变量设置为指向可能具有类似

的shell脚本
#!/bin/bash

HOST=$1
shift
ssh -i ~/.ssh/id_rsa $HOST USER=foo $@

现在,只要git push完成并且遥控器包含ssh url,它就会调用该脚本并在传递USER环境变量时更新refs。

另一种方法是在本地机器上的〜/ .ssh / config中使用“SendEnv USER”,在远程git服务器上的/ etc / ssh / sshd_config中使用“AcceptEnv USER”。

任何其他想到的方式,大胆扩展部分?我特别想找一种不需要推动者在配置环境方面做很多工作的方法。假设每个人都在运行某种形式的Windows,并且需要通过像Cygwin这样的Unix模拟器来设置ssh。

1 个答案:

答案 0 :(得分:1)

此示例与shell或ssh命令无关。

摘自"Server-Side Hook" section,并描述如何根据用户(通过ssh进行身份验证)定制update hook

  

这里我们假设连接用户位于$USER环境变量

没有迹象表明这是如何完成的,但是 gitolite (基于perl的授权层,非常需要用户经过身份验证的ID)正在使用 {{ 3}} ~git/.ssh/authorized_keys中的每个公钥都包含对包装器脚本的调用,该脚本接收用户ID的参数。
该脚本将:

  • 执行git命令
  • 如果命令是除git命令之外的其他任何内容,则
  • 会失败

~git/.ssh/authorized_keys中,您没有只是公钥,而是使用用户ID作为参数调用包装器:

command="/wrapper/script userid",no-port-forwarding,no-X11-for        warding,no-agent-forwarding,no-pty ssh-rsa AAAAB3N...
         ^^^^^^^^^^^^^^^
         (forced command)

您可以在ssh forced command中看到(gitolite here)包装脚本设置的环境变量。