Secuencia de scripts originados al iniciar sesión

41

Me gustaría concentrar toda mi configuración de inicio de sesión en mi ~/.bash_profile. Había un ~/.bashrcallí por defecto, pero lo reemplacé con un ~/.bash_profile.

Sin embargo, cuando inicio sesión, ~/.bash_profileaparece algo antes de mi y muestra lo siguiente:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

Me gustaría eliminar eso para que solo ~/.bash_profilese muestre mi propio saludo de bienvenida definido en mis visualizaciones, pero no estoy seguro de la lógica / secuencia de secuencias de comandos obtenidas / ejecutadas cuando un usuario inicia sesión. ¿Me puede iluminar?

Como beneficio adicional, también me gustaría conocer la secuencia de fuentes / ejecutivos automatizados cuando se inicia el sistema, no solo cuando un usuario inicia una sesión al iniciar sesión, aunque esta es una preocupación de menor importancia para mí en este momento.

anfibio
fuente

Respuestas:

53

Esto es un poco complejo. En primer lugar, los detalles dependen del tipo de shell que esté ejecutando. Para plagiarme a mí mismo :

  • Cuando abre un emulador de terminal ( gnome-terminalpor ejemplo), está ejecutando lo que se conoce como un shell interactivo sin inicio de sesión .

  • Cuando inicia sesión en su máquina desde la línea de comandos o ejecuta un comando como su - username, está ejecutando un shell de inicio de sesión interactivo .

  • Cuando inicia sesión gráficamente, está ejecutando algo completamente diferente. Los detalles dependerán de su sistema y entorno gráfico, pero en general, es el shell gráfico el que se ocupa de su inicio de sesión. Si bien muchos shells gráficos (incluido el predeterminado de Ubuntu) se leerán /etc/profiley ~/.profileno todos lo harán.

  • Finalmente, cuando ejecuta un script de shell, se ejecuta en un shell no interactivo y sin inicio de sesión .

Los archivos que bash leerá cuando se inicien dependen del tipo de shell en el que se ejecuta. Lo siguiente es un extracto de la sección INVOCACIÓN de man bash(énfasis mío):

Cuando se invoca bash como un shell de inicio de sesión interactivo o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo / etc / profile , si ese archivo existe. Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden , y lee y ejecuta comandos del primero que existe y es legible. La opción --noprofile se puede usar cuando se inicia el shell para inhibir este comportamiento.

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión , bash lee y ejecuta comandos desde /etc/bash.bashrc y ~ / .bashrc , si existen estos archivos. Esto puede inhibirse usando la opción --norc. La opción de archivo --rcfile obligará a bash a leer y ejecutar comandos desde el archivo en lugar de /etc/bash.bashrc y ~ / .bashrc.

Esos son los archivos de inicialización. También tiene /etc/environmentdónde puede establecer variables ambientales globales, pero eso es leído en lugar de fuente (los comandos dentro de él no se ejecutan, pero se establecen definiciones de variables).

Ahora, el saludo que ves es otra cosa otra vez. Eso se establece /etc/motdy se muestra a través de pam_motd. Como se explica en man motd:

Pam_motd (8) muestra el contenido de / etc / motd después de un inicio de sesión exitoso pero justo antes de que ejecute el shell de inicio de sesión.

La abreviatura "motd" significa "mensaje del día", y este archivo se ha utilizado tradicionalmente para eso exactamente (requiere mucho menos espacio en disco que el correo para todos los usuarios).

En Debian GNU / Linux, también se muestra el contenido de /run/motd.dynamic. Este archivo es generado por /etc/init.d/motd en el arranque.

Para eliminar el mensaje, simplemente vacíe el /etc/motdarchivo y asegúrese de que no esté generando nada /etc/init.d/motdsi está presente.


De todos modos, en función de la salida que muestra, parece que está iniciando sesión a través de lo sshque significa que está ejecutando un shell de inicio de sesión interactivo , consulte lo que eso significa. Entonces, en resumen, las cosas que le importan que se obtienen al iniciar sesión son (y en este orden):

  1. El demonio SSH, a través del pam_motdmódulo de la biblioteca PAM, muestra el contenido de /etc/motd. A través del pam_envmódulo, establece las variables de entorno de /etc/environmenty ~/.pam_environment.
  2. Se inicia un shell de inicio de sesión y se leen los siguientes archivos en orden:
    1. /etc/profile
    2. /etc/bash.bashrc(las /etc/profilefuentes predeterminadas de Ubuntu /etc/bash.bashrc).
    3. ~/.bash_profile. Los otros archivos que podrían haberse leído aquí ( ~/.profiley ~/.bash_login) se ignoran porque ~/.bash_profileexisten.
terdon
fuente
55
Un buen truco para descubrir estas cosas es colocar variables centinela. Es decir, yo pongo export SET_IN_ETC_PROFILE=yesen /etc/profile, export SET_IN_HOME_ZSHRC=yesen ~/.zhshrc(soy un usuario zsh), etc ... A continuación, reiniciar el sistema y una bonita env|grep SET_INte contaré toda la historia. Para ver qué variables son vistas por las aplicaciones de escritorio (las que inicia desde el tablero o el WM, sin usar un terminal), consulte askubuntu.com/a/356973/16395
Rmano
1
así que cuando ssh, eso sería un shell interactivo, ¿correcto?
anfibio
@amphibient un shell de inicio de sesión interactivo, sí. Cuando abre una terminal en la máquina local del recorrido, se trata de un shell interactivo sin inicio de sesión.
terdon
@Rmano Voté sus comentarios. Pero momentos después descubrió que la orden envno tiene relación con la orden de ejecución.
Penghe Geng
2
@xiaobai, por supuesto que no, el punto es que SET_INle mostrará qué archivos se han leído, no en qué orden se han leído. El orden es estándar, es lo que se muestra en los extractos de la página de manual que tengo en mi respuesta.
terdon
1

La información que está viendo cuando inicia sesión a través de ssh se crea antes de que / etc / profile sea siquiera visto. Eche un vistazo a la secuencia de archivos en /etc/update-motd.d. Eso le mostrará dónde los mensajes que está viendo son generados por varios scripts.

Reese
fuente
1
Esto ya está cubierto en la respuesta principal, pero agradezco su brevedad. +1 :)
wjandrea