La réponse est que vous ne pouvez pas, sauf si votre système de fichiers a un bogue. Voici pourquoi:
Il y a un appel système pour renommer votre fichier défini dans fs/namei.c
appelé renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Lorsque l'appel système est appelé, il effectue une recherche de chemin ( do_path_lookup
) sur le nom. Continuez à tracer cela, et nous arrivons à link_path_walk
qui a ceci:
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;
...
Ce code s'applique à n'importe quel système de fichiers. Qu'est-ce que ça veut dire? Cela signifie que si vous essayez de passer un paramètre avec un '/'
caractère réel comme nom du fichier en utilisant des moyens traditionnels, il ne fera pas ce que vous voulez. Il n'y a aucun moyen d'échapper au personnage. Si un système de fichiers «prend en charge» cela, c'est parce qu'ils:
- Utilisez un caractère Unicode ou quelque chose qui ressemble à une barre oblique mais qui ne l'est pas.
- Ils ont un bug.
De plus, si vous avez fait entrer et modifier les octets pour ajouter un caractère slash dans un nom de fichier, les mauvaises choses se produiraient. C'est parce que vous ne pourriez jamais faire référence à ce fichier par son nom: (puisque chaque fois que vous le faites, Linux supposerait que vous faites référence à un répertoire inexistant. Utiliser la technique 'rm *' ne fonctionnerait pas non plus, puisque bash étend simplement cela au nom de fichier. Cela rm -rf
ne fonctionnerait même pas, puisqu'un simple strace révèle comment les choses se passent sous le capot (raccourci):
$ 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
...
Notez que ces appels unlinkat
échouent car ils doivent faire référence aux fichiers par leur nom.