我在 CentOS 6.10 64 位上收到权限被拒绝错误
请注意,“#”表示根级别用户提示。
# cd /tmp
# chmod 777 file*
# /bin/ls -l file*
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_00.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_01.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_02.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_03.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_04.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_05.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_06.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_07.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_08.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_09.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_10.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_11.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_12.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_13.dat
-rwxrwxrwx 1 apache apache 824 Sep 17 17:15 file_14.dat
-rwxrwxrwx 1 apache apache 1 Sep 17 17:15 file_15.dat
# cat file* > file.dat
cat: file_00.dat: Permission denied
cat: file_02.dat: Permission denied
# /bin/ls -l file.dat
-rw-rw-r-- 1 root root 10713 Sep 17 17:32 file.dat
完整文件的大小为10713,即824*13+1,这意味着它已成功复制除文件“00”和“02”之外的所有文件。成功的复制应该是12361字节,824*15+1。然而,这两个文件没有什么不同,只是机器拒绝让我读取它们。
命令“chmod 777”是多余的,只是为了强调这种情况。在运行该命令之前,权限均采用“-rw-r--r--”形式,这仍然意味着我不应该收到权限被拒绝的错误。
没有“。”。权限上的问题,所以理论上Selinux不应该参与其中,但即使参与了,为什么只选择两个文件呢?
我可以重复创建这些文件的过程,它会选择一组不同的文件不可读。有人对此有解释和解决吗?
更新:
我修改了创建文件的过程。此前,它从 JavaScript 客户端接收数据,该客户端将 XLSX 文件分成多个块,以允许上传大尺寸的电子表格。服务器将以 Base64 形式接收块,将每个块解码为二进制,然后将其保存在临时文件中,以便连接到最终的 XLSX 文件中。
它现在所做的是将每个临时块保存为 base64 (100% ASCII)。上传所有块后,它会读取每个文件,然后将其解码为二进制,并将其附加到最终的 XLSX 文件。
工作正常。我想我们就这样吧。
作为测试,我编写了一个快速的 3 行程序来读取一个 Base64 块,将其解码为二进制,然后保存它。然后我尝试读取结果。你猜怎么了?二进制文件的权限被拒绝。
显然,导致文件不可读的是某种数据模式里面文件。
使用这种方法解决了问题,但我仍然想知道二进制数据的模式如何里面文件创建“权限被拒绝”错误外部。
答案1
最终更新
结果我们的服务提供商运行了 Red-Hat Linux 防病毒程序。显然,我没有意识到这一点。
关闭防病毒软件,所有文件就会神奇地变得可读。重新打开它,某些选定的文件恰好与某些病毒签名匹配。
抗病毒应该留意可执行文件。 (问题出现时文件最初是模式644)
那里应该是不同的错误消息。
那好吧。今后我们将用 Base64 对文件进行编码,问题就解决了。
再次感谢所有提供帮助的人。
答案2
可能是文件属性已设置。尝试用lsattr
命令列出。然后您可以使用 activr 属性取消设置chattr -[acdeijstuADST] filename
。
您可以在以下位置找到更多信息:曼查特尔。