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í.
- El ~ / .bash_profile se obtiene (solo por conexiones bash),
- ~ / .bashrc nunca se obtiene,
- el ~ / .profile nunca se obtiene,
- el entorno ~ / .ssh / nunca se obtiene,
- ~ / .ssh / rc tiene su origen (por bash y remoto ambos), pero creo que se llama en subshell, porque las variables están desapareciendo.
- 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 ...
fuente
Respuestas:
Asumiendo que tiene
UsePAM yes
en/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
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.
fuente
/etc/environment
se obtienepam_env.so
de forma predeterminadaEstoy configurando alguna variable de entorno para mis conexiones SSH usando el
~/.ssh/environment
. El archivo puede contener variables en el formularioVAR=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:
Necesita volver a cargar la configuración del servidor SSH. En RHEL o Suse Linux lo haces (como root)
(Posiblemente reemplace sshd por ssh si no funciona)
En Ubuntu (usando upstart) lo haces
En cualquier otro Linux, puedes probar (como root)
(Reemplace sshd por ssh o openssh o lo que corresponda al script de inicio del servidor SSH)
fuente
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:
En el ~ / connect.sh:
Y en el ~ / .env_profile:
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.
fuente
Si está utilizando
bash
como 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:
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.
.profile
es 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~/.profile
que llama~/.bashrc
). Es posible que necesite una edición más cuidadosa.profile
en caso de que alguna vez sea interpretada por otros shells, es decir, trate de evitar el uso debash
extensiones específicas.Editar
Si tiene una
.bash_profile
edició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í.fuente
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:
En este caso, sugiero que utilice una ruta absoluta para el script
fuente
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:
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.
fuente
ssh -Y user@remote git.sh gui
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 .
Para empujar y buscar también:
fuente
/ etc / profile se obtendrá en cada conexión con ssh-client.
fuente