1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
|
Волшебная строчка, которую нужно добавить после `#!/bin/bash`, чтоб скрипт можно было отлаживать по шагам
```bash
#!/bin/bash
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
echo line3
```
**Процесс отладки**
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши `<ENTER>`.
Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
**Ингредиенты**
команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо Ctrl+C
переменная окружения ==`$BASH_COMMAND`==, валидная внутри обработчика команды trap.
===============================================
**Автоматическое выключение компьютера при низком заряде батареи**
```bash
#!/bin/bash
# Порог заряда батареи в процентах
THRESHOLD=15
# Получение текущего заряда батареи
BATTERY_LEVEL=$(acpi -b | grep -P -o '[0-9]+(?=%)')
# Проверка уровня заряда и выключение, если ниже порога
if [ "$BATTERY_LEVEL" -lt "$THRESHOLD" ]; then
echo "Низкий уровень заряда батареи: $BATTERY_LEVEL%. Выключение..."
shutdown -h now
fi
```
**Скрипт проверяет уровень заряда батареи и автоматически выключает компьютер, если заряд ниже указанного порога.**
Особого внимания заслуживает использование команды acpi для получения уровня заряда батареи. Скрипт полезен для защиты ноутбуков от аварийного выключения при низком заряде.
===============================================
### Автоматическое обновление IP-адреса в DNS-записи ###
```bash
#!/bin/bash
# Получение текущего внешнего IP-адреса
CURRENT_IP=$(curl -s http://ifconfig.me)
# Путь к файлу с последним IP-адресом
IP_FILE="$HOME/current_ip.txt"
# Чтение последнего сохраненного IP-адреса
if [ -f "$IP_FILE" ]; then
LAST_IP=$(cat "$IP_FILE")
else
LAST_IP=""
fi
# Если IP-адрес изменился, обновить DNS-запись
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
echo "IP изменился на $CURRENT_IP, обновление DNS..."
# Обновление DNS-записи (пример с использованием Cloudflare API)
curl -X PUT "https://api.cloudflare.com/client/v4/zones/your_zone_id/dns_records/your_record_id" \
-H "Authorization: Bearer your_api_token" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"yourdomain.com\",\"content\":\"$CURRENT_IP\",\"ttl\":120,\"proxied\":false}"
# Сохранение нового IP-адреса
echo "$CURRENT_IP" > "$IP_FILE"
else
echo "IP не изменился, обновление не требуется."
fi
```
**Скрипт автоматически проверяет, изменился ли внешний IP-адрес, и при изменении обновляет DNS-запись с использованием Cloudflare API.**
Особого внимания заслуживает логика проверки текущего и предыдущего IP-адреса, что позволяет избежать ненужных запросов к DNS-серверу. В случае изменения IP-адреса, скрипт использует API Cloudflare для обновления DNS-записи. Такой скрипт полезен для пользователей с динамическим IP-адресом, которые хотят поддерживать актуальную DNS-запись для своего домена.
===============================================
### Автоматическое резервное копирование файлов с указанием даты ###
```bash
#!/bin/sh
cp -r /path/to/source /path/to/backup/backup_$(date +%Y%m%d)
```
Скрипт создает резервную копию указанной директории, добавляя текущую дату в имя папки для каждой копии.
===============================================
### Работа с логами в Linux с помощью journalctl ###
```bash
# Вывод всех системных логов
journalctl
```
выводит полный журнал событий системы. Вывод может содержать сообщения ядра, системные службы и другие системные события.
```bash
# Фильтрация логов по дате:
# Чтобы отфильтровать логи по дате и времени, можно использовать параметры
journalctl --since
journalctl --until
# Логи за определённый промежуток времени
journalctl --since "2023-08-01 10:00:00" --until "2023-08-01 12:00:00"
```
С помощью этих параметров можно просматривать логи за конкретный период, что упрощает поиск информации о системных событиях, произошедших в определённое время.
```bash
# Логи службы nginx
journalctl -u nginx
```
С помощью флага -u можно выводить логи, связанные с конкретной системой или службой, например, nginx. Это полезно для диагностики и устранения проблем, связанных с отдельными компонентами системы.
```bash
# Отслеживание логов в реальном времени:
# Функция реального времени позволяет наблюдать за логами по мере их поступления в систему.
journalctl -f
```
Команда ==`journalctl -f`== выводит логи в реальном времени, аналогично команде ==`tail -f`== для текстовых файлов. Это особенно полезно при мониторинге работы системы или приложений в режиме реального времени.
Использование `journalctl` позволяет легко анализировать системные логи, отфильтровывать нужную информацию и отслеживать проблемы в работе системы или сервисов.
================================================
## Отчет о системной информации и отправка его по электронной почте ##
```bash
#!/bin/bash
# Создание файла отчета
report_file="$HOME/system_report.txt"
# Запись заголовка в файл отчета
echo "Отчет о системной информации - $(date)" > "$report_file"
echo "========================================" >> "$report_file"
# Системная информация
echo -e "\nСистемная информация:" >> "$report_file"
uname -a >> "$report_file"
# Информация о загрузке системы
echo -e "\nИнформация о загрузке системы:" >> "$report_file"
uptime >> "$report_file"
# Использование дискового пространства
echo -e "\nИспользование дискового пространства:" >> "$report_file"
df -h >> "$report_file"
# Использование памяти
echo -e "\nИспользование памяти:" >> "$report_file"
free -h >> "$report_file"
# Список работающих процессов
echo -e "\nСписок работающих процессов:" >> "$report_file"
ps aux --sort=-%mem | head -n 10 >> "$report_file"
# Сетевые подключения
echo -e "\nСетевые подключения:" >> "$report_file"
ss -tuln >> "$report_file"
# Отправка отчета по электронной почте
recipient="user@example.com"
mail -s "Отчет о системной информации" "$recipient" < "$report_file"
echo "Отчет о системной информации создан и отправлен на $recipient"
```
Этот скрипт полезен для системных администраторов и может быть настроен для автоматического выполнения с помощью cron, чтобы регулярно получать отчеты о состоянии системы.
=================================
### Найдите все неработающие симлинки (символьные ссылки) в вашей системе с помощью команды: ###
```bash
find . -xtype l
```
=================================
### Обновление и очистка системы ###
```bash
#!/bin/bash
# Обновление списка пакетов и установка обновлений
sudo apt-get update
sudo apt-get upgrade -y
# Автоматическое удаление ненужных пакетов и очистка кэша
sudo apt-get autoremove -y
sudo apt-get autoclean -y
sudo apt-get clean
# Вывод сообщения о завершении
echo "Система обновлена и очищена."
```
=================================
### Синхронизация директорий с помощью rsync ###
```bash
#!/bin/bash
# Исходная и целевая директории
source_directory="$HOME/source_directory"
target_directory="$HOME/target_directory"
# Лог-файл
log_file="$HOME/rsync_log.txt"
# Запуск синхронизации
rsync -av --delete "$source_directory/" "$target_directory/" >> "$log_file" 2>&1
# Проверка результата синхронизации
if [ $? -eq 0 ]; then
echo "Синхронизация завершена успешно: $(date)" >> "$log_file"
else
echo "Ошибка синхронизации: $(date)" >> "$log_file"
fi
echo "Синхронизация завершена. Подробности в лог-файле $log_file"
```
Скрипт синхронизирует содержимое исходной директории с целевой директорией, создавая резервную копию и записывая результаты в лог-файл.
=================================
### Функция для создания резервной копии ###
```bash
#!/bin/bash
# Путь к отслеживаемому каталогу
WATCHED_DIR="/path/to/watched/directory"
# Путь для сохранения резервных копий
BACKUP_DIR="/path/to/backup/directory"
# Функция для создания резервной копии
backup() {
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
tar -czf "$BACKUP_DIR/backup_$TIMESTAMP.tar.gz" -C "$WATCHED_DIR" .
echo "Backup created at $BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
}
# Использование inotifywait для мониторинга изменений в каталоге
inotifywait -m -r -e modify -e move -e create -e delete "$WATCHED_DIR" --format '%T %w %f %e' --timefmt '%Y-%m-%d %H:%M:%S' |
while read date time dir file event
do
echo "Detected $event on $file at $date $time"
backup
done
```
=================================
### Создание резервной копии базы данных ###
```bash
#!/bin/bash
# Параметры базы данных
db_name="mydatabase"
db_user="myuser"
db_password="mypassword"
backup_dir="$HOME/db_backups"
backup_file="$backup_dir/${db_name}_$(date +%Y%m%d%H%M%S).sql"
# Создание каталога для резервных копий, если он не существует
mkdir -p "$backup_dir"
# Создание резервной копии базы данных
mysqldump -u "$db_user" -p"$db_password" "$db_name" > "$backup_file"
# Проверка результата резервного копирования
if [ $? -eq 0 ]; then
echo "Резервное копирование базы данных завершено успешно: $(date)" >> "$backup_dir/backup_log.txt"
else
echo "Ошибка резервного копирования базы данных: $(date)" >> "$backup_dir/backup_log.txt"
fi
echo "Резервная копия базы данных создана: $backup_file"
```
=================================
### Создание резервной копии базы данных 2 ###
```bash
#!/bin/bash
# Установите желаемую длину пароля
password_length=12
# Генерация пароля
password=$(tr -dc 'A-Za-z0-9_!@#$%^&*' < /dev/urandom | head -c $password_length)
------
echo "Сгенерированный пароль: $password
------
#!/bin/bash
# Настройки для подключения к базе данных
DB_USER="yourusername"
DB_PASSWORD="yourpassword"
DB_NAME="yourdbname"
BACKUP_PATH="/path/to/your/backup/directory"
DATE=$(date +%Y%m%d%H%M)
# Создание дампа базы данных
mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_PATH/${DB_NAME}_$DATE.sql
# Опционально: удаление старых резервных копий старше 30 дней
find $BACKUP_PATH -name "*.sql" -type f -mtime +30 -exec rm {} \;
echo "✔️ Резервная копия базы данных $DB_NAME создана успешно."
```
Скрипт создает резервную копию указанной MySQL базы данных и сохраняет её в заданный каталог с меткой текущей даты и времени в имени файла.
=================================
### Архив tar.gz текущего каталога ###
```bash
#!/bin/sh
tar -czf "../${PWD##*/}.tar.gz" .
```
Скрипт создает архив tar.gz текущего каталога.
Особого внимания здесь заслуживает конструкция ==`${PWD##*/}`==, которая берет полный путь до текущего каталога (переменная $PWD) и удаляет из него первую часть вплоть до последнего слеша, оставляя, таким образом, только имя самого каталога. Далее к нему добавляется расширение tar.gz.
=================================
|