将 syslog/dmesg/message 备份到不同的文件夹

将 syslog/dmesg/message 备份到不同的文件夹

/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}。因此,即使您在桌面上创建了文件,它们也是空的,因为没有读取任何内容,但尝试写入文件(在您的桌面上创建的文件)。

因此你有两个选择:

  1. 获取读取权限如下/var/log/{dmesg,syslog,message}

    sudo usermod -a -G adm $USER #adm is the group name which owns /var/log/syslog
    
  2. 使用 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反而。

相关内容