¿Es posible que haya un shell de inicio de sesión que no sea interactivo?


11

Al interpretar este diagrama de flujo

ingrese la descripción de la imagen aquí

Encontré eso en man bash:

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.

Eso indica que los shells de inicio de sesión interactivos leen /etc/profile(sin --noprofile)

Además, shells no interactivos con la opción --loginleer/etc/profile

Eso parece dejar algunos posibles de inicio de sesión conchas (en el que las $0aperturas con una -) que se no interactivo (ejecutar un script, tal vez lo más simple date) no pueden leer (fuente) /etc/profile.

Para confirmar o negar esta idea:

Primero intenté usarlo su -l -, que inicia un shell de inicio de sesión con a -como primer carácter, pero no lo hago no interactivo (y no puedo presentar las pruebas para probarlo).

Llamando algo como

$ bash -c 'date' -bash

No informa que sea un shell de inicio de sesión (incluso si el primer carácter es a -).

Prueba esto para revelar los detalles:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

El $0tiene un -como el primer carácter, no hay i(interactivo) en el valor de $-pero no se informa como login_shell(el -u). En este caso, / etc / profile no se leyó, pero no estoy seguro de que esta sea la prueba correcta.


También hay una mención de "shells de inicio de sesión no interactivos raros" en esta respuesta sin ser lo suficientemente específicos para esta pregunta.


La conclusión de este tipo es que /etc/profilesiempre se lee.

Lea la tabla de resumen: lea los shells de inicio de sesión interactivos y no interactivos /etc/profile


Y, si los ejemplos de esta página son correctos:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

La prueba de los exec su - bob -c 'env'informes que /etc/profilese leyó.


En breve:

¿Es posible tener un shell de inicio de sesión no interactivo (no llamado con --login o -l)?

Y si es cierto, ¿está leyendo el /etc/profilearchivo?

Si lo anterior es cierto, tenemos que concluir que TODOS los shells de inicio de sesión [interactivos (o no)] leen / etc / profile (sin --noprofileopción).

Nota: para detectar que / etc / profile se está leyendo, solo agregue al comienzo del archivo este comando:

echo "'/etc/profile' is being read"

Respuestas:


2

Un shell de inicio de sesión no interactivo es inusual, pero posible. Si inicia el shell con el argumento cero (que normalmente es el nombre del ejecutable) establecido en una cadena que comienza con a -, es un shell de inicio de sesión, ya sea interactivo o no.

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

Su intento bash -c date -bashno funcionó porque eso no le dice al shell que sea un shell de inicio de sesión: el argumento cero es bash, no -bash. Después de que bash ha comenzado, establece la variable $0en -bashlugar del argumento zeroth, pero el argumento zeroth es lo que importa.

Puede ejecutar un shell de inicio de sesión no interactivo con su -lo su -, pero debe hacer los arreglos para que la entrada estándar no sea un terminal y al mismo tiempo poder ser autorizado (sin tener que escribir una contraseña o hacer que su contraseña esté al comienzo del entrada). Puede ser más fácil con sudo: ejecutar sudo truepara obtener una credencial de presencia, luego, mientras la credencial sigue siendo válida echo 'shopt -p login_shell; echo $-' | sudo -i.

Consulte también ¿ Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?


4

He visto entornos de inicio de sesión gráficos que hacen:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

o el equivalente de:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

Para que el archivo de inicialización de sesión (como ~/.profilepara shells tipo Bourne (y los correspondientes /etcpara algunos)) sea leído y aplicado.

El primero no funciona con todos los proyectiles. -les compatible con una gran cantidad de shells, pero no todos, y en algunos, como csh/ tcsh, no se puede usar con -c. Sin embargo, todos los shells entienden el primer carácter del argv[0]ser -, ya que eso es lo que se loginusa para decirles a los shells que son shells de inicio de sesión.

En el segundo caso, el stdin de ese shell es algo más que un ttydispositivo ( <<se implementa mediante un archivo regular temporal o una tubería según el shell), por lo que el shell no es interactivo (la definición de ser interactivo cuando un humano interactúa) con eso).


El primero está usando la --loginopción. Para el segundo, si lo hago exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-", obtengo (codificado en C qoutes) $'/etc/profile read\nshopt -s login_shell\nbash himBH', entonces, es login pero es interactivo. Necesitamos inicio de sesión y no interactivo . ¿Qué es lo que me estoy perdiendo?

@sorontar, con <<<"$-", que $-se expande por el shell de llamada debido a las comillas dobles. El shell llamado no es interactivo porque su stdin no es un tty.
Stéphane Chazelas

Ah, sí, tiene razón, señor. Sin embargo, corrigiendo el error, podemos hacer esto: exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFpara obtener esta confirmación: $'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'Entonces, sí, es posible un shell de inicio de sesión no interactivo, y aún así se lee /etc/profile. ¿Deberíamos concluir que TODOS los shells de inicio de sesión se leen /etc/profile?

ksh deja bastante claro que es un shell de inicio de sesión no interactivo , intente exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF:).

1
@sorontar, creo que puede esperar que la mayoría de las implementaciones de shell lean sus archivos de inicialización de sesión cuando se les llama como shells de inicio de sesión. Cuáles son depende de la implementación y la versión del shell. En el caso de bash, el manejo del archivo de inicio es bastante complicado, verás que algunos sistemas lo han parcheado para tener un comportamiento más razonable agregando aún más variación.
Stéphane Chazelas

3

Sí, son posibles shells de inicio de sesión no interactivos

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

Esto es similar a este simplificada: su -c 'echo hello' -. Lo cual, para poner a prueba lo que necesitamos, debe escribirse como: su -c 'echo $0 $-; shopt -p login_shell' -para obtener esta respuesta confirmando (codificado en C comillas): $'/etc/profile read \n -su hBc \n shopt -s login_shell'. Eso confirma que se ejecutó un shell no interactivo de inicio de sesión y que, en el proceso, se leyó / etc / profile. Gracias.

0

¿Es posible tener un shell de inicio de sesión no interactivo (no llamado con --login o -l)?

SI.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

Sin embargo, tenga en cuenta que /etc/profileno se usaría para un shell de inicio de sesión no interactivo a menos --loginque se proporcione el argumento

Un idioma común que invoca un shell de inicio de sesión no interactivo es:

$ su - someuser -c somecommand

Pero esto sufre el hecho de que /etc/profileno se ejecuta.

Es posible cambiar este comportamiento, pero implica personalizar el código fuente de Bash en tiempo de compilación al descomentar una opción que se encuentra en config-top.h :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

Cuando investigué esta suanomalía , descubrí que otras conchas incluyen zshy dashno tienen esta discrepancia.

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.