我在两台 Fedora 21 机器上重现了这个问题。
我希望它sqlite3
不写入~/.sqlite_history
文件。我找不到选项,但说,没关系,我会让它不能写入。
然而它仍然可以写入而我却不明白。
~$ which sqlite3
/usr/bin/sqlite3
~$ ls -l /usr/bin/sqlite3
-rwxr-xr-x. 1 root root 69456 Nov 25 12:00 /usr/bin/sqlite3
~$ ls -l .sqlite_history
ls: cannot access .sqlite_history: No such file or directory
~$ touch .sqlite_history
~$ sudo chown root .sqlite_history
[sudo] password for emmanuel:
~$ sudo chmod 600 .sqlite_history
~$ sudo chgrp root .sqlite_history
~$ ls -l .sqlite_history
-rw------- 1 root root 0 Jan 7 08:45 .sqlite_history
~$ whoami
emmanuel
~$ groups
emmanuel wheel
~$ echo test > .sqlite_history
bash: .sqlite_history: Permission denied
~$ sqlite3 test.db
SQLite version 3.8.7.2 2014-11-18 20:57:56
Enter ".help" for usage hints.
sqlite> select * from server;
Error: no such table: server
sqlite>
~$ cat .sqlite_history
select * from server;
~$ ls -l .sqlite_history
-rw------- 1 emmanuel emmanuel 22 Jan 7 08:45 .sqlite_history
$ mount | grep home
/dev/sda7 on /home type ext4 (rw,relatime,data=ordered)
我也尝试了符号链接/dev/null
,但在这种情况下,sqlite3 只是覆盖了文件?发生了什么?sqlite 怎么会覆盖该文件?
我检查了ls
二进制文件sqlite3
,发现它确实不是 suid root,但事实并非如此。我不明白。
答案1
它无法写入该文件,但假设它可以写入该目录,它就可以删除该文件并创建一个新文件。
在 Linux 权限模型下,您无需能够写入文件即可将其删除,因为删除文件不会以任何方式更改它 - 它会更改包含该文件的目录。因此,您需要能够写入目录才能删除文件。
答案2
尝试使用“sudo chattr +i /.sqlite_history”,这将阻止任何人(甚至是 root)修改目标文件。i 代表“不可变”,通常用于防止 DHCP 覆盖 /etc/resolv.conf
这应该能帮你解决问题。更多信息:“man chattr”。这是一个可以让你设置各种奇妙的文件属性的工具!
祝你好运