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.