SSH: establezca variables de entorno por cada conexión - host compartido de godaddy

16

Mi problema es que tengo que establecer variables env (como GIT_EXEC_PATH) en un servidor. Necesito esas variables por cada conexión (así que por bash y por comandos remotos). Logré establecer esas variables bash con .bash_profile, pero tengo problemas con los comandos remotos. Descubrí que es posible escribir comandos en ~ / .ssh / Authorized_keys antes de la clave rsa real, pero no quiero escribir allí siempre, necesito una solución permanente ... Encontré que el ~ / .ssh El archivo / rc se ejecuta por cada inicio de sesión ssh, así que puse allí mis declaraciones de variables env, pero no funcionó. Las variables se establecen en el archivo rc, pero luego desaparecieron. : S Quizás el archivo rc se ejecute en una subshell: S ¿Hay alguna forma de definir esas variables en bash y en comandos remotos sin duplicación de código?

Editar:

Edité la pregunta, porque el servidor es un host compartido godaddy, por lo que tiene una configuración única. Los archivos / etc / ssh / sshd_config y / etc / ssh / ssh_config están vacíos. Hay comentarios en esos archivos, si tienes curiosidad, puedo copiarlo aquí.

  1. El ~ / .bash_profile se obtiene (solo por conexiones bash),
  2. ~ / .bashrc nunca se obtiene,
  3. el ~ / .profile nunca se obtiene,
  4. el entorno ~ / .ssh / nunca se obtiene,
  5. ~ / .ssh / rc tiene su origen (por bash y remoto ambos), pero creo que se llama en subshell, porque las variables están desapareciendo.
  6. Las ~ / .ssh / Authorized_keys se obtienen cada vez, pero tengo que escribir los comandos antes de cada tecla rsa (por lo que no quiero configurar con eso).

Resumen:

Puedo configurar bien el bash (con .bash_profile), pero no puedo configurar las llamadas remotas. Ese es el problema. Estoy buscando un archivo que proviene tanto de los comandos bash como remotos.

Por ejemplo:

El comando git-upload-pack encuentra el archivo exe, porque la variable env GIT_EXEC_PATH está configurada, pero con el control remoto: "git clone [email protected]: myrepo local / myrepo" el servidor no encuentra ese comando, porque el GIT_EXEC_PATH no está configurado

Edit2:

De acuerdo con esto , y mis registros de printenv: el ~ / .ssh / rc se ejecuta en shell normal, no en subshell, por lo que es un enigma por qué las variables env no se pegan ...

Creé un ejecutable: ~ / logenv :

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

Y poner esto en ~ / .ssh / rc :

export AAA=teszt
source ~/logenv

Por bash login & "source logenv" el resultado fue:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

De forma remota "ssh [email protected] 'exec ~ / logenv'" el resultado fue:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

Por lo tanto, el archivo rc se obtiene, pero después de eso las variables desaparecen ...

inf3rno
fuente
Algunas opciones en este hilo - stackoverflow.com/questions/216202/…
EightBitTony
"A diferencia de / etc / sshrc, que siempre es procesado por el shell Bourne (/ bin / sh), el archivo rc es procesado por el shell de inicio de sesión normal de su cuenta". - eso es extraño porque parece que no se obtendría con un shell normal: S
inf3rno

Respuestas:

12

Asumiendo que tiene UsePAM yesen /etc/ssh/sshd_config, y suponiendo que quieren estas variables de entorno establecidas para cada usuario, que pueden tener variables de entorno establecidas pam para usted. Si tiene las variables de entorno definidas en /etc/gitenv, puede agregar esta línea a/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

O al analizar este archivo, puede encontrar que ya se está utilizando un pam_env.so, y ya hay un archivo al que puede agregar cosas. Solo tenga cuidado y asegúrese de haber probado a fondo sus cambios antes de finalizar su sesión ssh, ya que cuando está jugando con pam, puede romper por completo su capacidad de iniciar sesión en su servidor, si no tiene cuidado.

estofado
fuente
Tengo una cuenta de host compartida godaddy, por lo que solo puedo modificar el directorio ~. (Tiene sistema
operativo
@ inf3rno no hace daño votar bien una buena respuesta :) ya que de todos modos la solución que resolverá su problema puede estar marcada por un medio diferente.
Huygens
Okay. Lo haré, pero no soy el único que puede votar ... :-)
inf3rno
En Ubuntu, parece que /etc/environmentse obtiene pam_env.sode forma predeterminada
rcoup
4

Estoy configurando alguna variable de entorno para mis conexiones SSH usando el ~/.ssh/environment. El archivo puede contener variables en el formulario VAR=value, no es necesario exportarlas explícitamente.

Sin embargo, este archivo de configuración de usuario es ignorado por defecto por el proceso del servidor SSH a menos que la opción PermitUserEnvironment esté establecida en yes. Por lo tanto, debe asegurarse de editar / etc / sshd_config en el servidor SSH para agregar o actualizar este parámetro:

PermitUserEnvironment yes

