Diferenciar el inicio de sesión interactivo y el shell no interactivo sin inicio de sesión


25

Estoy tratando de diferenciar estos cuatro términos de inicio de sesión, no inicio de sesión, interactivo y no interactivo :

  • interactivo - shell de inicio de sesión
  • interactivo: shell sin inicio de sesión
  • no interactivo - shell de inicio de sesión
  • no interactivo - shell sin inicio de sesión

Según tengo entendido
, el shell de inicio de sesión no interactivo: inicie el sistema, inicie sesión en el sistema y abra el terminal y el
shell de inicio de sesión no interactivo : telnet al sistema e inicie sesión

Pero ¿qué pasa con un shell de inicio de sesión interactivo?
¿Inicia sesión en el sistema, abre una terminal virtual e inicia sesión? y
no interactivo - shell sin inicio de sesión, ¿está ejecutando script automatizado en crontab?

Respuestas:


38

El único error real que parece tener es sobre lo que constituye un shell de inicio de sesión no interactivo.

Brevemente (vea aquí para más detalles), con ejemplos:

  • shell de inicio de sesión interactivo: inicia sesión en una computadora remota a través de, por ejemplo ssh. Alternativamente, puede pasar a un tty en su máquina local ( Ctrl+ Alt+ F1) e iniciar sesión allí.

  • shell interactivo sin inicio de sesión: abra una nueva terminal.

  • shell no interactivo sin inicio de sesión: ejecute un script. Todos los scripts se ejecutan en su propio subshell y este shell no es interactivo. Solo se abre para ejecutar el script y se cierra inmediatamente una vez que el script finaliza.

  • shell de inicio de sesión no interactivo: esto es extremadamente raro, y no es probable encontrarlo. Una forma de lanzar uno es echo command | ssh server. Cuando sshse inicia sin un comando (por lo que, en sshlugar de ssh commandejecutarse commanden el shell remoto), inicia un shell de inicio de sesión. Si el stdindel sshno es un tty, inicia un shell no interactivo. Es por eso echo command | ssh serverque lanzará un shell de inicio de sesión no interactivo. También puedes comenzar uno con bash -l -c command.

Si quieres jugar con esto, puedes probar los distintos tipos de shell de la siguiente manera:

  • ¿Es este shell interactivo?

    Verifique el contenido de la $-variable. Para shells interactivos, incluirá i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • ¿Es este un shell de inicio de sesión?

    No hay una forma portátil de verificar esto pero, para bash, puedes verificar si la login_shellopción está configurada:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

Poniendo todo esto junto, aquí hay uno de cada tipo posible de shell:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

Quiero aclarar que 1) Para mí, iniciar sesión en gui significa iniciar el sistema, iniciar sesión en el sistema y abrir la terminal 2) hacer telnet o ssh es un shell de inicio de sesión interactivo significa que el ejemplo que he dado non-interactive login shelles incorrecto.
margarita

@daisy gracias por la aclaración; respuesta editada
terdon

está bien y la interfaz gráfica de usuario es irrelevante, un shell interactivo sin inicio de sesión: simplemente abra una nueva terminal de forma local o remota a través de telnet o ssh
daisy

@daisy sí, suena bien. Pero, por favor, lea la respuesta de Muru también cuidadosamente, ya que eso explica que, esencialmente, esto es una cuestión de semántica y solo afecta los archivos de inicio que lee el shell. Consulte también aquí para obtener una descripción aún más completa de los diferentes tipos de shell.
terdon

Los shells de inicio de sesión no interactivos no son tan infrecuentes, por ejemplo, git los usa, IIRC.
quazgar

6

Esencialmente, si un shell es de inicio de sesión o no, interactivo o no importa por exactamente una razón:

Los archivos de inicialización y las opciones predeterminadas establecidas dependen de si un shell es de inicio de sesión o no e interactivo o no.

En consecuencia, si un shell es de inicio de sesión o no o interactivo o no depende únicamente de la invocación utilizada: el nombre exacto del comando y las opciones.

De lo contrario, las dos propiedades son ortogonales: si un shell es de inicio de sesión o no, no influye en determinar si es interactivo o no.

Bash inicia un shell de inicio de sesión si alguno de estos es verdadero:

  • argv[0], el nombre del comando con el que se invocó comienza con un -
  • la -lopción está especificada

