您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

可以在文件名中使用“ /”吗?

可以在文件名中使用“ /”吗?

答案是,除非文件系统有错误,否则您将无法这样做。原因如下:

一个系统调用,用于重命名fs/namei.c名为的文件renameat

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

当系统调用调用时,它将do_path_lookup名称进行路径查找()。继续跟踪,我们可以看到link_path_walk

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

代码适用于任何文件系统。什么意思 这意味着,如果您尝试'/'使用传统方式将带有实际字符的参数作为文件名传递,它将无法执行您想要的操作。无法逃脱角色。如果文件系统“支持”此文件,则是因为它们要么:

此外,如果 确实 要编辑字节以在文件名中添加斜杠字符,则可能会发生不良情况。那是因为您永远无法使用名称:(来引用该文件,因为无论何时,Linux都会假定您所引用的目录不存在。使用’rm *’技术也不起作用,因为bash只是将其扩展为文件名。甚至rm -rf都行不通,因为一个简单的strace揭示了事情在幕后进行的过程(简称):

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

请注意,对这些的调用unlinkat将失败,因为它们需要按名称引用文件

其他 2022/1/1 18:15:37 有951人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