通过SSH-git-push设置环境变量

通过SSH-git-push设置环境变量,git,ssh,environment-variables,public-key-encryption,githooks,Git,Ssh,Environment Variables,Public Key Encryption,Githooks,我正在读Scott Chacon的Git书,只是想确认一下。本部分: 如果推送是通过SSH运行的,您还可以访问执行推送的用户。如果您允许每个人通过公钥身份验证与单个用户(如“git”)连接,您可能必须为该用户提供一个shell包装器,该包装器根据公钥确定哪个用户正在连接,并相应地设置一个环境变量。这里我们假设连接用户位于$user环境变量中,因此您的更新脚本首先收集您需要的所有信息: #!/usr/bin/env ruby $refname = ARGV[0] $oldrev = ARGV[

我正在读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_命令环境变量设置为指向shell脚本,该脚本可能具有以下内容

#!/bin/bash

HOST=$1
shift
ssh -i ~/.ssh/id_rsa $HOST USER=foo $@
现在,只要完成git推送并且远程端包含ssh url,它就会调用该脚本并在传递用户环境变量的同时更新refs

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


有没有其他方法可以用粗体字在零件上展开?我特别想寻找一种不需要推动者在配置环境方面做很多工作的方法。假设每个人都在运行某种形式的Windows,并且需要通过一些Unix仿真器(如Cygwin)设置ssh。

此示例与shell或ssh命令无关

它取自,并描述了如何根据用户定制(通过ssh进行身份验证)

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

没有说明如何做到这一点,但是(一个基于perl的授权层,非常需要用户身份验证id)正在使用:在
~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)

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

Hmm,是的,我考虑过gitolite,并且已经到了一篇文章中关于在Windows上安装它的部分,现在我只需要按照官方的gitolite文档安装它。我再次查看了Gitolite文档,并对sshd、authorized_密钥和ssh强制命令选项进行了大量研究。目前看来,这似乎有点过头了。然而,如果我采用Gitolite路线,最终,我将需要在post接收中访问该用户ID字符串,以便根据推送的用户进行一些有条件的行为。谢谢你的意见。非常感谢。哦,我明白了,看起来我可以用GL_用户env var做我想做的事,但看起来裸git repos也必须存在于~/repositories文件夹中,这使得事情变得不那么透明,因为开发人员必须在本地repos中更改远程配置。@solstice333我的重点是说明如何使用iser id设置环境变量,基于ssh强制命令调用您的脚本(不一定调用gitolite)。Gitolite只是一个如何做到这一点的示例,但您可以编写自己的脚本。@solstice333如果您编写自己的脚本,您只需要了解如何获取用户公钥和用户id,以便在
~/.ssh/authorized_keys
中注册它们(使用强制命令语法)。然后,repo可以位于您想要的任何位置,因为您的脚本将对其调用git命令。