¿Qué son los shells de inicio y no inicio de sesión?

78

Se dice que la configuración para el shell sin inicio de sesión va al .bashrcarchivo y la configuración del shell de inicio de sesión para ir al .profilearchivo.

¿Qué se entiende realmente por shells de inicio de sesión y sin inicio de sesión?

Explique sin utilizar jerga técnica en la medida de lo posible.

DUQUE
fuente

Respuestas:

83

Simplemente pon:

  • Si abre un shell o terminal (o cambia a uno), y le pide que inicie sesión (Nombre de usuario? Contraseña?) Antes de que se le solicite, es un shell de inicio de sesión.
  • Si no lo hace (como gnome-terminal ) y le permite usarlo de inmediato, es un shell sin inicio de sesión.

Si usted es un usuario normal de Ubuntu Desktop, el único shell de inicio de sesión es ... su escritorio (escriba una contraseña para ingresar, ¿verdad?)? Bueno, técnicamente es un shell de inicio de sesión que inicia una GUI, pero eso está entrando en la jerga. Y sí, leerá la configuración en.profile

La única vez que usted (un usuario normal) probablemente verá un shell de inicio de sesión que parece un shell de inicio de sesión es si tiene algún problema con su escritorio y cambia a un terminal virtual con el acceso directo Ctrl+ Alt+ F1.


Los otros casos generales para tener un shell de inicio de sesión incluyen:

  • Acceder a su computadora de forma remota a través de ssh(o conectarse localmente con ssh localhost)
  • simulando un shell de inicio de sesión inicial con bash -l(o sh -l)
  • simulando un rootshell de inicio de sesión inicial consudo -i
    • o para otro no usuariosudo -u username -iroot
  • autenticándose como otro no rootusuario con (y su contraseña)su - username
  • usando el sudo logincomando para cambiar de usuario
ish
fuente
Si inicio mi Eclipse IDE desde la terminal, se abre como se esperaba, pero si intento abrirlo haciendo clic en el icono de Eclipse, no puede reconocer la ubicación de Java (a menos que PATH for Java esté configurado en el archivo .profile). Eso significa que hacer clic en el icono de Eclipse necesita un shell de inicio de sesión, ¿por qué?
DUKE
2
@DUKE, No, significa que las variables de entorno deben establecerse de manera diferente cuando está utilizando un escritorio / GUI en comparación con un verdadero sistema de consola de línea de comandos. ¡Ponga su RUTA, etc.en ~/.pam_environment(solo variables, no hay comandos bash allí), cierre sesión, inicie sesión y vea todo lo que aparece mágicamente en el escritorio, así como en gnome-terminal!
ish
1
El inicio de sesión a través de ssh no invoca un shell de inicio de sesión. No se carga /etc/profile, /etc/profile.do ~/.profile.
xuhdev
Ver esta pregunta .
xuhdev
@xuhdev Iniciar sesión a través de ssh invoca un shell de inicio de sesión y carga / etc / profile, /etc/profile.d y ~ / .bash_profile.
MichaelZ
9

No creo que se pueda dar una respuesta correcta sin "jerga técnica". Dado que esta pregunta es la primera que aparece en Google para la consulta “¿Qué es un shell de inicio de sesión?”, A continuación proporciono una respuesta más correcta:

El shell de inicio de sesión es simplemente un shell que se le dijo que fuera un shell de inicio de sesión. No , no significa concha que aparece después de que se conecte, aunque por lo general aplicación que se registra en la cáscara está diciendo que lanza a ser un intérprete de ingreso. Existen las siguientes formas de decirle a Shell que debe ser una de inicio de sesión:

  1. Ejecutar shell con -lo --loginargumento suponiendo que lo sabe (no conozco ningún shells que no conozca -l, pero --loginsolo es compatible con unos pocos shells).
  2. Ejecutar shell con argv[0]set to -{some_string}(es decir, con HYPHEN-MINUS antepuesto al habitual argv[0]o a alguna otra cadena). Esto es lo que hacen ssh y su: su solo ejecuta ejecutable con -suas argv[0](hola a todos los que piensan que argv[0]tiene algo que ver con el nombre ejecutable actualmente en ejecución), ssh ejecuta zsh con -zshcuando el usuario ha establecido /bin/zshsu shell.

Loginess of the shell no tiene absolutamente nada que ver con que alguien le solicite una contraseña o realice algún otro procedimiento de autenticación. Algunos programas como ssh o login (o algunos emuladores de terminal como urxvt) ejecutan shells como login utilizando aquellos argv[0]que comienzan con un HYPHEN-MINUS. Algunos como su o sudo (o zsh: consulte el -modificador de precomando que se describe en la sección MODIFICADORES DE PRECOMMAND man zshmisc) en no lo hacen de forma predeterminada, pero se puede decir que sí. Algunos tienen la única opción de decirle a Shell que sea el de inicio de sesión utilizando su argumento (es decir bash -l): ssh con un argumento de comando (que explícitamente le dice a ssh qué ejecutar en el extremo remoto).

En general, es mejor consultar primero la documentación del programa utilizado para invocar el shell para determinar si será el inicio de sesión y luego realizar algunas pruebas para determinar si la aplicación lanzará un shell de inicio de sesión (por ejemplo, agregando echoa .profile).

ZyX
fuente
Estoy interesado en la segunda opción: ¿cómo puedo cambiar argv [0] antes (o después) de invocar bash? ¿Se puede hacer desde la línea de comando?
VeryHardCoder
@VeryHardCoder Esto depende de la aplicación que use para ejecutar el comando. En el código C se realiza mediante el suministro directo argv[0]a una de las exec*funciones, natural e inevitable: siempre se proporcionan ambos argv[0] y la ruta al comando realmente se ejecuta cuando se utilizan exec*funciones, incluso si nunca desea argv[0]ser diferente de la ejecución del comando. Otros idiomas proporcionan sus propios modos. Específicamente, bash permite el uso exec -a new_argv0 bash, pero esto, por supuesto, reemplazará el shell actualmente en ejecución con lo que haya execeditado, por lo que es posible que deba usar subshell ( (exec -a -zsh zsh))
ZyX
¡Ok lo tengo! En realidad, podría hacerse incluso de una manera más simple: (exec -l bash) ...
VeryHardCoder
1
¿Cuál es la diferencia funcional entre los dos? ¿Es esto simplemente una bandera booleana?
Alexey
@Alexey La diferencia funcional principal es un conjunto de archivos de configuración utilizados en el inicio. $0, y, tal vez también se configure algo más (variable, configuración, etc.) para que se pueda detectar la lógica del shell en el archivo de configuración, pero ¿quién se molesta realmente en detectar esto para que haga alguna diferencia? Eso es todo lo que sé.
ZyX