我在 Android 设备上有一个目录,已将其权限设置为 777。但是作为非 root 用户,虽然我可以使用这些权限访问现有文件,但无法创建新文件。
$ ls -la
total 0
drwxrwxrwx 2 root root 60 2022-02-05 11:11 .
drwxrwxrwx 3 root root 60 2022-02-05 10:23 ..
-rw-rw-rw- 1 root root 0 2022-02-05 11:12 a.txt
$ touch a.txt
$ ls -la
total 0
drwxrwxrwx 2 root root 60 2022-02-05 11:11 .
drwxrwxrwx 3 root root 60 2022-02-05 10:23 ..
-rw-rw-rw- 1 root root 0 2022-02-05 11:14 a.txt
时间戳发生变化,表明我能够触摸该文件。 (我也可以 cat >> 该文件,这也有效。)现在我尝试创建一个新文件。
$ touch b.txt
touch: 'b.txt': Permission denied
既然目录权限(777)应该赋予任何人修改目录的能力,为什么我不能创建新文件?我还尝试将目录权限设置为 1777,但这并没有解决问题。如果我尝试 cat >> 该文件,我会得到相同的错误:
/system/bin/sh: can't create b.txt: Permission denied
我尝试从几个不同的位置创建一个文件,包括手机上的应用程序、ssh shell 和 adb shell。
我在其他地方读到可能有扩展属性,但“attr”命令似乎不存在。
# attr
/system/bin/sh: attr: inaccessible or not found
但是,我自己(作为 root)创建并授予了该目录的权限,所以我不希望在那里是任何扩展属性!
更新:
运行strace touch b.txt
会在失败周围产生以下几行:
utimensat(AT_FDCWD, "b.txt", NULL, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "b.txt", O_RDWR|O_CREAT, 0666) = -1 EACCES (Permission denied)
write(2, "touch: b.txt: Permission denied\n", 32touch: b.txt: Permission denied
) = 32
(最后一个显然是打印错误的地方)