GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo sabe Bash cómo se está invocando?

He instalado jailkit en Ubuntu 12.04 y configuré el shell de un usuario para /bin/bash – pero cuando se invoca ejecuta /etc/bash.bashrc en lugar de /etc/profile

Si no has usado jailkit antes aquí está la esencia de esto:

  1. Se crea una versión "encarcelada" de la raíz del sistema en algún lugar, como /home/jail
  2. Los directorios de inicio de los usuarios encarcelados se mueven dentro de esa carpeta como /home/jail/home/testuser
  3. Los archivos de configuración relevantes se copian en /home/jail/etc/, incluido un /etc/passwd limitado
  4. Los programas a los que desea permitir el acceso se copian en los directorios correspondientes, como
    /bin/bash
  5. Cuando un usuario encarcelado inicia sesión, se conecta a /etc/jail/ y no puede ver ningún archivo por encima de eso

Así que tengo un testuser quién tiene una entrada en /etc/passwd así:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

En el archivo /home/jail/etc/passwd hay una entrada como:

testuser:1001:1003::/home/testuser:/bin/bash

He leído el bash(1) y creo que el problema es que bash cree que no se está invocando como shell de inicio de sesión:

Cuando bash se invoca 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 desde el archivo
/etc/profile, si ese archivo existe.

Obtengo ese bash en realidad está siendo invocado por /usr/sbin/jk_chrootsh pero no entiendo cómo bash es determinar qué tipo de shell es y qué conjunto de archivos de inicio debe ejecutar.

Me gustaría ver si puedo solucionar este problema, pero no entiendo:

¿Cómo sabe bash cómo se está invocando?

pd:también investigué login(1) sin mucha suerte.

Respuesta aceptada:

Normalmente, bash sabe que es un shell de inicio de sesión porque cuando el programa de inicio de sesión lo invoca, le dice a bash que su nombre es -bash . Ese nombre está en argv[0] , el argumento de línea de comando cero, que es convencionalmente la forma en que el usuario invoca el programa. El guión inicial es una convención para decirle a un shell que es un shell de inicio de sesión. Bash también se comporta como un shell de inicio de sesión si le pasa la opción --login o -l . ¿Ve la diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión? para más detalles.

A partir de Jailkit 2.16, jk_chrootsh lee la ruta absoluta al shell para invocar desde varias fuentes y pasa esta ruta como argv[0] , y pasa sus propios argumentos de línea de comandos a ese shell. En el caso de uso normal donde jk_chrootsh se usa en /etc/passwd , no hay forma de pasar un argumento como -l . Dado que la ruta absoluta no comienza con - , no hay forma de hacer jk_chrootsh invoque un shell de inicio de sesión, sin usar un pequeño programa intermedio.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Hubiera esperado jk_chrootsh tener una manera fácil de invocar un shell de inicio de sesión. Sugiero hacer una solicitud de función.

Relacionado:¿Qué hace 'exec {fd}/watchdog' en Bash?
Linux
  1. ¿El propósito de .bashrc y cómo funciona?

  2. Cómo hacer eco de una nueva línea en Bash Shell Scripts

  3. ¿Cómo funciona cat << EOF en bash?

  4. Cómo:¿Historial ilimitado de Bash/shell?

  5. Cómo grep una sección de un archivo en bash Shell

Cómo usar el comando Declare en Linux Bash Shell

Cómo instalar Linux Bash Shell en Windows 10

Cómo verificar si existe un archivo o directorio en Bash Shell

¿Cómo usar Linux Bash Shell dentro de Windows 10?

¿Cómo detectar la disponibilidad de GUI en Bash/Shell?

¿Cómo prueba bash 'falso'?