Rob*_*tin 122
答案是你不能,除非你的文件系统有bug.原因如下:
有一个系统调用在重命名定义文件fs/namei.c名为renameat:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Run Code Online (Sandbox Code Playgroud)
调用系统调用时,它会对名称执行路径查找(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;
...
Run Code Online (Sandbox Code Playgroud)
此代码适用于任何文件系统.这是什么意思?这意味着如果您尝试'/'使用传统方法将带有实际字符的参数作为文件名传递,则它将无法执行您想要的操作.没有办法逃脱角色.如果文件系统"支持"这个,那是因为它们:
此外,如果您确实进入并编辑了字节以将斜杠字符添加到文件名中,则会发生错误.那是因为你永远不能通过名字引用这个文件:(因为你做的任何时候,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
...
Run Code Online (Sandbox Code Playgroud)
请注意,这些调用unlinkat将失败,因为它们需要按名称引用文件.
Bla*_*ori 32
假设您的文件系统支持它,您可以使用显示为"/"的Unicode字符(例如,这个看似冗余的字形).
这取决于您使用的文件系统.一些比较流行的:
仅使用商定的编码。例如,您可以同意%将被编码为%%并且这%2F将意味着/. 所有访问此文件的软件都必须了解编码。