GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es möglich, / in einem Dateinamen zu verwenden?

Es hängt davon ab, welches Dateisystem Sie verwenden. Von einigen der beliebtesten:

  • ext3:Nein
  • ext4:Nein
  • jfs:Ja
  • reiserfs:Nein
  • xfs:Nein

Die Antwort ist, dass Sie es nicht können, es sei denn, Ihr Dateisystem hat einen Fehler. Hier ist der Grund:

Es gibt einen Systemaufruf zum Umbenennen Ihrer in fs/namei.c definierten Datei genannt 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 durch (do_path_lookup ) auf den Namen. Verfolgen Sie dies weiter und wir gelangen zu link_path_walk die hat dies:

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? Das bedeutet, wenn Sie versuchen, einen Parameter mit einem tatsächlichen '/' zu übergeben Zeichen als Name der Datei mit herkömmlichen Mitteln verwenden, wird es nicht das tun, was Sie wollen. Es gibt keine Möglichkeit, der Figur zu entkommen. Wenn ein Dateisystem dies "unterstützt", liegt es daran, dass es entweder:

  • Verwenden Sie ein Unicode-Zeichen oder etwas, das aussieht wie ein Schrägstrich, ist es aber nicht.
  • Sie haben einen Fehler.

Außerdem, wenn Sie es taten gehen Sie hinein und bearbeiten Sie die Bytes, um einen Schrägstrich in einen Dateinamen einzufügen, würden schlimme Dinge passieren. Das liegt daran, dass Sie niemals mit dem Namen auf diese Datei verweisen konnten :( da Linux immer davon ausgehen würde, dass Sie sich auf ein nicht vorhandenes Verzeichnis beziehen. Die Verwendung der 'rm *'-Technik würde auch nicht funktionieren, da Bash diese einfach auf den Dateinamen erweitert. Sogar rm -rf würde nicht funktionieren, da ein einfacher Strich verrät, wie es unter der Haube abläuft (gekü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 unlinkat sind würde fehlschlagen, da sie die Dateien namentlich referenzieren müssen.


Nur mit vereinbarter Kodierung. Zum Beispiel könnten Sie zustimmen, dass % wird als %% kodiert und das %2F bedeutet ein / . Die gesamte Software, die auf diese Datei zugreift, müsste die Codierung verstehen.


Sie könnten ein Unicode-Zeichen verwenden, das als / angezeigt wird (zum Beispiel der Schrägstrich), vorausgesetzt, Ihr Dateisystem unterstützt dies.


Linux
  1. Ist es möglich, `find -exec Sh -c` sicher zu verwenden?

  2. Wie verwende ich den Dateityp in Vim?

  3. Verwenden Sie eine benutzerdefinierte PHP.ini-Datei

  4. Hinzufügen eines Zeitstempels zu einem Dateinamen mit mv in BASH

  5. So extrahieren Sie die Datei filename.tar.gz

So verwenden Sie den Dateimanager in cPanel

So verwenden Sie den Truncate-Befehl unter Linux

So verwenden Sie einen Dateibefehl unter Linux

So verwenden Sie den Befehl lsof unter Linux

Wie verwende ich gzip unter Linux?

So verwenden Sie den Linux-Befehl shred