Die Antwort ist, dass Sie nicht können, es sei denn, Ihr Dateisystem hat einen Fehler. Hier ist der Grund:
Es gibt einen Systemaufruf zum Umbenennen Ihrer Datei mit dem fs/namei.c
Namen renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Wenn der Systemaufruf aufgerufen wird, führt er eine Pfadsuche ( do_path_lookup
) für den Namen durch. Verfolgen Sie dies weiter, und wir kommen zu link_path_walk
dem , was dies hat:
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;
...
Dieser Code gilt für jedes Dateisystem. Was bedeutet das? Wenn Sie versuchen, einen Parameter mit einem tatsächlichen '/'
Zeichen als Dateinamen mit herkömmlichen Mitteln zu übergeben, wird dies nicht das tun, was Sie wollen. Es gibt keine Möglichkeit, dem Charakter zu entkommen. Wenn ein Dateisystem dies "unterstützt", liegt dies daran, dass entweder:
- Verwenden Sie ein Unicode-Zeichen oder etwas, das wie ein Schrägstrich aussieht, es aber nicht ist.
- Sie haben einen Fehler.
Wenn Sie darüber hinaus haben die Bytes in und bearbeiten gehen , um einen Schrägstrich in einen Dateinamen hinzufügen, würden schlimme Dinge passieren. Das liegt daran, dass Sie diese Datei niemals mit Namen referenzieren könnten :( Da Linux dies immer tat, ging es davon aus, dass Sie auf ein nicht vorhandenes Verzeichnis verweisen. Die Verwendung der 'rm *' - Technik würde auch nicht funktionieren, da bash dies einfach auf den Dateinamen erweitert. Auch rm -rf
würde nicht funktionieren, da eine einfache Klammer zeigt, wie es unter der Haube weitergeht (verkürzt):
$ 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
...
Beachten Sie, dass diese Aufrufe von unlinkat
fehlschlagen würden, da sie nach Namen auf die Dateien verweisen müssen.