Saltar al contenido

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

El paso a paso o código que encontrarás en este artículo es la resolución más sencilla y efectiva que encontramos a tu duda o dilema.

Solución:

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

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

  • shell de inicio de sesión interactivo: Usted inicia sesión en una computadora remota a través de, por ejemplo ssh. Alternativamente, puede acceder a un tty en su máquina local (control+alternativa+F1) e inicie 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 finaliza el script.

  • shell de inicio de sesión no interactivo: Esto es extremadamente raro, y es poco probable que lo encuentres. Una forma de lanzar uno es echo command | ssh server. Cuándo ssh se inicia sin un comando (por lo que ssh en lugar de ssh command que se ejecutará command en el shell remoto) inicia un shell de inicio de sesión. Si el stdin de El ssh no es un tty, inicia un shell no interactivo. Esta es la razón por echo command | ssh server lanzará un shell de inicio de sesión no interactivo. También puedes empezar uno con bash -l -c command.

Si quiere jugar con esto, puede probar los distintos tipos de shell de la siguiente manera:

  • ¿Este caparazón es interactivo?

    Verifique el contenido de la $- variable. Para conchas interactivas, 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 existe una forma portátil de verificar esto pero, para bash, puede verificar si el login_shell se establece la opción:

    ## 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 caparazón:

## 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

Esencialmente, si un shell es de inicio de sesión o no, interactivo o no, importa exactamente por 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 used – el nombre exacto del comando y las opciones.

Por lo demás, las dos propiedades son ortogonales: si un shell es inicio de sesión o no, no influye en la determinación de si es interactivo o no.

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

  • argv[0]el nombre del comando como se invocó, comienza con un -
  • los -l se especifica la opcion

Similar, bash inicia un shell interactivo si alguno de estos es true:

  • no se especificó un archivo para ejecutar (es decir, el comando no fue bash some/file) o un comando string correr (bash -c 'foo') (la condición real es un poco más compleja, consulte el manual)
  • los -i se especificó la opción

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

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

bash -lic true

Que el inicio de sesión a través de la consola o la GUI inicie un shell de inicio de sesión (o tal vez no) es completamente un efecto del proceso de inicio de sesión mediante la invocación adecuada.

Las condiciones y 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 el passwd entrada (que puede provenir de /etc/passwdLDAP o alguna otra fuente).

los login programa, SSH, etc. inicie este shell como un acceso caparazón en el sentido significado en el resto de la respuesta, con un encabezado - en el nombre del comando, por lo general. Si quisiera ser particularmente confuso, podría 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 de la GUI inicia un shell de inicio de sesión simplemente porque los desarrolladores lo consideraron conveniente: LightDM ejecuta un script al iniciar 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 usa scripts de shell en absoluto.

Cáscara de inicio de sesión:

El primer proceso que se ejecuta bajo nuestra ID de usuario cuando iniciamos 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

Concha interactiva:

Lee 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 aviso y habilita 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.

Sección de Reseñas y Valoraciones

Te invitamos a confirmar nuestra función añadiendo un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *