¿Hay shells de inicio de sesión no interactivos?

14

Sé cuál es la diferencia entre los shells interactivos / no interactivos y de inicio de sesión / no inicio de sesión, pero parece que en la práctica nunca habrá un shell de inicio de sesión no interactivo a menos que tenga algo como /bin/bash --login some-script.shen un script (e incluso eso parece un poco extraño) ¿Es esto correcto o son más comunes?

Capitán Hombre
fuente
77
telnet towel.blinkenlights.nlpara un shell de inicio de sesión que no es interactivo ;-)
Martin Tournoij
1
Esta pregunta se responde brevemente dentro de esta respuesta más larga .
Comodín el
@CaptainMan: Mirando las respuestas, tenemos dos que se centran en significados muy diferentes de "interactivo". A la luz de esto, ¿puede ampliar un poco su respuesta para explicar qué significado estaba usando cuando hizo la pregunta?
Curt J. Sampson

Respuestas:

10

Supongo que está hablando del concepto de Bash de inicio de sesión frente a no inicio de sesión y shells de Bash interactivo frente a no interactivo como se describe en la sección Invocación de la página de manual. (Esto es diferente de la interpretación en la respuesta de James Youngman de cualquier comando arbitrario utilizado como "shell" (o intérprete de comandos de usuario) en el passwd(5)archivo y si ese programa acepta o no la entrada del usuario; algunos, como /usr/sbin/nologin, obviamente, no lo hacen. )

Estás en lo correcto /bin/bash --login some-script.shy producirá una invocación de Bash de inicio de sesión no interactiva, y este es quizás un ejemplo patológico. Hay un caso, tal vez poco común, pero no es realmente raro, que produce un shell de entrada no interactivo: ssh somehost < some-file. Aquí sshdcomenzará Bash con argv[0]set to -bashporque no se le ha dado un comando para ejecutar, lo que hace que Bash se considere un shell de inicio de sesión, pero, debido a que stdin no está conectado a un terminal, Bash no se establecerá en modo interactivo ( $-no contendrá i) .

(Personalmente, ese caso parece mucho más razonable que lo contrario, lo ssh somehost somecommandque no se considera un "shell de inicio de sesión" a pesar de que es un inicio de sesión nuevo somehosttal como lo es anteriormente).

Recientemente hice lo que debería haber hecho hace mucho tiempo y armé una tabla de modos de Bash y qué archivos de inicio se ejecutan . Si te resulta confuso, anímate a que al menos yo también lo haga. Me desconcierta cuál era su objetivo original con las reglas sobre cuándo .bashrcse ejecuta.

Curt J. Sampson
fuente
1

La mayoría de los shells de inicio de sesión por conteo en un sistema recién instalado no son interactivos, en realidad:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Claramente /bin/bashy /bin/shson conchas tradicionales y son interactivas. Pero todos los demás elementos de esa lista no son interactivos. Si está leyendo la lista y no sabe qué hace uno de ellos, puede buscar su página de manual (con, por ejemplo, man nologino man sync).

Lo que hace realmente el comando

Al mirar el historial de publicaciones del Capitán Man, veo que son bastante inexpertos con Unix. Entonces, tal vez la pregunta en el comentario sobre no seguir relacionada con la línea de comando en la parte superior de la respuesta, no simplemente la salida. Así que también explicaré la línea de comandos, a pesar de que está realmente fuera de tema para esta pregunta.

El comando es una tubería de Unix . Una canalización es una cadena de comandos, lo lee de izquierda a derecha, en la que la salida del primer comando se convierte en la entrada del segundo, la salida del segundo se convierte en la entrada del tercero, y así sucesivamente, hasta que el Fin de la tubería. La salida del último proceso se muestra en el terminal (a menos que se haya redirigido). Consulte la entrada de Wikipedia sobre tuberías de shell para obtener más información.

Si no comprende lo que está haciendo una tubería, simplemente puede ejecutarla en segmentos para ver qué está sucediendo. También puede leer la página del manual de los comandos que se están utilizando (aquí awk, sorty uniq). De hecho, deberías hacer eso ahora. Esperaré.

Vamos a ejecutar las etapas de la tubería de forma incremental (puede hacerlo de manera segura en su propio sistema Unix):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

El resultado anterior es simplemente el contenido del séptimo campo del /etc/passwdarchivo. Esa es la base de datos (archivo de texto plano) que le dice al sistema cuál es el shell de inicio de sesión de todos. Si desea obtener más información, /etc/passwdsimplemente léalo (es legible en todo el mundo) y mire la página del manual (man 5 passwd).

Entonces, al leer la lista completa, puede hacerse una idea de cuáles son los artículos populares, pero ese no es un buen formato para responder a esta pregunta, porque la pregunta era realmente sobre cuán comunes son los shells no interactivos. Vamos a contarlos. La forma más sencilla de hacerlo es ordenar primero los elementos:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Podemos usar el programa uniqpara mostrarnos solo los elementos únicos:

~ $ awk -F: '{print $ 7}' </ etc / passwd | ordenar | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Pero espera, no sirve de nada, ¿cuántos de cada uno estaban allí? Preguntemos uniq(¡lea la página del manual!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

Esa es la salida que vimos en la parte superior de la respuesta, por supuesto. Vamos a ordenarlo nuevamente para ver las entradas en orden:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Espera, eso no puede ser correcto, 17 viene antes de 1 y 5 después de 23. El problema es que los artículos se ordenan lexicográficamente . Pidamos sortordenarlos numéricamente y en orden inverso:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Creo que eso explica todo en la respuesta original. Si aún no está claro sobre los detalles de lo que hacen esos comandos, puede leer las páginas del manual. Si aún no tiene claros los principios de lo que está sucediendo, podría ser mejor comenzar leyendo un libro (en línea o en papel) que explique Unix y Linux.

James Youngman
fuente
¿Puedes explicar un poco más por favor? No estoy seguro de seguir lo que estoy leyendo.
Capitán Man
es /bin/syncuna concha? Entonces, ¿alguna utilidad es un shell?
eloone
@eloone hay dos (tal vez tres) significados para "shell". Uno es, los programas configurados como un shell de inicio de sesión en la base de datos de contraseñas. Este es el significado de la palabra que significa la frase "shell de inicio de sesión no interactivo". El otro significado es "un REPL adecuado para el trabajo interactivo del día a día en un sistema Unix". Esos son interactivos. Sin embargo, la mayoría de los programas que se pueden usar en el contexto REPL también admiten el uso no interactivo como intérpretes para algún tipo de lenguaje de script (aunque "script de shell" casi universalmente significa "script de shell Bourne-family").
James Youngman
2
Parece que estás respondiendo una pregunta diferente. Simplemente enumera los shells disponibles y señala que algunos nunca serán interactivos. Creo que el OP pregunta si alguna vez se encuentra un shell de inicio de sesión no interactivo en la naturaleza. Entonces, si los shells que pueden ser interactivos, bash, por ejemplo, siempre inician shells de inicio de sesión no interactivos . En otras palabras, un "shell de inicio de sesión" aquí no significa "un shell de inicio de sesión predeterminado del usuario", sino un shell que se ha lanzado como un shell de inicio de sesión . Ver unix.stackexchange.com/a/46856/22222
terdon
1
O tal vez, dado que el póster escribe explícitamente bash --loginen la pregunta, está preguntando específicamente sobre bashprocesos que no tienen la iopción establecida. (Estos surgen de comandos como ssh somehost < script.sh; este será un shell de "inicio de sesión, no interactivo" en los sentidos especificados en la sección INVOCACIÓN de la página de manual de Bash.)
Curt J. Sampson