GNU/Linux >> Belajar Linux >  >> Linux

Apakah mungkin menggunakan / dalam nama file?

Itu tergantung pada sistem file apa yang Anda gunakan. Dari beberapa yang lebih populer:

  • ext3:Tidak
  • ext4:Tidak
  • jfs:Ya
  • reiserf:Tidak
  • xfs:Tidak

Jawabannya adalah Anda tidak bisa, kecuali sistem file Anda memiliki bug. Inilah alasannya:

Ada panggilan sistem untuk mengganti nama file Anda yang ditentukan dalam fs/namei.c disebut renameat :

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname)

Saat panggilan sistem dipanggil, ia melakukan pencarian jalur (do_path_lookup ) pada namanya. Terus lacak ini, dan kita sampai ke link_path_walk yang memiliki ini:

static int link_path_walk(const char *name, struct nameidata *nd)
{
       struct path next;
       int err;
       unsigned int lookup_flags = nd->flags;

       while (*name=='/')
              name++;
       if (!*name)
              return 0;
...

Kode ini berlaku untuk sistem file apa pun. Apa artinya ini? Artinya jika Anda mencoba meneruskan parameter dengan '/' yang sebenarnya karakter sebagai nama file menggunakan cara tradisional, itu tidak akan melakukan apa yang Anda inginkan. Tidak ada cara untuk melarikan diri dari karakter. Jika sistem file "mendukung" ini, itu karena keduanya:

  • Gunakan karakter unicode atau sesuatu yang terlihat seperti garis miring tetapi tidak.
  • Mereka memiliki bug.

Selanjutnya, jika Anda melakukannya masuk dan edit byte untuk menambahkan karakter garis miring ke dalam nama file, hal buruk akan terjadi. Itu karena Anda tidak pernah bisa merujuk ke file ini dengan nama :( karena setiap kali Anda melakukannya, Linux akan menganggap Anda merujuk ke direktori yang tidak ada. Menggunakan teknik 'rm *' juga tidak akan berhasil, karena bash hanya memperluasnya ke nama file. Bahkan rm -rf tidak akan berfungsi, karena strace sederhana mengungkapkan bagaimana hal-hal terjadi di bawah tenda (disingkat):

$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0)               = 0
unlinkat(3, "out", 0)                   = 0
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
close(3)                                = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...

Perhatikan bahwa panggilan ini ke unlinkat akan gagal karena mereka perlu merujuk ke file dengan nama.


Hanya dengan penyandian yang disepakati. Misalnya, Anda dapat menyetujui bahwa % akan dikodekan sebagai %% dan %2F itu berarti / . Semua perangkat lunak yang mengakses file ini harus memahami penyandian.


Anda dapat menggunakan karakter Unicode yang ditampilkan sebagai / (misalnya garis miring fraksi), dengan asumsi sistem file Anda mendukungnya.


Linux
  1. Apakah Mungkin Menggunakan `find -exec Sh -c` Dengan Aman?

  2. Bagaimana Cara Menggunakan Jenis File Di Vim?

  3. Gunakan File PHP.ini Kustom

  1. Bagaimana cara menggunakan chmod untuk mengubah izin file?

  2. Kemungkinan untuk menggunakan .dll di Linux

  3. Mengapa menggunakan shm_open?

  1. Ambil nama file dari deskriptor file di C

  2. Menambahkan stempel waktu ke nama file dengan mv di BASH

  3. Cara mengekstrak file nama file.tar.gz