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:
- Se crea una versión "encarcelada" de la raíz del sistema en algún lugar, como /home/jail
- Los directorios de inicio de los usuarios encarcelados se mueven dentro de esa carpeta como /home/jail/home/testuser
- Los archivos de configuración relevantes se copian en /home/jail/etc/, incluido un /etc/passwd limitado
- Los programas a los que desea permitir el acceso se copian en los directorios correspondientes, como
/bin/bash - 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.