У меня есть задание, в котором я должен создать резервную копию /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
Я подозреваю, что у Вас просто нет доступа к ним от пользователя, который запускает этот скрипт. Посмотрите на принадлежности файла:
$ 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. Я не имею, но ACLs, кажется, работают хорошо здесь, таким образом, я предполагаю, что это больше не требуется.
Вы могли изменить полномочия Unix на файле. Самый безопасный способ сделать это состоял бы в том, чтобы добавить Вашего пользователя к adm
группа и затем включить запись группы на тех файлах:
sudo usermod -a -G adm $USER
sudo chmod g+w /var/log/{dmesg,syslog,message}
Необходимо будет выйти и зайти снова для наблюдения эффекта.
Или Вы могли позволить кому-либо читать и записать эти файлы. Это могло быть угрозой безопасности, таким образом, я не даю Вам код... Но честно, в то время как возможно, Вы, вероятно, не хотите это.
Другая опция просто запускает скрипт как корень с sudo ./scriptname
. Оборотная сторона этого - то, что что-либо, что делает этот сценарий, будет сделано как корень. Это включает создающие новые файлы (который >>
может, если файл уже не существует), и это может быть болью для пользователя.
И если это не академическое любопытство, и Вы на самом деле пытаетесь получить некоторую работу, сделанную самым лучшим способом, существуют инструменты, которые делают эти вещи для Вас, но лучше. Вы действительно хотите посмотреть на logrotate
. Это Цифровое Океанское учебное руководство является самым чистым, которое я могу найти быстро.
У Вас по всей вероятности нет полномочий чтения для /var/log/{dmesg,syslog,message}
. Таким образом даже при том, что Вам создали файлы на Вашем destkop, они будут пусты, так как ничто не было считано, но попытка записать была предпринята в файл (тот, созданный на Вашем рабочем столе).
, Таким образом, у Вас есть две опции:
Получают прочитанные полномочия для /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
Вашей проблемой являются следующие строки Вашего сценария:
echo ' ' > /var/log/dmesg
echo ' ' > /var/log/syslog
echo ' ' > /var/log/message
Неудивительно, так как те - точно строки 7,8 и 9, которые являются теми, что удар жалуется на.
Эти команды пытаются удалить содержание тех 3 файлов журнала в /var/log
, но так как они принадлежат корню, и у Вас нет доступа для записи к ним, Вы получаете ошибку. Хороший ! Я предполагаю, что Вы не хотите убирать свои системные журналы как этот.
Помнят, что >
перезаписи содержание файла, Вам нужно >>
к , добавляют к нему. В любом случае Вы никогда не должны изменять те файлы, они используются системой и нет абсолютно никакой причины, почему Вы хотели бы перезаписать их. Даже если Вы делаете, существуют намного более простые пути, действительно делают так, как rm file
или даже просто > file
.
инструмент для очистки А способ сделать все это должно было бы использовать logrotate
вместо этого.