我正在阅读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。
答案 0 :(得分:1)
此示例与shell或ssh命令无关。
摘自"Server-Side Hook" section,并描述如何根据用户(通过ssh进行身份验证)定制update
hook
这里我们假设连接用户位于
中$USER
环境变量
没有迹象表明这是如何完成的,但是 gitolite (基于perl的授权层,非常需要用户经过身份验证的ID)正在使用 {{ 3}} :~git/.ssh/authorized_keys
中的每个公钥都包含对包装器脚本的调用,该脚本接收用户ID的参数。
该脚本将:
在~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)包装脚本设置的环境变量。