Perintah realpath Linux: jalur absolut, tautan, dan opsi keberadaan

Perintah realpath menormalkan jalur menjadi jalur absolut dengan menyelesaikan komponen ., .., garis miring berlebihan, dan tautan simbolik sesuai opsi yang dipilih. Gunakan untuk mengetahui bagaimana suatu jalur ditafsirkan atau untuk menghasilkan jalur relatif terhadap direktori dasar tertentu.

Syarat keberadaan komponen jalur berbeda antara -e, -E, dan -m. Menghasilkan nama jalur tidak membuka file untuk dipakai atau menjamin keamanannya; pemeriksaan izin dan cara membuka file tetap merupakan langkah terpisah.

Apa itu perintah realpath?

realpath mengeluarkan nama file atau jalur direktori yang telah dinormalisasi. Hasil tipikalnya adalah jalur absolut, dan komponen /, ., .. yang tidak diperlukan serta tautan simbolik ditangani.

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

Jika direktori kerja adalah /home/user/project, direktori docs dan images ada serta bukan tautan, hasil ilustrasinya adalah:

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

Hasil yang tepat tergantung pada direktori kerja saat ini, struktur direktori yang sebenarnya, dan konfigurasi tautan simbolik.

Sintaks dasar dan penggunaan

realpath [opsi] jalur...

Panduan ini memakai GNU Coreutils. Periksa realpath --version dan realpath --help karena versi GNU lama dan implementasi lain dapat memiliki opsi berbeda; tidak semua versi lama menyediakan -E eksplisit. GNU menerima beberapa jalur dan menampilkan satu hasil per baris. Jalur contoh berikut perlu disesuaikan dengan direktori yang tersedia pada sistem Anda.

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

Untuk direktori kerja saat ini saja, pwd -P untuk melihat jalur fisik lebih langsung. realpath juga dapat memproses jalur lain. Pada mode fisik, komponen direktori yang dilalui sebelum .. tetap harus dapat diselesaikan; penulisan docs/.. tidak otomatis membuat direktori docs yang hilang menjadi valid.

Memilih kondisi keberadaan jalur

Dalam GNU realpath, Anda dapat memilih dengan opsi seberapa banyak jalur yang harus benar-benar ada.

Opsi Kondisi keberadaan
-E, --canonicalize Mengizinkan komponen terakhir hasil resolusi belum ada; prefiksnya tetap harus menjadi direktori yang ada. Ini adalah default GNU pada mode normal, dan opsi eksplisit tersedia pada versi yang mendukungnya.
-e, --canonicalize-existing Semua komponen jalur termasuk item terakhir harus benar-benar ada.
-m, --canonicalize-missing Memperlakukan komponen yang hilang atau tidak tersedia sebagai direktori saat menghitung hasil.

Izinkan hanya jalur yang ada dengan -e

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

Contoh pertama memerlukan /etc/passwd yang ada; contoh kedua memerlukan konfigurasi aplikasi Anda pada jalur tersebut. Jika satu komponen hilang atau tidak dapat ditelusuri, resolusi gagal. Dengan -e, garis miring di akhir juga mensyaratkan objek berupa direktori. Keberhasilan tidak mencegah target berubah sesudah pemeriksaan.

Izinkan komponen terakhir yang hilang dengan -E

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

Contoh ini memerlukan prefiks /srv/uploads yang dapat diselesaikan ke direktori yang ada, sementara new-file.txt boleh belum dibuat. Jika jalur melewati tautan, syarat itu berlaku pada hasil resolusinya. POSIX tidak menetapkan satu default tanpa opsi yang seragam, sehingga pada implementasi yang mendukungnya tentukan -e atau -E secara eksplisit.

Izinkan komponen jalur yang hilang dengan -m

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

-m berguna untuk menghitung jalur ketika komponen belum tersedia, tetapi tidak menjamin hasilnya ada atau dapat dibuat. Opsi ini masih dapat menyelesaikan tautan yang dapat ditemukan. Untuk pengolahan string tanpa resolusi tautan, gabungkan dengan -s.

Tautan simbolik dan -L, -P, -s

Jalur dengan .. dan tautan simbolik bersama-sama dapat berakhir di lokasi yang berbeda tergantung pada urutan pemrosesan.

