Wie Lage der ausführbaren Datei auf Linux zu finden, wenn die normalen Methoden versagen?
Frage
In einer anderen Frage stellt die Antwort, die auf Unix-Varianten mit /proc
, die wirklich gerade und zuverlässiger Art und Weise readlink("/proc/self/exe", buf, bufsize)
ist und es geht dann Backup-Lösungen zu geben, wie folgt:
Auf Unix-Varianten ohne / proc (das heißt, wenn oben nicht):
- Wenn argv [0] beginnt mit "/" (absolutem Pfad) dies der Weg ist.
- Andernfalls, wenn argv [0] enthält "/" (relativer Pfad) hängen Sie ihn an cwd (vorausgesetzt, es ist noch nicht geändert).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
- Andernfalls suchen Verzeichnisse in
$PATH
für ausführbareargv[0]
.
Danach kann es sinnvoll sein zu prüfen, ob die ausführbare Datei nicht tatsächlich ein symbolischer Link ist. Wenn es lösen ist es in Bezug auf das Symlink-Verzeichnis.
Jetzt in meinem Fall leider keine der oben genannten Arbeiten:
-
/proc/self/exe exists
aber nichtreadlink()
aufgrund Erlaubnis errno 13 verweigert. - Die
argv[0]
hat keine/
für absoluten oder relativen Pfad. - Die
$PATH
die ausführbare Datei nicht inargv[0]
gefunden enthält.
Es scheint, dieses Problem wird auch konfrontiert, wenn sgid Anwendungen laufen. In meinem Fall ist es nicht sgid, sondern ein inetd zu starten.
Lösung
Versuchen in / proc von einem suid binären suchen.
Andere Tipps
Der beste Weg, dies zu lösen, ist in der /etc/xinetd.d/myApp Konfigurationsdatei, eine Umgebungsvariable hinzufügen, die die Position des binären wie folgt spezifiziert:
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
}
Wenn dann / proc / self / exe Erlaubnis verweigert wird, überprüfen Sie die env varible und es verwenden, statt.
Ich denke, dass die Antwort lautet: aufgeben
.Bitten Sie den Benutzer das Installationsverzeichnis zu übergeben (oder was auch immer Sie suchen) als Befehlszeilenargument.
Als letztes Mittel, analysieren die /etc/xinetd.d/myApp Datei, um die Server-Linie zu ziehen, die den kompletten Pfad zur ausführbaren Datei über inetd gerufen enthält.