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).