realpath -L tetap menyelesaikan tautan yang tersisa setelah pemrosesan logis. Artinya berbeda dari mempertahankan semua nama tautan pada keluaran pwd -L.

Opsi Tindakan
-P, --physical Saat menemui tautan simbolik, itu diartikan, lalu .. berikutnya diproses. Ini adalah mode default di GNU.
-L, --logical Proses .. di string jalur secara logis, lalu selesaikan tautan simbolik.
-s, --strip, --no-symlinks Bersihkan hanya komponen titik dan garis miring ganda tanpa mengikuti tautan simbolik.

Periksa jalur fisik

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

Misalkan /srv/current menunjuk /srv/releases/2026-09 dan direktori yang diperlukan tersedia. Mode -P akan menuju target dahulu sehingga contoh dapat menghasilkan /srv/releases/shared. Pada mode -L, current/.. diproses lebih dulu sehingga hasil dapat menjadi /srv/shared. Ini ilustrasi struktur deployment, bukan perintah untuk membuat atau memindahkan tautan.

Pertahankan tautan simbolik dan cukup bersihkan string

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

Menggunakan -s dan -m bersama-sama memungkinkan Anda membersihkan string jalur itu sendiri tanpa mengikuti tautan di sistem file yang sebenarnya. Jangan gunakan kombinasi ini ketika lokasi target yang sebenarnya dibutuhkan.

Output jalur relatif

Tentukan direktori dasar dengan --relative-to

Anda dapat menampilkan jalur sebagai jalur relatif terhadap direktori tertentu. Contoh berikut mengasumsikan direktori /srv/www/assets/css dan direktori dasar /srv/www sudah tersedia; file akhirnya boleh belum ada sesuai default GNU.

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

Outputnya adalah sebagai berikut.

assets/css/site.css

Relatifkan hanya subpath dengan --relative-base

Ini dapat mengeluarkan sebagai jalur relatif hanya ketika target berada di bawah direktori dasar, dan tetap sebagai jalur absolut jika berada di luar.

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

Jika direktori induknya tersedia dan tidak ada tautan yang mengubah lokasi, hasilnya adalah index.html lalu /var/log/syslog. --relative-to dan --relative-base juga mengikuti syarat keberadaan yang dipilih dengan -e atau -m.

Perbedaan antara readlink -f dan realpath

Item perbandingan realpath readlink -f
Tujuan utama Normalisasi nama jalur dan konversi ke jalur relatif Dengan -f, menghasilkan jalur kanonik dengan menyelesaikan tautan; tanpa opsi kanonisasi, readlink membaca target yang tersimpan dalam tautan.
Output relatif Dukungan --relative-to dan --relative-base Umumnya menghasilkan path kanonik absolut
Penggunaan yang direkomendasikan Untuk kanonisasi jalur, dokumentasi GNU merekomendasikan realpath. readlink -f tersedia pada GNU untuk kanonisasi, tetapi opsi dan perilakunya perlu diperiksa pada implementasi lain.
Portabilitas Anda perlu memeriksa perbedaan antara opsi dan kondisi keberadaan default -f tidak dapat diasumsikan sama di semua implementasi Unix

Menggunakan realpath dalam skrip shell

Mencatat jalur aktual dari sebuah file konfigurasi

Simpan sebagai resolve-config.sh dan jalankan sh resolve-config.sh './config.yml' untuk file konfigurasi yang sudah ada. Skrip memakai shell POSIX dan GNU realpath. Argumen yang salah menghasilkan status 2, kegagalan resolusi status 1, dan hasil yang berhasil status 0.

#!/bin/sh
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Penggunaan: sh resolve-config.sh PATH' >&2
  exit 2
fi
config=$(realpath -e -- "$1") || {
  printf '%s\n' 'Jalur konfigurasi tidak dapat diselesaikan.' >&2
  exit 1
}

printf 'Jalur konfigurasi: %s\n' "$config"

Kutip argumen agar jalur dengan spasi tetap utuh, dan gunakan -- untuk nama yang diawali tanda hubung. -e memeriksa keberadaan saat resolusi, tetapi tidak memastikan objek berupa file biasa, dapat dibaca, atau tetap sama sampai dipakai. Substitusi perintah juga membuang baris baru di akhir keluaran; contoh ini tidak mempertahankan nama yang berakhir dengan baris baru secara utuh.

