Configuración de la variable de entorno a través de SSH git push

Estoy leyendo el libro de Git de Scott Chacon, y solo quería confirmar algo. Esta parte:

También tiene acceso al usuario que realiza el empuje si el empuje se está ejecutando a través de SSH. Si ha permitido que todos se conecten con un solo usuario (como "git") a través de la authentication de key pública, es posible que deba otorgarle a ese usuario un contenedor que determine qué usuario se conecta basándose en la key pública y establecer un entorno variable en consecuencia. Aquí asumiremos que el usuario que se conecta está en la variable de entorno $ USER, por lo que su script de actualización comienza reuniendo toda la información que necesita:

#!/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]})" 

Supongo que es necesario que el impulsor instale una secuencia de commands que se ajuste al command ssh. Por ejemplo, el script quizás establezca la variable de entorno GIT_SSH o GIT_SSH_COMMAND para que apunte a un script de shell que puede tener algo así como

 #!/bin/bash HOST=$1 shift ssh -i ~/.ssh/id_rsa $HOST USER=foo $@ 

Ahora, cada vez que se hace un git push y el control remoto contiene una url ssh, invocará ese script y actualizará los refs mientras pasa la variable de entorno USER.

La otra forma sería usar "SendEnv USER" en ~ / .ssh / config en la máquina local y "AcceptEnv USER" en / etc / ssh / sshd_config en el server remoto de git.

¿Alguna otra forma de pensar que se expanda en negrita? Estoy buscando especialmente una manera que no requiera que el impulsor haga mucho trabajo en lo que respecta a la configuration de su entorno. Asum que todos están ejecutando alguna forma de Windows y necesita configurar ssh a través de algún emulador de Unix como Cygwin.

Este ejemplo no es sobre el shell o el command ssh.

Se toma de la sección "Enganche del server" y describe cómo personalizar el enlace de update según el usuario (autenticado a través de ssh)

Aquí asumiremos que el usuario que se conecta está en la variable de entorno $USER

No hay ninguna indicación sobre cómo se hace esto, pero gitolite (una capa de autorización basada en perl, que necesita mucho el ID autenticado por el usuario) está utilizando el command ssh forced : cada key pública en ~git/.ssh/authorized_keys incluye la llamada a un script de envoltura que toma los parameters de la identificación del usuario.
Esa secuencia de commands:

  • ejecuta el command git
  • falla si este el command es algo más que un command git

En ~git/.ssh/authorized_keys , no tiene solo la key pública, sino la llamada al contenedor con el ID de usuario como parámetro:

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

Puede ver la variable de entorno configurada por el script de envoltura (gitolite here) en src/gitolite-shell#L102-L108 .