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.




