GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile utilizzare / in un nome file?

Dipende dal filesystem che stai usando. Di alcuni dei più popolari:

  • ext3:No
  • ext4:No
  • jfs:Sì
  • reiserfs:No
  • xfs:No

La risposta è che non puoi, a meno che il tuo filesystem non abbia un bug. Ecco perché:

C'è una chiamata di sistema per rinominare il file definito in fs/namei.c chiamato renameat :

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

Quando la chiamata di sistema viene invocata, esegue una ricerca del percorso (do_path_lookup ) sul nome. Continua a tracciarlo e arriviamo a link_path_walk che ha questo:

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

Questo codice si applica a qualsiasi file system. Cosa significa? Significa che se provi a passare un parametro con un vero '/' carattere come il nome del file usando mezzi tradizionali, non farà quello che vuoi. Non c'è modo di sfuggire al personaggio. Se un filesystem "supporta" questo, è perché:

  • Usa un carattere unicode o qualcosa che sembra come una barra ma non lo è.
  • Hanno un bug.

Inoltre, se l'hai fatto entra e modifica i byte per aggiungere un carattere barra nel nome di un file, accadrebbero cose brutte. Questo perché non potresti mai fare riferimento a questo file per nome :( poiché ogni volta che lo fai, Linux presumerebbe che ti riferissi a una directory inesistente. Anche l'uso della tecnica 'rm *' non funzionerebbe, poiché bash lo espande semplicemente al nome del file. Anche rm -rf non funzionerebbe, dal momento che una semplice traccia rivela come vanno le cose sotto il cofano (abbreviato):

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

Nota che queste chiamate a unlinkat fallirebbe perché devono fare riferimento ai file per nome.


Solo con una codifica concordata. Ad esempio, potresti accettare che % sarà codificato come %% e quel %2F significherà un / . Tutto il software che ha avuto accesso a questo file dovrebbe comprendere la codifica.


Puoi usare un carattere Unicode che viene visualizzato come / (ad esempio la barra di frazione), supponendo che il tuo filesystem lo supporti.


Linux
  1. Usare _roff per sottolineare le parole?

  2. Usa un file PHP.ini personalizzato

  3. Possibile utilizzare un .dll su Linux

  4. Aggiunta di timestamp a un nome file con mv in BASH

  5. Perché usare shm_open?

Come usare File Manager in cPanel

Come usare il comando Tronca in Linux

Come utilizzare un comando file in Linux

Come usare il comando lsof in Linux

Come usare gzip in Linux?

Come utilizzare il comando shred Linux