Comment trouver l'emplacement de l'exécutable sur Linux lorsque les méthodes normales échouent?

StackOverflow https://stackoverflow.com/questions/1604132

  •  05-07-2019
  •  | 
  •  

Question

Dans une autre question, la réponse indique que sous Unix avec / proc , la méthode la plus simple et la plus fiable consiste à readlink ("/ proc / self / exe", buf, bufsize ) et donne ensuite les solutions de sauvegarde comme suit:

Sous Unix sans / proc (c'est-à-dire si échoue ci-dessus):

  • Si argv [0] commence par " / " (chemin absolu) c'est le chemin.
  • Sinon, si argv [0] contient " / " (chemin relatif) l'ajoute à cwd (en supposant qu'il n'ait pas encore été modifié).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
  • Sinon, recherchez les répertoires dans $ PATH pour l'exécutable argv [0] .

Ensuite, il peut être raisonnable de vérifier si le fichier exécutable n’est pas réellement un lien symbolique. Si c'est le cas, résolvez-le par rapport au répertoire des liens symboliques.

Dans mon cas, malheureusement, aucune de ces solutions ne fonctionne:

  1. / proc / self / exe existe mais échouez à readlink () en raison d'une autorisation refusée, erreur 13.
  2. Le argv [0] n'a pas de / pour le chemin absolu ou relatif.
  3. Le $ PATH ne contient pas l'exécutable trouvé dans argv [0] .

Il semble que ce problème se pose également lorsque des applications sgid sont exécutées. Dans mon cas, ce n'est pas un sid, mais un lancement inetd.

Était-ce utile?

La solution

Essayez de regarder dans / proc à partir d'un binaire suid.

Autres conseils

La meilleure façon de résoudre ce problème consiste à ajouter une variable d'environnement qui spécifie l'emplacement du fichier binaire dans le fichier de configuration /etc/xinetd.d/myApp:

service myApp
{
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/local/bin/myAppd
    env = MY_APP_HOME=/usr/local/bin
    port = 2354
    disable = no
}

Ensuite, si l'autorisation / proc / self / exe est refusée, recherchez la variable env et utilisez-la à la place.

Je pense que la réponse est: abandonnez.

Demandez à l'utilisateur de passer le répertoire d'installation (ou ce que vous cherchez) en tant qu'argument de ligne de commande.

En dernier recours, analysez le fichier /etc/xinetd.d/myApp pour extraire la ligne du serveur contenant le chemin complet de l'exécutable appelé par inetd.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top