Linux / Befehl realpath: Absolute und kanonische Pfade auflösen

realpath ist ein Befehl, der einen normalisierten Pfad ausgibt, indem relative Pfade, . und .., redundante Schrägstriche und symbolische Links behandelt werden. Es ist nützlich, um den tatsächlichen Speicherort einer Datei zu überprüfen, zu vergleichen, wie zwei Pfade interpretiert werden, oder um einen relativen Pfad in Bezug auf ein Basisverzeichnis zu erstellen.

Ob Pfadkomponenten existieren müssen, hängt von -e, -E und -m ab. Außerdem kann man eine Datei nicht nur auf Basis des Pfadberechnungsergebnisses als sicher geöffnet betrachten, daher ist eine separate Vorsicht für die Sicherheitsüberprüfung erforderlich.

Ergänzende Befehle und Anwendungsfälle finden Sie in Linux / Befehle / stat - Dateiinformationen und Metadaten überprüfen und Liste der häufig verwendeten Befehle in Linux.

Was ist der realpath-Befehl?

realpath gibt den normalisierten Dateinamen oder Verzeichnispfad aus. Das typische Ergebnis ist ein absoluter Pfad, und unnötige /, ., .. Komponenten sowie symbolische Links werden behandelt.

realpath ./docs/../images/logo.webp

Wenn das aktuelle Arbeitsverzeichnis /home/user/project ist, können Sie Ergebnisse wie die folgenden erhalten.

/home/user/project/images/logo.webp

Das genaue Ergebnis hängt vom aktuellen Arbeitsverzeichnis, der tatsächlichen Verzeichnisstruktur und der Konfiguration der symbolischen Links ab.

Grundlegende Syntax und Verwendung

Prüfen Sie mit realpath --help, welche Optionen Ihre installierte Implementierung unterstützt, bevor Sie die Beispiele verwenden. Besonders bei älteren Systemen oder anderen Unix-Varianten dürfen Sie die GNU-Optionen nicht ungeprüft voraussetzen.

realpath [options] file...

Wenn Sie mehrere Pfade angeben, wird das verarbeitete Ergebnis jedes Pfades auf einer separaten Zeile ausgegeben.

realpath .
realpath ../logs/app.log
realpath /var//log/./nginx/../syslog

Wenn Sie nur den physischen Pfad des aktuellen Verzeichnisses benötigen, ist pwd -P direkter. realpath kann nicht nur den aktuellen Ort, sondern auch mehrere angegebene Pfade verarbeiten.

Auswahl der Bedingungen für die Existenz von Pfaden

In GNU realpath können Sie mit einer Option wählen, wie viel des Pfads tatsächlich existieren muss.

Option Existenzbedingungen
-E, --canonicalize Erlauben, dass die letzte Komponente nicht existiert. Dies ist das Standardverhalten von GNU, kann aber zur Portabilität angegeben werden.
-e, --canonicalize-existing Alle Pfadkomponenten einschließlich des letzten Elements müssen tatsächlich existieren.
-m, --canonicalize-missing Normalisieren Sie den String unter der Annahme, dass fehlende Zwischenkomponenten Verzeichnisse sind.

Erlauben Sie nur Pfade, die mit -e existieren

realpath -e /etc/passwd
realpath --canonicalize-existing /srv/app/config.yml

Wenn auch nur eine einzige Komponente fehlt oder nicht zugänglich ist, schlägt es fehl. Es ist nützlich, wenn Sie nur Objekte weitergeben möchten, die tatsächlich existieren, an nachfolgende Operationen, verhindert jedoch nicht Situationen, in denen sich das Objekt unmittelbar nach der Überprüfung ändert.

Eine fehlende letzte Komponente erlauben mit -E

realpath -E /srv/uploads/new-file.txt

Der obere Pfad kann überprüft werden, aber dies kann in Situationen verwendet werden, in denen die letzte Datei noch nicht erstellt wurde. Es ist das Standardverhalten in GNU, aber um Unterschiede mit der POSIX-Umgebung zu verringern, ist es besser, die Absicht mit einer Option anzugeben.

Fehlende Pfadkomponenten erlauben mit -m

