Wie Lage der ausführbaren Datei auf Linux zu finden, wenn die normalen Methoden versagen?

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

  •  05-07-2019
  •  | 
  •  

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ührbare argv[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:

  1. /proc/self/exe exists aber nicht readlink() aufgrund Erlaubnis errno 13 verweigert.
  2. Die argv[0] hat keine / für absoluten oder relativen Pfad.
  3. Die $PATH die ausführbare Datei nicht in argv[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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top