GNU/Linux >> Tutoriels Linux >  >> Linux

Comment Bash sait-il comment il est invoqué ?

J'ai installé jailkit sur Ubuntu 12.04 et j'ai configuré le shell d'un utilisateur sur /bin/bash – mais lorsqu'il est appelé, il exécute /etc/bash.bashrc au lieu de /etc/profile

Si vous n'avez pas utilisé jailkit avant en voici l'essentiel :

  1. Une version "emprisonnée" de la racine système est créée quelque part, comme /home/jail
  2. Les répertoires personnels des utilisateurs emprisonnés sont déplacés dans ce dossier comme /home/jail/home/testuser
  3. Les fichiers de configuration relatifs sont copiés dans /home/jail/etc/ – y compris un /etc/passwd limité
  4. Les programmes auxquels vous souhaitez autoriser l'accès sont copiés dans les répertoires correspondants, comme
    /bin/bash
  5. Lorsqu'un utilisateur emprisonné se connecte, il est chrooté sur /etc/jail/ et ne peut voir aucun fichier au-dessus

J'ai donc un testuser qui a une entrée dans /etc/passwd comme ceci :

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

Dans le fichier /home/jail/etc/passwd il y a une entrée comme :

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

J'ai lu le bash(1) et donc je pense que le problème est que bash pense qu'il n'est pas invoqué en tant que shell de connexion :

Lorsque bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option –login, il lit et exécute d'abord les commandes à partir du fichier
/etc/profile, si ce fichier existe.

Je reçois ce bash est en fait invoqué par /usr/sbin/jk_chrootsh mais je ne comprends pas comment bash détermine de quel type de shell il s'agit et quel ensemble de fichiers de démarrage il doit exécuter.

J'aimerais voir si je peux résoudre ce problème, mais je ne comprends pas :

Comment bash sait-il comment il est invoqué ?

ps :j'ai également examiné login(1) sans beaucoup de chance.

Réponse acceptée :

Normalement, bash sait qu'il s'agit d'un shell de connexion car lorsque le programme de connexion l'invoque, il indique à bash que son nom est -bash . Ce nom est dans argv[0] , l'argument zéro de la ligne de commande, qui est classiquement la façon dont l'utilisateur a appelé le programme. Le trait d'union initial est une convention pour indiquer à un shell qu'il s'agit d'un shell de connexion. Bash se comporte également comme un shell de connexion si vous lui passez l'option --login ou -l . Voir la différence entre le shell de connexion et le shell sans connexion ? pour plus de détails.

Depuis Jailkit 2.16, jk_chrootsh lit le chemin absolu vers le shell à invoquer à partir de diverses sources et passe ce chemin sous la forme argv[0] , et transmet ses propres arguments de ligne de commande à ce shell. Dans le cas d'utilisation normal où jk_chrootsh est lui-même utilisé dans /etc/passwd , il n'y a aucun moyen de passer un argument tel que -l . Puisque le chemin absolu ne commence pas par - , il n'y a aucun moyen de faire jk_chrootsh appeler un shell de connexion, sans utiliser un petit programme intermédiaire.

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

Je m'attendais à jk_chrootsh pour avoir un moyen simple d'invoquer un shell de connexion. Je suggère de faire une demande de fonctionnalité.

En relation :que fait "exec {fd}/watchdog" dans Bash ?
Linux
  1. Comment cat << EOF fonctionne-t-il dans bash?

  2. Comment savoir si j'exécute un shell imbriqué ?

  3. Comment inclure un fichier dans un script shell bash

  4. Comment détecter la disponibilité de l'interface graphique dans Bash/Shell ?

  5. Comment grep une section d'un fichier dans bash shell

Comment utiliser la commande Declare dans Linux Bash Shell

Comment installer Linux Bash Shell sur Windows 10

Comment vérifier si un fichier ou un répertoire existe dans Bash Shell

Comment utiliser Linux Bash Shell dans Windows 10 ?

Comment :Historique Bash/shell illimité ?

Comment bash teste-t-il 'faux'?