realpath -m /srv/not-created/../future/file.txt

-m behandelt Komponenten, die im Dateisystem nicht existieren, als Verzeichnisse. Es ist nützlich beim Vorberechnen von Pfadzeichenketten, garantiert jedoch nicht, dass der Ausgabepfad tatsächlich existiert oder erstellt werden kann.

Symbolische Links und -L, -P, -s

Pfade mit .. und symbolischen Links zusammen können je nach Verarbeitungsreihenfolge an unterschiedlichen Orten enden.

Option Aktion
-P, --physical Beim Auftreten eines symbolischen Links wird dieser interpretiert, und danach werden nachfolgende .. verarbeitet. Dies ist der Standardmodus in GNU.
-L, --logical Verarbeite die .. in der Pfadzeichenkette logisch, und löse danach die symbolischen Links auf.
-s, --strip, --no-symlinks Bereinigen Sie nur die Punkt-Komponenten und doppelten Schrägstriche, ohne symbolischen Links zu folgen.

Überprüfen Sie den physischen Pfad

realpath -P /srv/current/../shared

Wenn /srv/current ein Link ist, der auf einen anderen Speicherort zeigt, ermitteln Sie zuerst dessen Ziel und berechnen Sie dann den übergeordneten Pfad.

Symbolische Links beibehalten und nur die Zeichenfolge bereinigen

realpath -s -m /srv/current/../shared

Die gleichzeitige Verwendung von -s und -m ermöglicht es Ihnen, die Pfadzeichenfolge selbst zu bereinigen, ohne den Links im tatsächlichen Dateisystem zu folgen. Verwenden Sie diese Kombination nicht, wenn der tatsächliche Zielort benötigt wird.

Relativen Pfad ausgeben

Geben Sie das Basisverzeichnis mit --relative-to an

Sie können den verarbeiteten Pfad als relativen Pfad zu einem bestimmten Verzeichnis ausgeben.

realpath --relative-to=/srv/www /srv/www/assets/css/site.css

Die Ausgabe ist wie folgt.

assets/css/site.css

Nur Teilpfade relativisieren mit --relative-base

Es kann nur dann als relativer Pfad ausgegeben werden, wenn das Ziel unter dem Basisverzeichnis liegt, und als absoluter Pfad beibehalten werden, wenn es sich außerhalb befindet.

realpath --relative-base=/srv/www /srv/www/index.html /var/log/syslog

Der erste Pfad wird als relativer Pfad ausgegeben, und der zweite Pfad wird als absoluter Pfad ausgegeben, weil er sich außerhalb des Basisverzeichnisses befindet.

Unterschied zwischen readlink -f und realpath

Vergleichspunkte realpath readlink -f
Hauptzweck Normalisierung von Dateinamen und Umwandlung in relative Pfade Erweiterte Normalisierungsfunktion bei der Ausgabe von symbolischen Linkzielen
Relative Ausgabe --relative-to und --relative-base Unterstützung Gibt im Allgemeinen absolute kanonische Pfade aus
Empfohlene Verwendung Für die Pfadkanonisierung empfiehlt die GNU-Dokumentation realpath Der Hauptzweck besteht darin, den in einem Link gespeicherten Zielstring zu überprüfen
Portabilität Sie müssen die Unterschiede zwischen Optionen und Standard-Existenzbedingungen überprüfen -f kann nicht als in allen Unix-Implementierungen gleich angenommen werden

Verwendung in Shell-Skripten

Aufzeichnen des tatsächlichen Pfads einer Konfigurationsdatei

config=$(realpath -e -- "$1") || {
 printf '%s\n' 'Cannot verify the configuration file path.' >&2
 exit 1
}

printf 'Configuration file: %s\n' "$config"

Verwenden Sie -e, um zu überprüfen, ob alle Komponenten vorhanden sind, aber es gibt keine Garantie, dass die Datei unverändert bleibt, bis sie später verwendet wird.

Mehrere Dateinamen sicher trennen

-z oder --zero gibt am Ende jedes Ergebnisses ein NUL-Zeichen anstelle eines Zeilenumbruchs aus.

realpath -z -- file1 "file with space"