Memisahkan beberapa nama file dengan aman

-z atau --zero menghasilkan karakter NUL di akhir setiap hasil, bukan newline.

realpath -z -- file1 "file with space"

Pada default GNU, contoh ini dapat memproses dua nama akhir yang belum dibuat jika direktori kerjanya ada. Setiap jalur absolut hasil resolusi diakhiri byte NUL. Program penerima harus memahami pemisah itu; jangan menampung aliran NUL dalam variabel shell biasa.

Hal-hal yang perlu diperhatikan saat melakukan verifikasi jalur

Normalisasi dan izin akses berbeda

Jalur yang tampak berada dalam suatu direktori tidak otomatis memberikan izin baca atau tulis. Kepemilikan, izin, daftar kontrol akses (ACL), dan kebijakan keamanan tetap menentukan operasi yang diizinkan.

Target dapat berubah antara saat memeriksa dan menggunakannya

Jika sebuah tautan simbolik atau direktori berubah antara pemeriksaan dengan realpath dan membuka file, target yang berbeda mungkin digunakan. Pada batasan keamanan, jangan hanya mengandalkan perbandingan string sederhana, dan gunakan metode pembukaan file yang aman serta pemisahan izin yang disediakan oleh sistem operasi.

Hati-hati dengan perbandingan string awalan

/srv/www-safe juga dimulai dengan /srv/www dalam string. Saat memeriksa pencakupan jalur dasar, pertimbangkan batasan direktori, karena normalisasi jalur saja tidak menciptakan area sandbox yang aman.

Ringkasan opsi utama

Opsi Deskripsi
-E, --canonicalize Normalisasi jalur bahkan jika komponen terakhir hilang.
-e, --canonicalize-existing Semua komponen harus benar-benar ada untuk berhasil.
-m, --canonicalize-missing Perlakukan komponen yang tidak ada sebagai direktori.
-L, --logical Interpretasikan tautan simbolik setelah memproses .. secara logis.
-P, --physical Ini adalah mode fisik yang menyelesaikan tautan simbolik terlebih dahulu dan merupakan default untuk GNU.
-s, --no-symlinks Membersihkan string jalur tanpa menyelesaikan tautan simbolik.
--relative-to=directory Mencetak jalur relatif berdasarkan direktori yang ditentukan.
--relative-base=directory Hanya mencetak jalur di bawah basis sebagai jalur relatif.
-q, --quiet Menekan pesan diagnostik tentang jalur yang ditentukan.
-z, --zero Memisahkan hasil dengan karakter NUL.

FAQ

Bisakah realpath digunakan pada berkas yang tidak ada?

Dalam perilaku default GNU atau dengan -E, ini dapat menangani kasus di mana komponen terakhir tidak ada. Jika komponen menengah mungkin tidak ada, gunakan -m; untuk mengharuskan semua komponen ada, gunakan -e.

Apakah realpath selalu menyelesaikan tautan simbolik?

Dalam mode fisik default, ia menyelesaikan tautan simbolik. Untuk menormalkan string jalur tanpa mengikuti tautan, gunakan -s atau --no-symlinks.

Apa perbedaan antara pwd -P dan realpath .?

Keduanya dapat menampilkan jalur absolut fisik dari lokasi saat ini. pwd -P khusus untuk direktori kerja saat ini, sedangkan realpath menyediakan opsi untuk beberapa jalur arbitrer, kondisi keberadaan, dan keluaran jalur relatif.

Apakah hanya memeriksa hasil realpath dapat mencegah serangan traversal jalur?

Tidak. Jalur dapat berubah antara pemeriksaan dan penggunaan file, dan masalah izin adalah hal yang terpisah. Pada batasan kepercayaan, Anda harus menggunakan API pembukaan file yang aman bersama dengan pemisahan izin dan pemeriksaan batas direktori.

Dokumentasi resmi

Untuk pemeriksaan metadata, lihat panduan stat untuk ukuran, izin, dan stempel waktu. Konteks perintah lain tersedia dalam referensi Linux menurut tugas (bahasa Inggris).