4 votos

Fuente .profile y .bashrc en el inicio de sesión ssh sin tty

¿Cómo puedo asegurarme de que las fuentes ssh .profile y .bashrc ¿en el inicio de sesión sin tty?

Tengo un Mac (10.6.8) que utilizo para varias tareas de tipo UNIX como el alojamiento de repositorios git. Tengo activado el inicio de sesión remoto a través del panel "Compartir" de las Preferencias del Sistema. Cuando ssh en la máquina, bash fuentes ~/.profile que he configurado para obtener mi ~/.bashrc y configurar mi MacPorts camino. El problema es que cuando ejecuto ssh sin tty así:

ssh myhost echo \$PATH

O bien, ejecute un git que esencialmente utiliza ssh de la misma manera:

git clone ssh://myhost/~/code/myrepo.git

Mi ~/.profile nunca se obtiene, por lo que mi $PATH la variable no se encuentra /opt/local (donde MacPorts ha instalado git ). Soy consciente de ello:

  • Puedo configurar git en mi máquina local para utilizar /opt/local/bin/git-* en mi máquina remota
  • No tendría este problema si estuviera forzando una tty con ssh -t

Pero no quiero hacer ninguna de las dos cosas. Quiero que mi máquina remota sea la fuente de mi ~/.profile independientemente de si me estoy conectando con un tty o no.

¿Cómo puedo hacer realidad ese sueño?

También: He comprobado el comportamiento en un par de máquinas Linux (Debian y Fedora), y ambos sistemas parecen tener como origen el ~/.bashrc al iniciar la sesión, independientemente de que se trate de un tty . Tenía la impresión de que tanto BSD como Linux utilizan el mismo OpenSSH y bash implementaciones, por lo que parece que la diferencia en el comportamiento podría venir de las diferencias en /etc ¿archivos de configuración?

7voto

xyz Puntos 21

Este es un método para tener el código fuente de bash .bashrc en sesiones no interactivas para no tener que codificar duramente las variables de entorno en múltiples lugares:

  1. Set PermitUserEnvironment a yes en /etc/sshd_config ( man sshd )
  2. Set BASH_ENV a ~/.bashrc en ~/.ssh/environment ( hombre de la fiesta )
  3. Añade esta línea a la parte superior de tu ~/.bashrc que fuentes /etc/profile para sesiones no interactivas:

Esto esencialmente duplica el entorno de inicio de sesión interactivo para los inicios de sesión no interactivos, sin tener que codificar los valores de entorno (por ejemplo, $PATH) en múltiples lugares.

if [[ ! $- == *i* ]]; then
        . /etc/profile
fi

El paso 3. sólo es necesario si tiene la(s) ruta(s) de Macports establecida(s) en /etc/paths como yo. Pero si usted está estableciendo esas rutas (por ejemplo, /opt/local/bin ) en ~/.bashrc Entonces supongo que no necesitarás el paso 3.

Para su situación, debería poder cambiar ~/.bashrc a ~/.profile .

Tengo ~/.bash_profile fuente ~/.bashrc y no uso ~/.profile . Con esta configuración (y los cambios anteriores), las variables de entorno de bash (por ejemplo, $PATH ) debería ser idéntico para las sesiones interactivas de inicio de sesión, interactivas sin inicio de sesión y no interactivas.

4voto

staffan Puntos 3299

Bash tiene disposiciones especiales en su código fuente para ~/.bashrc cuando es invocado por rshd o sshd . Es una opción de compilación, que dada tu experiencia parece no estar activada en OSX.

Si te conectas con una llave, puedes (ab)usar el botón command= en la opción ~/.ssh/authorized_keys archivo. Una clave con un command sólo sirve para ejecutar el comando especificado; pero el comando en el authorized_keys se ejecuta con la variable de entorno SSH_ORIGINAL_COMMAND establecido en el comando que el usuario especificó (vacío para las sesiones interactivas). Así que puedes usar algo como esto en ~/.ssh/authorized_keys (por supuesto, no se aplicará si no se utiliza esta clave para autenticar):

command=". ~/.profile;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

Tenga en cuenta que he puesto saltos de línea arriba para que sea legible, pero en realidad tiene que estar todo en una sola línea.

¿Cómo puedo establecer variables de entorno para un proceso rsync remoto? puede tener otras sugerencias útiles.

3voto

Nat Puntos 10871

Esto era muy molesto. descomentar esta línea en config-top.h y reconstruir:

/* Defina esto si quiere que bash intente comprobar si está siendo ejecutado por sshd y que se origine el .bashrc si es así (como el comportamiento de rshd). Esto comprueba la presencia de SSH_CLIENT o SSH2_CLIENT en el entorno inicial, lo cual puede ser engañado bajo ciertas circunstancias no muy comunes. */

define SSH_SOURCE_BASHRC

de acuerdo con los CAMBIOS en el código fuente este comportamiento fue cambiado en bash-2.05a-rc1. pero la página man actual todavía reclama el comportamiento anterior:

   Bash attempts to determine when it is being run with its standard input
   connected  to a a network connection, as if by the remote shell daemon,
   usually rshd, or the secure shell daemon sshd.  If bash  determines  it
   is  being  run  in  this  fashion,  it reads and executes commands from
   ~/.bashrc, if that file exists and is readable.  It will not do this if
   invoked as sh.  The --norc option may be used to inhibit this behavior,
   and the --rcfile option may be used to force another file to  be  read,
   but  rshd  does  not  generally  invoke the shell with those options or
   allow them to be specified.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X