GNU/Linux >> Znalost Linux >  >> Linux

Je možné použít / v názvu souboru?

Záleží na tom, jaký souborový systém používáte. Některé z nejpopulárnějších:

  • ext3:Ne
  • ext4:Ne
  • jfs:Ano
  • reiserfs:Ne
  • xfs:Ne

Odpověď je, že nemůžete, pokud váš souborový systém nemá chybu. Zde je důvod:

Existuje systémové volání pro přejmenování vašeho souboru definované v fs/namei.c s názvem renameat :

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname)

Když je vyvoláno systémové volání, vyhledá cestu (do_path_lookup ) na jméno. Pokračujte ve sledování a dostaneme se k link_path_walk který má toto:

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;
...

Tento kód platí pro jakýkoli systém souborů. co to znamená? To znamená, že pokud se pokusíte předat parametr se skutečným '/' znak jako název souboru pomocí tradičních prostředků, neudělá to, co chcete. Postavě nelze nijak uniknout. Pokud to souborový systém "podporuje", je to proto, že buď:

  • Použijte znak Unicode nebo něco, co vypadá jako lomítko, ale není.
  • Mají chybu.

Navíc, pokud jste udělali jděte dovnitř a upravte bajty a přidejte do názvu souboru znak lomítka, staly by se špatné věci. Je to proto, že jste nikdy nemohli odkazovat na tento soubor jménem :(, protože kdykoli byste to udělali, Linux by předpokládal, že odkazujete na neexistující adresář. Ani použití techniky 'rm *' by nefungovalo, protože bash to jednoduše rozšiřuje na název souboru. Dokonce rm -rf nefungovalo by to, protože jednoduchý nákres odhalí, jak se to pod kapotou děje (zkráceno):

$ 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
...

Všimněte si, že tato volání unlinkat by selhaly, protože potřebují odkazovat na soubory podle názvu.


Pouze s dohodnutým kódováním. Můžete například souhlasit s tím, že % bude zakódováno jako %% a to %2F bude znamenat / . Veškerý software, který přistupoval k tomuto souboru, by musel rozumět kódování.


Můžete použít znak Unicode, který se zobrazí jako / (například zlomkové lomítko), za předpokladu, že to váš souborový systém podporuje.


Linux
  1. Je možné bezpečně použít `find -exec Sh -c`?

  2. Použít _roff k podtržení slov?

  3. Jak použít chmod ke změně oprávnění k souboru?

  1. V Linuxu je možné použít .dll

  2. Jak extrahovat soubor filename.tar.gz

  3. cp-L vs. cp-H

  1. Jak používat typ souboru ve Vimu?

  2. Použijte vlastní soubor PHP.ini

  3. Načíst název souboru z deskriptoru souboru v C