Je sais que ce n’est pas quelque chose qui devrait être fait, mais existe-t-il un moyen d’utiliser le caractère barre oblique qui sépare normalement les répertoires d’un nom de fichier sous Linux?
Réponses
Trop de publicités?La réponse est que vous ne pouvez pas, à moins que votre système de fichiers a un bug. Voici pourquoi:
Il y a un système d'appel permettant de renommer votre fichier défini dans fs/namei.c
appelés renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Lors de l'appel système est appelé, il fait un chemin de recherche (do_path_lookup
) sur le nom. Garder le traçage de cela, et nous faisons link_path_walk
cette:
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 à tout système de fichiers. Qu'est-ce que cela signifie? Cela signifie que si vous essayez de passer un paramètre avec un effectif '/'
de caractères que le nom du fichier à l'aide de moyens traditionnels, il ne va pas faire ce que vous voulez. Il n'y a aucun moyen d'échapper le caractère. Si un système de fichiers "prend en charge" cela, c'est parce qu'ils:
- Utiliser un caractère unicode ou quelque chose qui ressemble comme une barre oblique, mais ne l'est pas.
- Ils ont un bug.
En outre, si vous n' y allez, et modifier les octets d'ajouter une barre oblique caractères dans un nom de fichier, de mauvaises choses vont arriver. C'est parce que vous ne pourrait jamais se référer à ce fichier par son nom :( depuis quand vous l'avez fait, Linux supposent que vous faisiez allusion à un répertoire inexistant. À l'aide de la "rm *" technique ne fonctionnerait pas, car bash simplement se développe que pour le nom de fichier. Même rm -rf
ne fonctionnerait pas, depuis un simple strace révèle la façon dont 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 à l' unlinkat
échoue parce qu'ils ont besoin de consulter les fichiers par leur nom.
Vous pouvez utiliser un caractère Unicode qui s'affiche sous la forme "/" (par exemple, ce glyphe apparemment redondant ) en supposant que votre système de fichiers le prenne en charge.