Es ist nützlich für die Automatisierung, bei der Dateinamen Zeilenumbrüche enthalten können und das Programm, das die Ergebnisse erhält, ebenfalls NUL-getrennte Eingaben unterstützen muss.

Punkte, auf die man bei der Pfadüberprüfung achten sollte

Normalisierung und Zugriffsberechtigung sind unterschiedlich

Nur weil ein normalisierter Pfad unter einem bestimmten Verzeichnis erscheint, gewährt dies nicht automatisch Lese- oder Schreibrechte. Sie müssen Besitz, Berechtigungen, ACLs und Sicherheitsrichtlinien separat überprüfen.

Das Ziel kann sich zwischen der Überprüfung und der Nutzung ändern

Wenn sich ein symbolischer Link oder ein Verzeichnis zwischen der Überprüfung mit realpath und dem Öffnen der Datei ändert, kann ein anderes Ziel verwendet werden. An Sicherheitsgrenzen sollten Sie sich nicht ausschließlich auf einfache Zeichenkettenvergleiche verlassen und sichere Dateiöffnungs-Methoden sowie die vom Betriebssystem bereitgestellte Trennung von Berechtigungen verwenden.

Seien Sie vorsichtig bei Präfix-Zeichenkettenvergleichen

/srv/www-safe beginnt auch mit /srv/www im String. Beim Überprüfen auf die Einbeziehung eines Basisverzeichnisses sollten die Verzeichnisgrenzen berücksichtigt werden, da die Pfadnormalisierung allein keinen sicheren Sandkasten erstellt.

Zusammenfassung der wichtigsten Optionen

Option Beschreibung
-E, --canonicalize Normalisiere Pfade, auch wenn die letzte Komponente fehlt.
-e, --canonicalize-existing Alle Komponenten müssen tatsächlich existieren, um erfolgreich zu sein.
-m, --canonicalize-missing Behandle nicht existierende Komponenten als Verzeichnisse.
-L, --logical Symbolische Links nach der logischen Verarbeitung von .. interpretieren.
-P, --physical Es ist ein physischer Modus, der zuerst symbolische Links auflöst und der Standard für GNU ist.
-s, --no-symlinks Es bereinigt den Pfadstring, ohne symbolische Links aufzulösen.
--relative-to=directory Druckt relative Pfade basierend auf dem angegebenen Verzeichnis.
--relative-base=directory Druckt nur Pfade unter dem Basisverzeichnis als relative Pfade.
-q, --quiet Unterdrückt Diagnosemeldungen über den angegebenen Pfad.
-z, --zero Trennt Ergebnisse mit NUL-Zeichen.

FAQ

Kann realpath auf Dateien verwendet werden, die nicht existieren?

Im Standardverhalten von GNU oder mit -E kann der Fall behandelt werden, dass die letzte Komponente nicht existiert. Wenn Zwischenkomponenten fehlen könnten, verwenden Sie -m; um zu verlangen, dass alle Komponenten existieren, verwenden Sie -e.

Löst realpath immer symbolische Links auf?

Im standardmäßigen physischen Modus werden symbolische Links aufgelöst. Um den Pfadstring zu normalisieren, ohne Links zu folgen, verwenden Sie -s oder --no-symlinks.

Was ist der Unterschied zwischen pwd -P und realpath?

Beide können den physischen absoluten Pfad des aktuellen Standorts anzeigen. pwd -P ist auf das aktuelle Arbeitsverzeichnis spezialisiert, während realpath Optionen für mehrere beliebige Pfade, Existenzbedingungen und relative Pfadausgabe bietet.

Kann das Überprüfen nur des realpath-Ergebnisses Pfad-Traversal-Angriffe verhindern?

Nein. Der Pfad kann sich zwischen der Überprüfung und der Dateinutzung ändern, und Berechtigungsprobleme sind separat. An Vertrauensgrenzen sollten Sie sichere Dateiöffnungs-APIs zusammen mit Trennung von Berechtigungen und Verzeichnisgrenzenprüfungen verwenden.

Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Coreutils realpath Offizielle Dokumentation und GNU Coreutils realpath Anwendungsbeispiele.