es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Especificando múltiples comandos para GIT_SSH_COMMAND

Antecedentes

La mayoría de los sistemas que uso en el trabajo solo están disponibles en la red local de la empresa o en una VPN. Cuando estoy conectado a esas redes, mis conexiones pasan por un proxy que está protegido con autenticación básica HTTP.

Sin embargo, uno de mis proyectos requiere que me conecte a GitHub con claves SSH. Esto está todo configurado y funcionando bien cuando estoy fuera de la red corporativa/VPN (es decir, sin proxy), pero he estado tratando de hacer que funcione también cuando estoy dentro de esa red, ya que no quiero tener que desvincular y volver a conectar la VPN para acceder a los otros sistemas protegidos mencionados anteriormente. Y me he acercado bastante.

Muchos artículos y respuestas en SO sugieren agregar una entrada a mi .ssh/config para github.com, y usar la opción ProxyCommand con cosas como nc o corkscrew. Pero ninguno de estos pareció funcionar bien con el requisito de autenticación de mi proxy. La única herramienta que ha funcionado es desproxy.

Puedo conectarme exitosamente a mi repositorio de GitHub detrás de la VPN usando la siguiente configuración de ssh:


Host github.com
IdentityFile <key>
HostName 127.0.0.1
Port 2222

Y luego ejecutando los siguientes comandos:


set PROXY_USER=$proxy_user:$proxy_pw
desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &
git clone git@github.com:<user>/<repo>.git

Pregunta

Ahora, quiero alguna manera de ejecutar estos comandos cada vez que clono con SSH. No quiero una alias para git, porque entonces desproxy se iniciará cada vez que ejecute un comando git; solo debe iniciarse cuando se realiza un git clone|fetch|push|etc en un repositorio con un control remoto basado en SSH. Según entiendo, ese es el propósito de la variable de entorno GIT_SSH_COMMAND, o de la variable de configuración de git core.sshCommand.

Donde me estoy atascando – tengo varios comandos que deben ejecutarse antes de ssh, así que esperaría que mi configuración se parezca a una de las siguientes:


<h1>variable de entorno</h1> export GIT<em>SSH</em>COMMAND="set PROXY<em>USER=$proxy</em>user:$proxy<em>pw; desproxy ssh.github.com 443 $proxy</em>host $proxy_port 2222 &; ssh" <h1>variable de configuración de git (usando '\;' en lugar de ';' ya que se usa para comentarios en el archivo de configuración de git)</h1> [core] sshCommand = set PROXY<em>USER=$proxy</em>user:$proxy<em>pw\; desproxy ssh.github.com 443 $proxy</em>host $proxy_port 2222 &\; ssh

<p>Pero ambos métodos fallan
“`

<h1>variable de entorno</h1>

❯ git clone git@github.com:<user>/<repo>.git
Cloning into '<repo>'…
set PROXY<em>USER=$proxy</em>user:$proxy<em>pw; desproxy ssh.github.com 443 $proxy</em>host $proxy_port 2222 &; ssh: 1: Syntax error: ";" unexpected
fatal: Could not read from remote repository.

Por favor, asegúrese de tener los derechos de acceso correctos
y el repositorio existe.

<h1>variable de configuración de git</h1>

❯ git clone git@github.com:<user>/<repo>.git
fatal: bad config line 6 in file /home/murchu27/.gitconfig

<pre><code><br />&lt;p&gt;Entonces, ¿cuál es la forma correcta de usar múltiples comandos para &lt;code&gt;GIT_SSH_COMMAND&lt;/code&gt;?&lt;/p&gt;

&lt;hr&gt;

&lt;h2&gt;Actualización&lt;/h2&gt;

&lt;p&gt;Intenté la sugerencia de @phd de omitir el punto y coma después del ampersand en mi &lt;code&gt;GIT_SSH_COMMAND&lt;/code&gt;; es decir, usando el siguiente código:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
export GIT_SSH_COMMAND=&quot;set PROXY_USER=$proxy_user:$proxy_pw; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &amp; ssh&quot;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sin embargo, ahora obtengo un nuevo error:&lt;/p&gt;

&lt;p&gt;“`
❯ git clone git@github.com:<user>/<repo>.git
Cloning into ‘<repo>’…
bind: Address already in use</p>

<h2>fatal: protocol error: bad line length character:</h2>

No se asignará un seudoterminal porque la entrada estándar no es un terminal.
ssh: No se pudo resolver el nombre de host PROXY<em>USER=<proxy</em>user>:<proxy_pw>: Nombre o servicio desconocido


Actualización 2

Acepté la respuesta de @phd, ya que responde a esta pregunta, aunque no resuelve mi problema específico. Trabajé en un script auxiliar para que esto funcione, que publicaré más tarde.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    La forma correcta de usar múltiples comandos con GIT_SSH_COMMAND es separarlos con el operador "&&" en lugar del punto y coma " ; ". El punto y coma es interpretado por la shell como un separador de comandos, lo que significa que el segundo comando se ejecuta independientemente del éxito o fracaso del primer comando.

    Por ejemplo, la forma correcta de establecer GIT_SSH_COMMAND con varios comandos en la variable de entorno es:

    export GIT_SSH_COMMAND="set PROXY_USER=$proxy_user:$proxy_pw && desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 & ssh"
    

    Y la forma correcta de establecerlo en el archivo de configuración de git es:

    [core]
        sshCommand = set PROXY_USER=$proxy_user:$proxy_pw && desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 & ssh
    

    De esta manera, el segundo comando se ejecuta solo si el primero se completa con éxito.

Comments are closed.