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.