Comment trouver l'emplacement de l'exécutable sur Linux lorsque les méthodes normales échouent?
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écutableargv [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:
-
/ proc / self / exe existe
mais échouez àreadlink ()
en raison d'une autorisation refusée, erreur 13. - Le
argv [0]
n'a pas de/
pour le chemin absolu ou relatif. - Le
$ PATH
ne contient pas l'exécutable trouvé dansargv [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.
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.