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.