De manera similar, bash inicia un shell interactivo si alguno de estos es verdadero:

  • no se especificó un archivo para ejecutar (es decir, el comando no fue bash some/file) o una cadena de comando para ejecutar ( bash -c 'foo') (la condición real es un poco más compleja, consulte el manual)
  • la -iopción fue especificada

Notablemente (y paradójicamente), esto último implica que bash -ic 'foo'comienza un shell interactivo.

Entonces, lo siguiente inicia un inicio de sesión, un shell interactivo, aunque no tiene nada de interactivo y la invocación no tuvo nada que ver con el inicio de sesión:

bash -lic true

El inicio de sesión a través de la consola o la GUI inicia un shell de inicio de sesión (o tal vez no) es un efecto del proceso de inicio de sesión utilizando la invocación adecuada.

Las condiciones y los efectos se describen en detalle en el manual de bash, sección sobre Archivos de inicio .


Una fuente importante de confusión es que hay otro significado común para el shell de "inicio de sesión":

El shell de inicio de sesión de un usuario es el shell definido en la passwdentrada de ese usuario (que puede provenir de /etc/passwd, LDAP o alguna otra fuente).

El loginprograma, SSH, etc. inicia este shell como un shell de inicio de sesión en el sentido que se entiende en el resto de la respuesta, con un encabezado -en el nombre del comando, por lo general. Si quisieras ser particularmente confuso, podrías decir:

Algunos procesos de inicio de sesión inician el shell de inicio de sesión del usuario como un shell de inicio de sesión.

Tenga en cuenta que el inicio de sesión GUI inicia un shell de inicio de sesión simplemente porque los desarrolladores lo consideraron conveniente: LightDM ejecuta un script de inicio de sesión que obviamente no es interactivo y ciertamente no depende del shell de inicio de sesión del usuario (en el segundo sentido). Sin embargo, no dependa de que el administrador de pantalla inicie un shell de inicio de sesión; no todos lo hacen, y en Wayland y GNOME, el proceso de inicio de sesión no utiliza scripts de shell.


3

Shell de inicio de sesión:

El primer proceso que se ejecuta con nuestra ID de usuario cuando iniciamos sesión en una sesión. El proceso de inicio de sesión le dice al shell que se comporte como un shell de inicio de sesión con una convención: pasar el argumento 0, que normalmente es el nombre del ejecutable del shell, con un carácter "-" antepuesto

Shell interactivo:

Lee los comandos de la entrada del usuario en un tty. Entre otras cosas, dicho shell lee los archivos de inicio en la activación, muestra un mensaje y permite el control de trabajos de forma predeterminada. El usuario puede interactuar con el shell. Un shell que ejecuta un script siempre es un shell no interactivo.

En pocas palabras: el shell interactivo requiere la entrada del usuario, mientras que el shell no interactivo se ejecuta mediante scripts y no requiere entradas del usuario.


Entonces los ejemplos que se dan son correctos.
margarita

Sí, Margarita, estás en el lugar correcto.
George Udosen

1
@daisy no! La GUI no tiene absolutamente nada que ver con eso. Se trata de shells de línea de comando, no shells gráficos (que también existen pero son una bestia diferente).
terdon

1
@ George no, hay dos errores: iniciar sesión a través de la GUI no inicia un shell de inicio de sesión (o cualquier otro tipo de shell relevante) e iniciar sesión en un sistema remoto a través de telnet inicia un shell de telnet, pero a través de ssh comienza un inicio de sesión interactivo cáscara.
terdon

1
@ George en realidad, estoy corregido. Algunos administradores de inicio de sesión de GUI pueden iniciar un shell de inicio de sesión para leer .profile(pensé que solo se originaban .profilemanualmente, pero podría estar equivocado ).
terdon

0

Me gustaría mencionar que puede iniciar un shell de inicio de sesión interactivo:

  1. ejecutar sudo /bin/loginy escribir sus credenciales
  2. ejecutando exec -l /bin/bash
  3. ejecutando su -
  4. y como las respuestas mencionadas anteriormente, usando ssh e inicie sesión en una máquina remota

Además, puede verificar (en bash) si el shell es de inicio de sesión escribiendo echo $0y si la salida comienza con un guión -, entonces es un shell de inicio de sesión.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.