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

3

¿Cómo me aseguro de que ssh sources .profile y .bashrc en el inicio de sesión sin tty?

Tengo un Mac (10.6.8) que estoy usando para varias tareas UNIX-y como alojar repositorios git. Tengo el inicio de sesión remoto habilitado a través del panel "Compartir" de las Preferencias del Sistema. Cuando ssh en la máquina, bash sources ~/.profile , que configuré para obtener mi archivo ~/.bashrc y configuré mi MacPorts ruta. El problema es que cuando ejecuto ssh sin un tty , como este:

ssh myhost echo \$PATH

O ejecuta un comando git que esencialmente usa ssh de la misma manera:

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

El archivo ~/.profile nunca se obtiene, por lo que mi variable $PATH falta /opt/local (donde MacPorts ha instalado git ). Soy consciente de que:

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

Pero no quiero hacer nada de eso. Quiero que mi máquina remota genere mi archivo ~/.profile sin importar si estoy iniciando sesión con w / a tty

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

También: verifiqué el comportamiento en un par de máquinas Linux (Debian y Fedora), y ambos sistemas parecen obtener el archivo ~/.bashrc en el inicio de sesión, independientemente de si es un tty . Tenía la impresión de que BSD y Linux usan el mismo OpenSSH y bash , ¿parece que la diferencia en el comportamiento podría deberse a diferencias en los archivos /etc config?

    
pregunta aaronstacy 30.08.2011 - 19:48

3 respuestas

2

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

Si está iniciando sesión con una clave, puede (ab) usar la opción command= en ~/.ssh/authorized_keys . Una clave con una opción command es válida solo para ejecutar el comando especificado; pero el comando en el archivo authorized_keys se ejecuta con la variable de entorno SSH_ORIGINAL_COMMAND establecida en el comando que el usuario especificó (vacío para sesiones interactivas). Así que puedes usar algo como esto en ~/.ssh/authorized_keys (por supuesto, no se aplicará si no usas 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 coloco los saltos de línea arriba para que sean legibles, pero esto en realidad debe ser todo en una línea.

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

    
respondido por el Gilles 30.08.2011 - 23:05
5

Aquí hay un método para tener bash source .bashrc en sesiones no interactivas para que no tenga que codificar variables de entorno de código en varios lugares:

  1. Establezca PermitUserEnvironment en yes en /etc/sshd_config ( man sshd )
  2. Establezca BASH_ENV en ~/.bashrc en ~/.ssh/environment ( man bash )
  3. Agregue esta línea en la parte superior de su ~/.bashrc , que es el origen de /etc/profile para sesiones no interactivas:

Básicamente, esto duplica el entorno de inicio de sesión interactivo para los inicios de sesión no interactivos, sin tener que tener valores de entorno de código rígido (por ejemplo, $ PATH) en varios lugares.

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

El paso 3. es necesario solo si tienes las rutas de Macports configuradas en /etc/paths como yo. Pero si está configurando esas rutas (por ejemplo, /opt/local/bin ) en ~/.bashrc , supongo que no necesitaría el Paso 3.

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

Tengo ~/.bash_profile source ~/.bashrc y no uso ~/.profile . Con esta configuración (y los cambios anteriores), las variables de entorno bash (por ejemplo, $PATH ) deben ser idénticas para el inicio de sesión interactivo, el inicio de sesión interactivo y las sesiones no interactivas.

    
respondido por el Clayton Stanley 31.12.2012 - 01:36
3

Esto fue muy molesto. descomente esta línea en config-top.h y reconstruya:

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

define SSH_SOURCE_BASHRC

de acuerdo con los CAMBIOS en la fuente, este comportamiento se cambió en bash-2.05a-rc1. pero la página de manual 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.
    
respondido por el Ping Mai 17.11.2011 - 20:20

Lea otras preguntas en las etiquetas