GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible usar / en un nombre de archivo?

Depende del sistema de archivos que esté utilizando. De algunos de los más populares:

  • ext3:No
  • ext4:No
  • jfs:Sí
  • reservas:No
  • xfs:No

La respuesta es que no puede, a menos que su sistema de archivos tenga un error. He aquí por qué:

Hay una llamada al sistema para cambiar el nombre de su archivo definido en fs/namei.c llamado renameat :

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

Cuando se invoca la llamada del sistema, realiza una búsqueda de ruta (do_path_lookup ) en el nombre. Sigue rastreando esto y llegaremos a link_path_walk que tiene esto:

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

Este código se aplica a cualquier sistema de archivos. ¿Que significa esto? Significa que si intenta pasar un parámetro con un '/' real carácter como el nombre del archivo usando medios tradicionales, no hará lo que usted quiere. No hay forma de escapar del personaje. Si un sistema de archivos "soporta" esto, es porque ellos:

  • Utilice un carácter Unicode o algo que parece como una barra pero no lo es.
  • Tienen un error.

Además, si hizo ingrese y edite los bytes para agregar un carácter de barra en un nombre de archivo, sucederán cosas malas. Esto se debe a que nunca podría referirse a este archivo por su nombre :( ya que cada vez que lo hiciera, Linux asumiría que se estaba refiriendo a un directorio inexistente. Usar la técnica 'rm *' tampoco funcionaría, ya que bash simplemente lo expande al nombre del archivo. Incluso rm -rf no funcionaría, ya que un simple trazo revela cómo suceden las cosas debajo del capó (abreviado):

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

Tenga en cuenta que estas llamadas a unlinkat fallaría porque necesitan referirse a los archivos por su nombre.


Solo con una codificación acordada. Por ejemplo, podría aceptar que % se codificará como %% y que %2F significará un / . Todo el software que accedió a este archivo tendría que comprender la codificación.


Podría usar un carácter Unicode que se muestre como / (por ejemplo, la barra inclinada de fracción), suponiendo que su sistema de archivos lo admita.


Linux
  1. ¿Es posible usar `find -exec Sh -c` de forma segura?

  2. ¿Cómo usar el tipo de archivo en Vim?

  3. ¿Usar _roff para subrayar palabras?

  4. ¿Cómo usar chmod para cambiar el permiso del archivo?

  5. Recuperar nombre de archivo del descriptor de archivo en C

Cómo usar el Administrador de archivos en cPanel

Cómo usar el comando Truncar en Linux

Cómo usar un comando de archivo en Linux

Cómo usar el comando lsof en Linux

¿Cómo usar gzip en Linux?

Cómo usar el comando shred de Linux