/var/log/dmesg
我有一项作业,要求我将/var/log/syslog
和备份/var/log/message
到不同文件夹(例如桌面)中的文本文件中。它还将创建一个名为 Execution.txt 的文件来记录每次运行 bash 脚本时的日期和时间。我确实有这段我编写的代码,但每次运行它时,它都会给我:
./bash.sh: line 7: /var/log/dmesg: Permission denied
./bash.sh: line 8: /var/log/syslog: Permission denied
./bash.sh: line 9: /var/log/message: Permission denied
但是,它确实在桌面上创建了这些文件,但消息和 dmesg 文件是空的。我想知道这是正常的还是我做错了什么?以下是我到目前为止编写的代码。任何帮助都将不胜感激。谢谢!
#!/bin/bash
cat /var/log/dmesg l nl >> /home/administrator/Desktop/dmesg
cat /var/log/syslog l nl >> /home/administrator/Desktop/syslog
cat /var/log/message l nl >> /home/administrator/Desktop/message
echo ' ' > /var/log/dmesg
echo ' ' > /var/log/syslog
echo ' ' > /var/log/message
date >> /home/administrator/Desktop/execution.txt
答案1
我怀疑您只是无法以运行此脚本的用户身份访问它们。查看文件所有权:
$ ls -l /var/log/{dmesg,syslog,message}
ls: cannot access /var/log/message: No such file or directory
-rw-r----- 1 root adm 86384 Mar 9 11:12 /var/log/dmesg
-rw-r----- 1 syslog adm 18553 Mar 25 13:25 /var/log/syslog
如果您的组中有用户,则可以读取这些文件adm
,但您无法写入。系统上的第一个用户通常是该adm
组的成员,但如果您的~/Desktop
副本为空,我建议您的用户不是(使用命令检查groups
)。您确实有几个选择。
你可以看看添加 ACL 权限为您的用户。这些权限与标准权限是分开的,并且向您的用户添加显式读/写访问权限实际上不会影响其他任何内容。这很好。
sudo apt-get install acl sudo setfacl -m u:$USER:rw /var/log/{dmesg,syslog,message}
这可能需要重新启动才能完成。你甚至可能需要更改你的 fstab。我还没有,但是 ACL 似乎在这里工作正常,所以我认为不再需要它了。
您可以更改文件的 unix 权限。最安全的方法是将您的用户添加到组
adm
,然后启用这些文件的组写入权限:sudo usermod -a -G adm $USER sudo chmod g+w /var/log/{dmesg,syslog,message}
您需要注销并重新登录才能看到效果。
或者你可以让任何人读写这些文件。这可能存在安全风险,所以我不会给你代码……但说实话,虽然可能,但你可能不想要这样。
另一个选项是使用 以 root 身份运行脚本
sudo ./scriptname
。缺点是此脚本执行的任何操作都将以 root 身份执行。这包括创建新文件(>>
如果文件尚不存在,则可以创建新文件),这对用户来说可能很麻烦。
如果这不是学术上的好奇心,而你实际上想以最好的方式完成一些工作,那么有一些工具可以为你做这些事情,而且效果更好。你真的想看看logrotate
。这个Digital Ocean 教程是我能快速找到的最干净的一个。
答案2
您很可能没有 的读取权限/var/log/{dmesg,syslog,message}
。因此,即使您在桌面上创建了文件,它们也是空的,因为没有读取任何内容,但尝试写入文件(在您的桌面上创建的文件)。
因此你有两个选择:
获取读取权限如下
/var/log/{dmesg,syslog,message}
:sudo usermod -a -G adm $USER #adm is the group name which owns /var/log/syslog
使用 sudo 进行读取(一次性读取更容易):
sudo cat /var/log/dmesg >> /home/administrator/Desktop/dmesg
答案3
您的问题是脚本的以下几行:
echo ' ' > /var/log/dmesg
echo ' ' > /var/log/syslog
echo ' ' > /var/log/message
这并不奇怪,因为 bash 所抱怨的正是第 7、8 和 9 行。
这些命令试图删除这 3 个日志文件的内容,/var/log
但由于它们归 root 所有,并且您没有写权限,因此您会收到错误。好的!我假设您不想这样清除系统日志。
请记住,要>
覆盖文件的内容,您>>
需要附加对此进行修改。无论如何,您都不应该修改这些文件,它们由系统使用,您绝对没有理由要覆盖它们。即使您要这样做,也有更简单的方法可以做到这一点,例如,rm file
甚至只是> file
。
一个更简洁的方法是使用logrotate
反而。