Necesita volver a cargar la configuración del servidor SSH. En RHEL o Suse Linux lo haces (como root)

/sbin/service sshd reload

(Posiblemente reemplace sshd por ssh si no funciona)

En Ubuntu (usando upstart) lo haces

sudo reload ssh

En cualquier otro Linux, puedes probar (como root)

/etc/init.d/sshd reload

(Reemplace sshd por ssh o openssh o lo que corresponda al script de inicio del servidor SSH)

Huygens
fuente
Gracias, pero no puedo escribir en el directorio / etc, el entorno ~ / .ssh / no tiene su origen.
inf3rno
2

Ya no tengo un host compartido godaddy, por lo que no puedo verificar si las soluciones propuestas son válidas. Esta será la respuesta aceptada, ya que funcionó cuando hice la pregunta. Las otras respuestas podrían funcionar también. Dejo que la comunidad decida eso con votos a favor.

Okay. La solución es que no hay solución en un host compartido godaddy. Intenté todo, pero nada funciona, así que decidí quedarme con las teclas ~ / .ssh / Authorised_keys:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

En el ~ / connect.sh:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

Y en el ~ / .env_profile:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

Entonces tengo que copiar el comando = "..." a cada clave rsa en las claves autorizadas. Esta es la duplicación de código, pero no creo que haya otra solución en un host compartido godaddy.

inf3rno
fuente
1

Si está utilizando bashcomo shell, intente agregar la configuración del entorno .bashrc.

Primero verifique que esto se ejecute al iniciar sesión, puede que no sea así, ya que los archivos estándar a menudo tienen algo como:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

al comienzo de ellos. cualquier cambio que desee realizar incluso para inicios de sesión no interactivos deberá ir por encima de dicha declaración.

.profilees un lugar más general para poner una configuración como esta y es respetada por la mayoría de los shells (en una configuración predeterminada de Debian es en primer lugar lo ~/.profileque llama ~/.bashrc). Es posible que necesite una edición más cuidadosa .profileen caso de que alguna vez sea interpretada por otros shells, es decir, trate de evitar el uso de bashextensiones específicas.

Editar

Si tiene una .bash_profileedición que en lugar de .profile: bash la usará en favor del archivo más general, y puede usar con seguridad cosas específicas de bash allí.

David Spillett
fuente
Lea la sección "Editar" por favor. (.profile no funciona)
inf3rno
1

Puede usar el comando para todos los usuarios / clave sin agregar la parte del comando en los claves_autorizadas agregando esta línea al archivo sshd_config:

ForceCommand ~/connect.sh

En este caso, sugiero que utilice una ruta absoluta para el script

GARCIN David
fuente
0

Te estoy proponiendo otro enfoque.

Configura un archivo con la declaración de su variable de entorno y luego lo obtiene cada vez que llama a un comando remoto.

Ejemplo: pones las variables necesarias en ~ / .my_var.rc y luego para cada comando remoto que haces ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Si esto le conviene, puede refinar este concepto y escribirlo por conveniencia. Si lo necesita solo para comandos git, entonces crearía un script git.sh que haría esto:

#!/bin/bash

source ~/.my_var.rc

git $@

Suponiendo que este script esté en su directorio de inicio, lo llamaría: ssh user@remote git.sh pull origin master

Nota: es un punto de partida simple. Por ejemplo, no admite parámetros con espacios.

Huygens
fuente
Puedo hacer eso ofc, pero esa configuración no es solo para mí, y debería funcionar con git gui donde los comandos se generan automáticamente ...
inf3rno
¿Se conecta al control remoto ssh con el mismo usuario? En caso afirmativo, el archivo ~ / .my_var.rc sería específico del usuario y el git.sh común para todos. De lo contrario, podría agregar un parámetro adicional a git.sh que podría ayudarlo a diferenciar qué archivo .rc se debe obtener (o si usa una IP fija, puede usar la información de env SSH_CLIENT para diferenciar a sus usuarios). El comando debe trabajar con git gui, llamadassh -Y user@remote git.sh gui
Huygens
Necesito la misma configuración de env para cada usuario. No
agregaré
Bueno, si la configuración es la misma para todos los usuarios, entonces la respuesta está completa y puedes ignorar mi comentario anterior. Probablemente necesite colocar los archivos .rc y .sh en un directorio común para todos los usuarios.
Huygens
@ inf3rno si desea obtener más respuestas, ya debería agradecer a quienes propusieron buenas respuestas, incluso si no es aplicable a su caso porque faltaba información en la pregunta original. O la gente no se molestará en intentarlo.
Huygens
0

Esto no responde a la pregunta general sobre PATHS, pero le permite usar un repositorio git en un servidor remoto que no tiene git en su camino y al que no tiene acceso de root. Esta solución proviene de esta página .

git clone -u relative/path/to/bin/git-upload-pack [email protected]:relative/path/to/remote_repository.git

Para empujar y buscar también:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack
Ben
fuente
0

/ etc / profile se obtendrá en cada conexión con ssh-client.

Jason416
fuente
Solo para shells de inicio de sesión.
RalfFriedl