From e5abc1fe99340b979b18864d978179f71fe8f5c5 Mon Sep 17 00:00:00 2001 From: vlapa Date: Sat, 13 Jun 2026 20:33:26 +0300 Subject: First --- LINUX/AmneziaWG.md | 67 + "LINUX/BASH -\320\272\321\203\321\200\321\201.md" | 121 ++ LINUX/BASH.md | 109 ++ LINUX/BASH_github/bash-guide-1.md | 218 +++ LINUX/BASH_github/bash-guide-2.md | 225 +++ ...21\201\320\275\320\276\320\262\321\213 Bash.md" | 222 +++ ...200\320\270\320\277\321\202\320\276\320\262.md" | 211 +++ ...240\320\260\320\267\320\275\320\276\320\265.md" | 40 + ... \320\247\320\260\321\201\321\202\321\214 1.md" | 221 +++ ... \320\247\320\260\321\201\321\202\321\214 2.md" | 223 +++ ...262\320\273\320\265\320\275\320\270\320\271.md" | 24 + ...264\320\274\320\270\320\275\320\276\320\262.md" | 1 + LINUX/BAT.md | 21 + LINUX/BEGIN.md | 218 +++ LINUX/BorgBackup.md | 32 + LINUX/CAL.md | 9 + LINUX/CERTBOT.md | 123 ++ LINUX/CHMOD, CHOWN.md | 79 + LINUX/CIFS.md | 189 +++ LINUX/CRON.md | 93 ++ LINUX/DIFFERENT.md | 51 + LINUX/DISK/DF, DU.md | 101 ++ LINUX/DISK/FDISK.md | 217 +++ LINUX/DISK/FSTAB.md | 100 ++ ...\264\320\270\321\201\320\272 \320\262 Linux.md" | 68 + ...ex Cloud \320\264\320\270\321\201\320\272 ).md" | 73 + ...14 \320\264\320\270\321\201\320\272\320\260.md" | 133 ++ ...20\267\320\260\321\206\320\270\321\217 RAID.md" | 535 +++++++ LINUX/DISK/NTFS.md | 57 + LINUX/DISK/SMARTMONTOOLS.md | 85 ++ ...60 \320\264\320\270\321\201\320\272\320\260.md" | 26 + ...200\320\272\320\276\320\262\320\272\320\260.md" | 51 + ...16 \320\277\320\260\320\277\320\272\321\203.md" | 34 + ...320\275\321\213\320\271 raid \320\262 Linux.md" | 169 +++ LINUX/DOCKER.md | 87 ++ LINUX/ENVIRONMENT.md | 30 + LINUX/EXIFTOOL.md | 41 + LINUX/FIND.md | 156 ++ ...200\320\262\320\265\321\200\320\276\320\262.md" | 42 + LINUX/GPG, PASS.md | 276 ++++ LINUX/GREP.md | 392 +++++ ...\217\320\264\321\200\320\260 \320\262 Linux.md" | 147 ++ ...\275\320\264 \320\264\320\273\321\217 Linux.md" | 48 + ...0\260\320\274\320\265\320\275\320\260 Nginx.md" | 54 + LINUX/HOME_SERVER/watch.md | 48 + ...270\321\201\321\202\320\265\320\274\321\213.md" | 36 + ...65\320\275\320\270\320\265 \320\262 SYSTEMD.md" | 141 ++ ...0\275\320\276\321\201\321\202\320\270 Linux.md" | 178 +++ LINUX/HTOP.md | 13 + LINUX/IPTABLES, NFTABLES.md | 101 ++ LINUX/JOURNALCTL.md | 160 ++ LINUX/KILL, PKILL.md | 16 + LINUX/LEMP.md | 119 ++ "LINUX/LESS \320\270 SPLIT.md" | 39 + LINUX/LN.md | 15 + LINUX/LSOF.md | 87 ++ LINUX/Let's Encrypt.md | 33 + LINUX/MAILutils.md | 104 ++ LINUX/MC.md | 124 ++ LINUX/MOSQUITTO.md | 121 ++ LINUX/NC.md | 33 + LINUX/NCDU, BAT, FD, EXA, HTTPIE.md | 6 + LINUX/NCDU.md | 20 + LINUX/NETWORK/DNS.md | 36 + LINUX/NETWORK/IPERF3.md | 33 + LINUX/NETWORK/NETPLAN.md | 230 +++ LINUX/NETWORK/NETWORK.md | 162 ++ ...5 \320\262 \321\201\320\265\321\202\320\270.md" | 49 + ...276\320\275\321\201\320\276\320\273\320\270.md" | 17 + ...31 \320\232\320\220\320\240\320\242\320\253.md" | 10 + LINUX/NGINX.md | 538 +++++++ LINUX/PLEX.md | 33 + LINUX/PROGRAMS_bash.md | 311 ++++ LINUX/PS.md | 34 + LINUX/PostgreSQL.md | 165 ++ LINUX/RANGER.md | 91 ++ ...272\320\265\321\202\320\260\320\274\320\270.md" | 33 + LINUX/RM.md | 10 + LINUX/ROOT.md | 1 + LINUX/RSYNC.md | 373 +++++ LINUX/SAMBA.md | 262 ++++ LINUX/SCP, SFTP.md | 70 + ...202\320\276\321\200\320\270\320\275\320\263.md" | 280 ++++ ...276\320\274\320\260\320\275\320\264\321\213.md" | 63 + LINUX/SHUTDOWN, HALT, POWEROFF, REBOOT.md | 56 + LINUX/SSH.md | 302 ++++ LINUX/SYSTEMCTL.md | 405 +++++ LINUX/TAR.md | 314 ++++ LINUX/TERMINAL.md | 207 +++ LINUX/TIMEDATE, CHRONY, NTP.md | 48 + LINUX/TLDR.md | 12 + LINUX/TMUX.md | 58 + LINUX/TRANSMISSION.md | 30 + LINUX/UFW.md | 165 ++ LINUX/USER.md | 137 ++ LINUX/VSFTPD.md | 367 +++++ LINUX/WIREGUARD.md | 170 +++ LINUX/WORDPRESS.md | 471 ++++++ "LINUX/XARGS, TEE \320\270 WATCH.md" | 24 + LINUX/YAML.md | 84 ++ LINUX/__FLENOV.md | 1582 ++++++++++++++++++++ LINUX/iso fs _ ISO9660.md | 46 + LINUX/tr.md | 84 ++ ...\201\321\201\320\276\320\262 \320\262 Linux.md" | 27 + ...\201\321\201\320\276\320\262 \320\262 Linux.md" | 20 + ...13\320\265 \321\210\320\260\320\263\320\270.md" | 29 + ...1\203\321\202\320\270\320\262\320\260 linux.md" | 4 + ...72\320\260\320\272 read-only \320\262 Linux.md" | 39 + ...60 \321\207\320\260\321\201\321\202\320\270.md" | 71 + ...201\321\201\321\213\320\273\320\272\320\270.md" | 28 + ...\233\320\276\320\263\320\270 \320\262 Linux.md" | 226 +++ ...270\321\201\321\202\320\265\320\274\321\213.md" | 26 + ...13\321\205 \321\217\320\264\320\265\321\200.md" | 78 + ...\272\320\276\320\264\320\260 \320\262 Linux.md" | 42 + ...\270\320\274\320\272\321\203 \320\262 Linux.md" | 40 + ...276\320\263\321\200\320\260\320\274\320\274.md" | 26 + ...1\201\321\202\320\265\320\274\320\260 Linux.md" | 176 +++ 117 files changed, 15008 insertions(+) create mode 100644 LINUX/AmneziaWG.md create mode 100644 "LINUX/BASH -\320\272\321\203\321\200\321\201.md" create mode 100644 LINUX/BASH.md create mode 100644 LINUX/BASH_github/bash-guide-1.md create mode 100644 LINUX/BASH_github/bash-guide-2.md create mode 100644 "LINUX/BASH_github/\320\236\321\201\320\275\320\276\320\262\321\213 Bash.md" create mode 100644 "LINUX/BASH_script/15 \320\276\320\264\320\275\320\276\321\201\321\202\321\200\320\276\321\207\320\275\321\213\321\205 bash-\321\201\320\272\321\200\320\270\320\277\321\202\320\276\320\262.md" create mode 100644 "LINUX/BASH_script/BASH. \320\240\320\260\320\267\320\275\320\276\320\265.md" create mode 100644 "LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 1.md" create mode 100644 "LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 2.md" create mode 100644 "LINUX/BASH_script/\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\277\320\270\321\201\320\272\320\260 \320\277\320\260\320\272\320\265\321\202\320\276\320\262 \320\270 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\271.md" create mode 100644 "LINUX/BASH_script/\320\241\320\272\321\200\320\270\320\277\321\202\321\213 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\276\320\262.md" create mode 100644 LINUX/BAT.md create mode 100644 LINUX/BEGIN.md create mode 100644 LINUX/BorgBackup.md create mode 100644 LINUX/CAL.md create mode 100644 LINUX/CERTBOT.md create mode 100644 LINUX/CHMOD, CHOWN.md create mode 100644 LINUX/CIFS.md create mode 100644 LINUX/CRON.md create mode 100644 LINUX/DIFFERENT.md create mode 100644 LINUX/DISK/DF, DU.md create mode 100644 LINUX/DISK/FDISK.md create mode 100644 LINUX/DISK/FSTAB.md create mode 100644 "LINUX/DISK/GPT-\320\264\320\270\321\201\320\272 \320\262 Linux.md" create mode 100644 "LINUX/DISK/GeeseFS ( Yandex Cloud \320\264\320\270\321\201\320\272 ).md" create mode 100644 "LINUX/DISK/HDPARM \321\201\320\272\320\276\321\200\320\276\321\201\321\202\321\214 \320\264\320\270\321\201\320\272\320\260.md" create mode 100644 "LINUX/DISK/MDADM \320\276\321\200\320\263\320\260\320\275\320\270\320\267\320\260\321\206\320\270\321\217 RAID.md" create mode 100644 LINUX/DISK/NTFS.md create mode 100644 LINUX/DISK/SMARTMONTOOLS.md create mode 100644 "LINUX/DISK/SOFT RAID1 (mdadm) \320\263\320\276\321\200\321\217\321\207\320\260\321\217 \320\267\320\260\320\274\320\265\320\275\320\260 \320\264\320\270\321\201\320\272\320\260.md" create mode 100644 "LINUX/DISK/WD - \320\260\320\262\321\202\320\276\320\277\320\260\321\200\320\272\320\276\320\262\320\272\320\260.md" create mode 100644 "LINUX/DISK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 USB \320\275\320\260\320\272\320\276\320\277\320\270\321\202\320\265\320\273\321\217 \320\262 \320\267\320\260\320\264\320\260\320\275\320\275\321\203\321\216 \320\277\320\260\320\277\320\272\321\203.md" create mode 100644 "LINUX/DISK/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271 raid \320\262 Linux.md" create mode 100644 LINUX/DOCKER.md create mode 100644 LINUX/ENVIRONMENT.md create mode 100644 LINUX/EXIFTOOL.md create mode 100644 LINUX/FIND.md create mode 100644 "LINUX/Fail2ban - \320\236\321\201\320\275\320\276\320\262\321\213 \320\267\320\260\321\211\320\270\321\202\321\213 \321\201\320\265\321\200\320\262\320\265\321\200\320\276\320\262.md" create mode 100644 LINUX/GPG, PASS.md create mode 100644 LINUX/GREP.md create mode 100644 "LINUX/GRUB \320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\217\320\264\321\200\320\260 \320\262 Linux.md" create mode 100644 "LINUX/HOME_SERVER/5 \320\274\320\260\320\273\320\276\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\321\205 \320\272\320\276\320\274\320\260\320\275\320\264 \320\264\320\273\321\217 Linux.md" create mode 100644 "LINUX/HOME_SERVER/Caddy - \320\267\320\260\320\274\320\265\320\275\320\260 Nginx.md" create mode 100644 LINUX/HOME_SERVER/watch.md create mode 100644 "LINUX/HOME_SERVER/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" create mode 100644 "LINUX/HOME_SERVER/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265 \320\262 SYSTEMD.md" create mode 100644 "LINUX/HOME_SERVER/\320\243\321\201\320\270\320\273\320\265\320\275\320\270\320\265 \320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\320\270 Linux.md" create mode 100644 LINUX/HTOP.md create mode 100644 LINUX/IPTABLES, NFTABLES.md create mode 100644 LINUX/JOURNALCTL.md create mode 100644 LINUX/KILL, PKILL.md create mode 100644 LINUX/LEMP.md create mode 100644 "LINUX/LESS \320\270 SPLIT.md" create mode 100644 LINUX/LN.md create mode 100644 LINUX/LSOF.md create mode 100644 LINUX/Let's Encrypt.md create mode 100644 LINUX/MAILutils.md create mode 100644 LINUX/MC.md create mode 100644 LINUX/MOSQUITTO.md create mode 100644 LINUX/NC.md create mode 100644 LINUX/NCDU, BAT, FD, EXA, HTTPIE.md create mode 100644 LINUX/NCDU.md create mode 100644 LINUX/NETWORK/DNS.md create mode 100644 LINUX/NETWORK/IPERF3.md create mode 100644 LINUX/NETWORK/NETPLAN.md create mode 100644 LINUX/NETWORK/NETWORK.md create mode 100644 "LINUX/NETWORK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\270 \321\203\320\262\320\265\320\264\320\276\320\274\320\273\320\265\320\275\320\270\320\265 \320\276 \320\275\320\276\320\262\321\213\321\205 \321\203\321\201\321\202\321\200\320\276\320\271\321\201\321\202\320\262\320\260\321\205 \320\262 \321\201\320\265\321\202\320\270.md" create mode 100644 "LINUX/NETWORK/\320\222\320\275\320\265\321\210\320\275\320\270\320\271 IP \320\270\320\267 \320\272\320\276\320\275\321\201\320\276\320\273\320\270.md" create mode 100644 "LINUX/NETWORK/\320\241\320\232\320\236\320\240\320\236\320\241\320\242\320\254 \320\241\320\225\320\242\320\225\320\222\320\236\320\231 \320\232\320\220\320\240\320\242\320\253.md" create mode 100644 LINUX/NGINX.md create mode 100644 LINUX/PLEX.md create mode 100644 LINUX/PROGRAMS_bash.md create mode 100644 LINUX/PS.md create mode 100644 LINUX/PostgreSQL.md create mode 100644 LINUX/RANGER.md create mode 100644 "LINUX/REPOSITORIES \321\201\320\262\320\276\320\271 \321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271 \321\201 \320\277\320\260\320\272\320\265\321\202\320\260\320\274\320\270.md" create mode 100644 LINUX/RM.md create mode 100644 LINUX/ROOT.md create mode 100644 LINUX/RSYNC.md create mode 100644 LINUX/SAMBA.md create mode 100644 LINUX/SCP, SFTP.md create mode 100644 "LINUX/SERVER - \320\274\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263.md" create mode 100644 "LINUX/SHELL \320\272\320\276\320\274\320\260\320\275\320\264\321\213.md" create mode 100644 LINUX/SHUTDOWN, HALT, POWEROFF, REBOOT.md create mode 100644 LINUX/SSH.md create mode 100644 LINUX/SYSTEMCTL.md create mode 100644 LINUX/TAR.md create mode 100644 LINUX/TERMINAL.md create mode 100644 LINUX/TIMEDATE, CHRONY, NTP.md create mode 100644 LINUX/TLDR.md create mode 100644 LINUX/TMUX.md create mode 100644 LINUX/TRANSMISSION.md create mode 100644 LINUX/UFW.md create mode 100644 LINUX/USER.md create mode 100644 LINUX/VSFTPD.md create mode 100644 LINUX/WIREGUARD.md create mode 100644 LINUX/WORDPRESS.md create mode 100644 "LINUX/XARGS, TEE \320\270 WATCH.md" create mode 100644 LINUX/YAML.md create mode 100644 LINUX/__FLENOV.md create mode 100644 LINUX/iso fs _ ISO9660.md create mode 100644 LINUX/tr.md create mode 100644 "LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\276\320\267\321\200\320\270\321\202\320\265\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" create mode 100644 "LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\267\320\260\320\262\320\270\321\201\321\210\320\270\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" create mode 100644 "LINUX/\320\221\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214 Linux - \320\277\321\200\320\276\321\201\321\202\321\213\320\265 \321\210\320\260\320\263\320\270.md" create mode 100644 "LINUX/\320\221\321\213\321\201\321\202\321\200\320\276 \320\277\320\276\321\201\320\274\320\276\321\202\321\200\320\265\321\202\321\214 \320\262\320\265\321\200\321\201\320\270\321\216 \320\270 \320\275\320\260\320\267\320\262\320\260\320\275\320\270\320\265 \320\264\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260 linux.md" create mode 100644 "LINUX/\320\230\321\201\320\277\321\200\320\260\320\262\320\270\321\202\321\214 USB, \321\201\320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\203\321\216 \320\272\320\260\320\272 read-only \320\262 Linux.md" create mode 100644 "LINUX/\320\232\320\260\320\272 \321\200\320\260\320\267\320\261\320\270\321\202\321\214 \321\204\320\260\320\271\320\273 \320\275\320\260 \321\207\320\260\321\201\321\202\320\270.md" create mode 100644 "LINUX/\320\232\320\260\320\272 \321\203\320\264\320\260\320\273\321\217\321\202\321\214 \321\201\321\201\321\213\320\273\320\272\320\270.md" create mode 100644 "LINUX/\320\233\320\276\320\263\320\270 \320\262 Linux.md" create mode 100644 "LINUX/\320\236\320\277\321\202\320\270\320\274\320\270\320\267\320\260\321\206\320\270\321\217 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\270 Linux - \321\203\321\201\320\272\320\276\321\200\321\217\320\265\320\274 \321\201\321\202\320\260\321\200\321\202 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" create mode 100644 "LINUX/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \320\270 \321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\201\321\202\320\260\321\200\321\213\321\205 \321\217\320\264\320\265\321\200.md" create mode 100644 "LINUX/\320\241\320\261\320\276\321\200\320\272\320\260 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274 \320\270\320\267 \320\270\321\201\321\205\320\276\320\264\320\275\320\276\320\263\320\276 \320\272\320\276\320\264\320\260 \320\262 Linux.md" create mode 100644 "LINUX/\320\241\320\272\321\200\321\213\321\202\321\213\320\265 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\321\213 \320\270 rootkits, \320\272\320\260\320\272 \320\275\320\260\320\271\321\202\320\270 \320\275\320\265\320\262\320\270\320\264\320\270\320\274\320\272\321\203 \320\262 Linux.md" create mode 100644 "LINUX/\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274.md" create mode 100644 "LINUX/\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217 \321\201\320\270\321\201\321\202\320\265\320\274\320\260 Linux.md" (limited to 'LINUX') diff --git a/LINUX/AmneziaWG.md b/LINUX/AmneziaWG.md new file mode 100644 index 0000000..24e9ffa --- /dev/null +++ b/LINUX/AmneziaWG.md @@ -0,0 +1,67 @@ +AmneziaWG — это форк WireGuard с обфускацией трафика, который помогает обходить DPI-блокировки там, где обычный WireGuard режется [](https://github.com/bivlked/amneziawg-installer/blob/main/README.md)[](https://github.com/bivlked/amneziawg-installer/blob/main/README.en.md). + +Вот **три способа поднять сервер AmneziaWG** (от самого простого к более продвинутому): + +Этот скрипт установит AmneziaWG за пару минут. + +**1. Загрузите и запустите скрипт:** + +```sh +bash + +curl -O https://raw.githubusercontent.com/wiresock/amneziawg-install/main/amneziawg-install.sh +chmod +x amneziawg-install.sh +sudo ./amneziawg-install.sh +``` + +**2. Ответьте на вопросы скрипта:** + +- Укажите публичный IP вашего сервера +- Выберите порт (по умолчанию 51820, но лучше сменить) +- Скрипт сам сгенерирует ключи и параметры обфускации + +**3. Результат:** После установки готовый конфиг клиента появится в  +`~/awg0-client-<имя>.conf` [](https://github.com/wiresock/amneziawg-install/blob/main/README.md) + +### Обновление и управление: +```sh + +bash + +# Добавить или удалить клиентов +sudo ./amneziawg-install.sh + +# Если нужна веб-панель (опционально) +sudo ./amneziawg-web.sh install +``` +### Добавление нового клиента + +Если вам нужен конфиг для дополнительного клиента, выполните: + +bash + +sudo ./amneziawg-install.sh --add-client ИМЯ_КЛИЕНТА + + +### Параметры обфускации + +Если у вас возникли проблемы с подключением, попробуйте изменить параметры в конфиге сервера (`/etc/amnezia/amneziawg/awg0.conf`): + +|Параметр|Назначение|Рекомендуемое значение| +|---|---|---| +|`Jc`|Количество мусорных пакетов|4-10| +|`Jmin`|Мин. размер мусора (байт)|50| +|`Jmax`|Макс. размер мусора (байт)|1000| +|`S1`|Мусор в handshake init|0-150| +|`S2`|Мусор в handshake response|0-150| +|`H1-H4`|Магические заголовки|Уникальные числа [](https://github.com/telemt/telemt/blob/main/docs/Setup_examples/VPS_DOUBLE_HOP.ru.md)[](https://github.com/link0ln/amneziawg-docker-server)| + +### Важные замечания + +- **Все клиенты** должны использовать те же параметры `Jc, Jmin, Jmax`, что и сервер [](https://github.com/link0ln/amneziawg-docker-server) + +- Рекомендуется **сменить порт** с 51820 на что-то нестандартное (например, 8443 или 585) [](https://docs.amnezia.org/ru/documentation/instructions/install-vpn-on-server/#%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%b5-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d0%b8) + +- AmneziaWG совместим с обычным WireGuard, но для обфускации нужны специальные параметры + + diff --git "a/LINUX/BASH -\320\272\321\203\321\200\321\201.md" "b/LINUX/BASH -\320\272\321\203\321\200\321\201.md" new file mode 100644 index 0000000..79d5707 --- /dev/null +++ "b/LINUX/BASH -\320\272\321\203\321\200\321\201.md" @@ -0,0 +1,121 @@ +=========================== +```sh +# СОЗДАЕМ СКРИПТ ДЛЯ СОЗДАНИЯ ПОЛЬЗОВАТЕЛЯ И ГРУППЫ + +#!/bin/bash # шебанг + +set -e # при ошибке скрипт прервется! + +read -p "login: " login # ввод логина +read -p "Password: " -s password # секьюрный ввод пароля! +read -p "path of ssh public key: " -e ssh_pub_key # ввод ключа (выбор через TAB) + +homedir=/home/$login +ssh_dir=$homedir/.ssh + +sudo mkdir -p "$ssh_dir" + +sudo cat "$ssh_pub_path" >> "$ssh_dir/authorized_keys" # дописываем в конец файла +sudo cp -rT /etc/skel $homedir + +sudo useradd -d $homedir -s /bin/bash $login +sudo chown -R $login:$login $homedir + +echo "$login:$password" | sudo chpasswd + +cat /etc/passwd | grep $login + + +=========================== +# Выход из пользователя: +Ctrl+d +exit + +man usermod +# поиск: +/... +/enter # перемещаемся + +cat /var/TabTab +cat /var/log/TabTab +cat /var/log | tail -20 + +=========================== +# SUDO - находятся: +sudo vim /etc/sudoers # НЕ ИЗМЕНЯТЬ !!! + +# Добавлять с проверкой: +sudo vimsudo /etc/sudoers.d/user +# в файл добавляем: +user ALL=(ALL:ALL) ALL +user ALL=(ALL:ALL) NOPASSWD:ALL + +=========================== +# Скрипт +vim ~/script/... + +#!/bin/bash + +# генерируем 3 директории с правами для всех, для группы, для юзера. Сделаем проверку, что права выставлены верно: + +set -e + +login=$1 +homedir=/home/$login +list_name_dir=(secret_for_other secret_for_group secret_for_user) + +ready_dir_list=() + +for name in ${list_name_dir[@]}; # так для массива(списка) +do + mkdir -p $homedir/${login}_${name} + #chown -R $login:$login $homedir + ready_dir_list+=($homedir/${login}_${name}) + if [[ $(echo $name | grep other) ]]; + then + chmod -R 007 $homedir/${login}_${name} + elif [[ $(echo $name | grep group) ]]; + then + chmod -R 070 $homedir/${login}_${name} + elif [[ $(echo $name | grep user) ]]; + then + chmod -R 700 $homedir/${login}_${name} + fi +done + +echo ${list_name_dir[@]} +echo ${ready_dir_list[@]} + +counter=$(ls $homedir/ | wc -l) +while [ $counter -gt 0 ]; +do + counter=$(( $counter - 1 )) + access_rules=$(ls -ld ${ready_dir_list[$counter]} | cut -d' ' -f 1) + type_of_rules=$(echo ${ready_dir_list[$counter]} | cut -d'_' -f 4) + + if [[ ${access_rules:1} == "rwx------" ]] && [[ ${type_of_rules} == "user" ]]; + then + echo ${counter} " THIS IS RULES FOR" ${type_of_rules} + echo $access_rules + echo "GOOD JOB" + elif [[ ${access_rules:1} == "---rwx---" ]] && [[ ${type_of_rules} == "group" ]]; + then + echo "THIS IS RULES FOR" ${type_of_rules} + echo $access_rules + echo "GOOD JOB" + elif [[ ${access_rules:1} == "------rwx" ]] && [[ ${type_of_rules} == "other" ]]; + then + echo "THIS IS RULES FOR" ${type_of_rules} + echo $access_rules + echo "GOOD JOB" + else + echo ---------------- + echo "YOU MADE MISTAKE FOR" ${type_of_rules} + echo $access_rules + echo ---------------- + fi + +#done + + +``` diff --git a/LINUX/BASH.md b/LINUX/BASH.md new file mode 100644 index 0000000..c8812a0 --- /dev/null +++ b/LINUX/BASH.md @@ -0,0 +1,109 @@ +```bash +mydir=$(pwd) +mydir=`pwd` +echo $mydir + +=========================== + +=========================== +-z # строка пуста +-n # строка не пуста +=, (==) # строки равны +! = # строки не равны + +! # отрицание логическоно выражения +-a, (&&) # логическое И +-o, (||) # логическое ИЛИ + +var1=(( 5 + 5)) +-eq = +-ge >= +-gt > +-le <= +-lt < +-ne != + +if [ $val - gt 5] +then +elif +else +fi + +/dev/pts/$i + +IFS=$'\n' # переназначение переменной среды на только перевод строки +IFS=: +``` + +```sh +# Где я? +mydir=`pwd` +mydir=$(pwd) +echo $mydir + +# Математика: +var1=$(( 5 + 5 )) +echo $var1 + +# IF-THEN-ELSE-ELIF +user=likegeeks +if grep $user /etc/passwd +then +echo "The user $user Exists!" +else +echo "The user $user doesn't exist" +elif grep $user /usr/bin +then +echo "jhgvhjlgvljhgljhg" +fi +``` + +```sh +# Как в Linux, так и в OS X grep возвращает код выхода, поэтому легко проверить, был ли процесс найден или нет:** + +#!/bin/bash +ps cax | grep httpd > /dev/null +if [ $? -eq 0 ]; then + echo "Process is running." +else + echo "Process is not running." +fi + + +# Кроме того, если вам нужен список PID, вы также можете легко выполнить grep для них:** + +ps cax | grep httpd | grep -o '^[ ]*[0-9]*' + +# Чей вывод одинаков в Linux и OS X:** + +3519 3521 3523 3524 + +# Вывод следующего представляет собой пустую строку, что делает этот подход безопасным для процессов, которые не запущены:** + +echo `ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'` + +# Этот подход подходит для написания простого теста с пустой строкой, а затем даже для перебора обнаруженных PID. + +#!/bin/bash +PROCESS=$1 +PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'` +if [ -z "$PIDS" ]; then + echo "Process not running." 1>&2 + exit 1 +else + for PID in $PIDS; do + echo $PID + done +fi + +# Вы можете протестировать ее, сохранив в файл (с именем "running") с разрешениями на выполнение (chmod + x running) и выполнив его с параметром: `./running "httpd"` + +#!/bin/bash +ps cax | grep httpd +if [ $? -eq 0 ]; then + echo "Process is running." +else + echo "Process is not running." +fi +``` + diff --git a/LINUX/BASH_github/bash-guide-1.md b/LINUX/BASH_github/bash-guide-1.md new file mode 100644 index 0000000..0128e08 --- /dev/null +++ b/LINUX/BASH_github/bash-guide-1.md @@ -0,0 +1,218 @@ +Бесплатная книга-сайт на русском, полный гайд +[Advanced Bash-Scripting Guide](http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html) + +# [Основы BASH. Часть 1](https://habr.com/post/47163/) +## Введение + +BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов. + + +>`break` выход из цикла for, while или until +> `continue` выполнение следующей итерации цикла for, while или until +> `echo` вывод аргументов, разделенных пробелами, на стандартное устройство вывода +> `exit` выход из оболочки +> `export` отмечает аргументы как переменные для передачи в дочерние процессы в среде +> `hash` запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении +> `kill` посылает сигнал завершения процессу +> `pwd` выводит текущий рабочий каталог +> `read` читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\ +> `return` заставляет функцию оболочки выйти с указанным значением +> `shift` перемещает позиционные параметры налево +> `test` вычисляет условное выражение +> `times` выводит имя пользователя и системное время, использованное оболочкой и ее потомками +> `trap` указывает команды, которые должны выполняться при получении оболочкой сигнала +> `unset` вызывает уничтожение переменных оболочки +> `wait` ждет выхода из дочернего процесса и сообщает выходное состояние. + + +И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе + +## Что необходимо знать с самого начала + +1. Любой bash-скрипт должен начинаться со строки: + +> `#!/bin/bash` + +*в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав `whereis bash`) поменяйте её на ваш путь.* + +2. Коментарии начинаются с символа # (кроме первой строки). +3. В bash переменные не имеют типа(о них речь пойдет ниже) + +## Переменные и параметры скрипта + +Приведу как пример небольшой пример, который мы разберем: + +> `#!/bin/bash` #указываем где у нас хранится bash-интерпретатор +> \#присваиваем переменной parametr1 значение первого параметра скрипта +> `parametr1=$1` +> \#присваиваем переменной script_name значение имени скрипта +> `script_name=$0` +> \# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. +> `echo "Вы запустили скрипт с именем $script_name и параметром $parametr1"` +> \# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. +> `echo 'Вы запустили скрипт с именем $script_name и параметром $parametr1'` +> \#Выход с кодом 0 (удачное завершение работы скрипта) +> `exit 0` + + +Результат выполнения скрипта: + +> `ite@ite-desktop:~$ ./test.sh qwerty` +> Вы запустили скрипт с именем ./test.sh и параметром qwerty +> Вы запустили скрипт с именем $script_name и параметром $parametr1 + + +После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными: + +> `$DIRSTACK` - содержимое вершины стека каталогов +> `$EDITOR` - текстовый редактор по умолчанию +> `$EUID` - Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как... +> `$UID` - ...содержит реальный идентификатор, который устанавливается только при логине. +> `$FUNCNAME` - имя текущей функции в скрипте. +> `$GROUPS` - массив групп к которым принадлежит текущий пользователь +> `$HOME` - домашний каталог пользователя +> `$HOSTNAME` - ваш hostname +> `$HOSTTYPE` - архитектура машины. +> `$LC_CTYPE` - внутренняя переменная, котороя определяет кодировку символов +> `$OLDPWD` - прежний рабочий каталог +> `$OSTYPE` - тип ОС +> `$PATH` - путь поиска программ +> `$PPID` - идентификатор родительского процесса +> `$SECONDS` - время работы скрипта(в сек.) +> `$#` - общее количество параметров переданных скрипту +> `$*` - все аргументы переданыне скрипту(выводятся в строку) +> `$@` - тоже самое, что и предыдущий, но параметры выводятся в столбик +> `$!` - PID последнего запущенного в фоне процесса +> `$$` - PID самого скрипта + +## Условия + +Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере): + + +> `#!/bin/bash` +> \#в переменную source засовываем первый параметр скрипта +> `source=$1` +> \#в переменную dest засовываем второй параметр скрипта +> `dest=$2` +> +> \# в ковычках указываем имена переменных для сравнения. -eq - логическое сравнение обозначающие "равны" +> `if [[ "$source" -eq "$dest" ]]` +> \# если они действительно равны, то +> `then` +> \#выводим сообщение об ошибке, т.к. $source и $dest у нас равны +> `echo "Применик $dest и источник $source один и тот же файл!"` +> \# выходим с ошибкой (1 - код ошибки) +> `exit 1` +> \# если же они не равны +> `else` +> \# то выполняем команду cp: копируем источник в приемник +> `cp $source $dest` +> `echo "Удачное копирование!"` +> `fi` #обозначаем окончание условия. + + +Результат выполнения скрипта: + + +> `ite@ite-desktop:~$ ./primer2.sh 1 1` +> Применик 1 и источник 1 один и тот же файл! + +> `ite@ite-desktop:~$ ./primer2.sh 1 2` +> Удачное копирование! + +Структура `if-then-else` используется следующим образом: + +> `if` <команда или набор команд возвращающих код возврата(0 или 1)> +> `then` +> <если выражение после if истино, то выполняется этот блок> +> `else` +> <если выражение после if ложно, тот этот> + + +В качестве команд возвращающих код возврата могут выступать структуры `[[ , [ , test, (( ))` или любая другая(или несколько) linux-команда. + + +> `test` - используется для логического сравнения. после выражения, неоьбходима закрывающая скобка "]" +>`[` - синоним команды test +>`[[` - расширенная версия "[" (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку "]]" +>`(( ))` - математическое сравнение. + + +для построения многоярусных условий вида: + +> `if ...` +>`then ....` +>`else` +>`if ....` +>`then....` +>`else ....` + +для краткости и читаемости кода, можно использовать структуру: + +> `if ..` +> `then ...` +> `elif ...` +> `then ...` +> `elif ...` + + +## Условия. Множественный выбор + +Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case. + +> `#!/bin/bash` +> `echo "Выберите редатор для запуска:"` +> `echo "1 Запуск программы nano"` +> `echo "2 Запуск программы vi"` +> `echo "3 Запуск программы emacs"` +> `echo "4 Выход"` +\#здесь мы читаем в переменную $doing со стандартного ввода +> `read doing` +> +> `case $doing in` +> `1)` +> `/usr/bin/nano` # если $doing содержит 1, то запустить nano +> `;;` +> `2)` +> `/usr/bin/vi` # если $doing содержит 2, то запустить vi +> `;;` +> `3)` +> `/usr/bin/emacs` # если $doing содержит 3, то запустить emacs +> `;;` +> `4)` +> `exit 0` +> `;;` +> `*)` #если введено с клавиатуры то, что в case не описывается, выполнять следующее: +> `echo "Введено неправильное действие"` +> +> `esac` #окончание оператора case. + +Результат работы: + +> `ite@ite-desktop:~$ ./menu2.sh` +> Выберите редатор для запуска: +> 1 Запуск программы nano +> 2 Запуск программы vi +> 3 Запуск программы emacs +> 4 Выход + +После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы :) ) + + +Прведу список логических операторв, которые используются для конструкции if-then-else-fi: + +> `-z` # строка пуста +> `-n` # строка не пуста +> `=, (==)` # строки равны +> `!=` # строки неравны +> `-eq` # равно +> `-ne` # неравно +> `-lt,(< )` # меньше +> `-le,(<=)` # меньше или равно +> `-gt,(>)` #больше +> `-ge,(>=)` #больше или равно +> `!` #отрицание логического выражения +> `-a,(&&)` #логическое «И» +> `-o,(||)` # логическое «ИЛИ» + diff --git a/LINUX/BASH_github/bash-guide-2.md b/LINUX/BASH_github/bash-guide-2.md new file mode 100644 index 0000000..92c42fa --- /dev/null +++ b/LINUX/BASH_github/bash-guide-2.md @@ -0,0 +1,225 @@ +# [Основы BASH. Часть 2](https://habr.com/post/52871/) + +## Циклы. Цикл for-in. + +Оператор `for-in` предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной. +Синтаксис следующий: + +``` +for переменная in список_значений +do +команды +done +``` + +Рассмотрим небольшой пример: + +``` +#!/bin/bash +for i in 0 1 2 3 4 #переменной $i будем поочередно присваивать значения от 0 до 4 включительно +do +echo "Console number is $i" >> /dev/pts/$i #Пишем в файл /dev/pts/$i(файл виртуального терминала) строку "Console number is $i" +done #цикл окончен +exit 0 +``` + +После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную `$i` поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной + +## Циклы. Цикл while. + +Цикл `while` сложнее цикла `for-in` и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). +Синтаксис оператора следующий: + +``` +while выражение или команда возвращающая код возврата +do +команды +done +``` + +Пример работы цикла рассмотрим на следующем примере: + +``` +#!/bin/bash +again=yes #присваиваем значение "yes" переменной again +while [ "$again" = "yes" ] #Будем выполнять цикл, пока $again будет равно "yes" +do +echo "Please enter a name:" +read name +echo "The name you entered is $name" + +echo "Do you wish to continue?" +read again +done +echo "Bye-Bye" +``` + + +А теперь результат работы скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer1.sh +Please enter a name: +ite +The name you entered is ite +Do you wish to continue? +yes +Please enter a name: +mihail +The name you entered is mihail +Do you wish to continue? +no +Bye-Bye +``` + +Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между `do` и `done` можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл. + +Теперь об условии истинности. После `while`, как и в условном операторе `if-then-else` можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор `[` аналог команды `test`, которая проверяет истинность условия, которое ей передали. + +Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов **UNTIL-DO**. Эта практически полный аналог цикла **WHILE-DO**, только выполняется пока какое-то выражение ложно. +Вот пример: +``` +#!/bin/bash +echo "Введите числитель: " +read dividend +echo "Введите знаменатель: " +read divisor + +dnd=$dividend #мы будем изменять переменные dividend и divisor, +#сохраним их знания в других переменных, т.к. они нам +#понадобятся +dvs=$divisor +remainder=1 + +until [ "$remainder" -eq 0 ] +do +let "remainder = dividend % divisor" +dividend=$divisor +divisor=$remainder +done + +echo "НОД чисел $dnd и $dvs = $dividend" +``` + +Результат выполнения скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer3.sh +Введите числитель: +100 +Введите знаменатель: +90 +НОД чисел 100 и 90 = 10 +``` + +## Математические операции + +Команда `let`. +Команда `let` производит арифметические операции над числами и переменными. +Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами: + +``` +#!/bin/bash +echo "Введите a: " +read a +echo "Введите b: " +read b + +let "c = a + b" #сложение +echo "a+b= $c" +let "c = a / b" #деление +echo "a/b= $c" +let "c <<= 2" #сдвигает c на 2 разряда влево +echo "c после сдвига на 2 разряда: $c" +let "c = a % b" # находит остаток от деления a на b +echo "$a / $b. остаток: $c " +``` + +Результат выполнения: +``` +ite@ite-desktop:~$ ./bash2_primer2.sh +Введите a: +123 +Введите b: +12 +a+b= 135 +a/b= 10 +c после сдвига на 2 разряда: 40 +123 / 12. остаток: 3 +``` + + +Ну вот, как видите ничего сложного, список математических операций стандартный: + +> `+` — сложение +> `—` — вычитание +> `*` — умножение +> `/` — деление +> `**` — возведение в степень +> `%` — модуль(деление по модулю), остаток от деления +> `let` позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: `a = a+b` эквивалентно `a +=b` и т.д + +## Работа с внешними программами при написании shell-скриптов + +Для начала немного полезной теории. +### Перенаправление потоков. + +В **bash** (как и многих других оболочках) есть встроенные файловые дескрипторы: `0 (stdin)`, `1 (stdout)`, `2 (stderr)`. +`stdout` — Стандартный вывод. Сюда попадает все что выводят программы +`stdin` — Стандартный ввод. Это все что набирает юзер в консоли +`stderr` — Стандартный вывод ошибок. +Для операций с этими дескрипторами, существуют специальные символы: `>` (перенаправление вывода), `<` (перенаправление ввода). Оперировать ими не сложно. Например: + +``` +cat /dev/random > /dev/null #перенаправить вывод команды cat /dev/random в /dev/null (абсолютно бесполезная операция :)) ) +``` +или + +``` +ls -la > listing #записать в файл listing содержание текущего каталога (уже полезней) +``` + +Если есть необходимость дописывать в файл(при использовании "`>`" он заменятеся), необходимо вместо "`>`" использовать "`>>`" +``` +sudo < my_password +``` +после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры. +Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать: +``` +./program_with_error 2> error_file +``` +цифра 2 перед "`>`" означает что нужно перенаправлять все что попадет в дескриптор 2(stderr). +Если необходимо заставить `stderr` писать в `stdout`, то это можно след. образом: +``` +./program_with_error 2>&1 +``` +символ "`&`" означает указатель на дескриптор `1(stdout)` +(Поумолчанию `stderr` пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)). + +### 2. Конвееры. + +Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой: +`команда1 | команда 2` — означает, что вывод команды 1 передастся на ввод команде 2 +Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например: +``` +ls -la | grep «hash» |sort > sortilg_list +``` +вывод команды `ls -la` передается команде `grep`, которая отбирает все строки, в которых встретится слово *hash*, и передает команде сортировке `sort`, которая пишет результат в файл *sorting_list*. Все довольно понятно и просто. + +Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке `stdout` одной команды и передача на `stdin` другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты. + +### 1. Передача вывода в переменную. + +Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в ` `` ` ковычки, например +> a = \` echo "qwerty" \` +> echo $a + +Результат работы: qwerty + +Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример: +``` +LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` +for ONE_OF_LIST in $LIST +do +svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST +done +``` +Здесь мы используем цикл `for-do-done` для архивирование всех директорий в папке */svn/* с помощью команды `svnadmin hotcopy`(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу. \ No newline at end of file diff --git "a/LINUX/BASH_github/\320\236\321\201\320\275\320\276\320\262\321\213 Bash.md" "b/LINUX/BASH_github/\320\236\321\201\320\275\320\276\320\262\321\213 Bash.md" new file mode 100644 index 0000000..7100ab1 --- /dev/null +++ "b/LINUX/BASH_github/\320\236\321\201\320\275\320\276\320\262\321\213 Bash.md" @@ -0,0 +1,222 @@ +## синтаксис, переменные и команды ## + +Кодить будем в терминале Linux — он открывается сочетанием клавиш **Ctrl + Alt + T**. Если вы хотите научиться работать с Bash, но пока не пользуетесь Linux, то пишите код в одном из онлайн-терминалов — например, [Replit](https://repl.it/languages/bash). + +### **Переменные** + +Переменные в Bash объявляются просто: + +` message="Hello, World!" ` + +Теперь переменная message хранит значение — текстовое сообщение «Hello, World!». Давайте выведем его — сделать это можно с помощью команды echo: + +` echo $message # Будет выведено «Hello, World!» ` + +Обратите внимание на отсутствие пробелов. В Bash пробелы являются разделителями. Если пробелы есть, то Bash будет считать их отдельными токенами и выдавать ошибки. + +Следующий код приведёт к ошибке: + +` message = "Hello, World!" bash: message: command not found ` + +Также обратите внимание на символ $ **—** в Bash он называется символом расширения (expansion character). Поставленный перед именем переменной, он указывает на то, что нужно использовать именно значение переменной, а не одноимённую строку. + +Следующий код выведет сообщение «message»: + +` message="Hello, World!" echo message ` + +Чтобы сохранить в переменной введённое пользователем значение, используйте команду read: + +` read name # Пользователь вводит что-то — например, «Olga» echo $name # Будет выведено «Olga» ` + +Если вы хотите добавить сообщение перед пользовательским вводом, добавьте флаг -p и сообщение после команды read: + +` read -p "Enter your name: " name # Будет выведено «Enter your name: » # Пользователь вводит что-то — например, «Olga» echo $name # Будет выведено «Olga» ` + +В Bash есть несколько правил именования переменных: + +- Имя переменной должно начинаться с буквы латинского алфавита (нижнего или верхнего регистра) или символа подчёркивания _. +- Оно может включать буквы, цифры и символ подчёркивания, но не может содержать пробелы или специальные символы. +- Регистр букв в именах переменных имеет значение. Например, переменные var1 и Var1 будут рассматриваться как разные. +- Не рекомендуется использовать зарезервированные слова Bash в качестве имён переменных. + +### **Типы данных** + +Ну что же, вот мы и создали нашу первую переменную. Поздравляем! Пока эта переменная содержит всего один тип данных — строковый (string). Но в Bash он далеко не единственный — давайте разберём ещё несколько. + +**ВАЖНАЯ ОГОВОРКА** + +В Bash нет строгой системы типов, как в некоторых других языках. Тип данных зависит от содержимого переменной и контекста её использования. Поэтому термин «типы данных» в этой статье используется условно, для облегчения понимания. Простите нам это упрощение. + +**Строки (strings)** — это набор символов, заключённый в кавычки. В Bash можно писать строки в одинарных '…' или двойных "…" кавычках. Например, 'Привет' и "Мир" — это строки. + +**Числа (numbers)** — это целочисленные значения. Bash поддерживает арифметические операции с целыми числами, включая сложение, вычитание, умножение и деление. Арифметические выражения нужно предварять знаком $ и обрамлять двойными круглыми скобками: + +` a=2 b=3 echo $(($a + $b)) # Будет выведено 5 ` + +Также можно использовать команду expr: + +` echo $(expr $a + $b) # Будет выведено 5 ` + +Стандартные библиотеки Bash поддерживают следующие арифметические операции: + +- Сложение — +. +- Вычитание — -. +- Умножение — *. +- Целочисленное деление — /. +- Остаток от деления — %. +- Возведение в степень — **. + +**Примечание**: арифметические операторы в Bash не работают с числами с плавающей точкой. + +**Массивы (arrays)** — тип переменных, который может хранить несколько значений. Элементы массива перечисляются в круглых скобках через пробел: + +` my_array=(apple banana cherry) ` + +При использовании переменной массива в команде применяются фигурные скобки. Если мы хотим вывести его отдельные элементы, это можно сделать с помощью символа $ и номера индекса в квадратных скобках: + +` echo ${my_array[0]} # Выведет «apple» echo ${my_array[1]} # Выведет «banana» echo ${my_array[2]} # Выведет «cherry» ` + +А если нам нужно получить сразу все элементы массива, вместо индекса в квадратных скобках нужно поставить символ * или @: + +` echo ${my_array[*]} # Выведет «apple banana cherry» echo ${my_array[@]} # Выведет «apple banana cherry» ` + +**Логические значения (boolean)** — нужны для того, чтобы проверить, выполняется ли какое-то условие или нет. Они могут быть либо true (истина), либо false (ложь). Например, в операторах if и while мы пишем условие, и если оно true, то выполняем какое-то действие. + +В Bash логические значения представлены целыми числами. Число 0 означает true, а любое другое число означает false. Когда мы выводим логическое значение на экран, то вместо true мы видим 0. + +Также в Bash есть операторы сравнения. Например, эти нужны для строк: + +- = проверяет, одинаковы ли две строки. +- != проверяет, различаются ли две строки. + +А эти — для чисел: + +- -eq проверяет, равны ли два числа. +- -ne проверяет, различаются ли два числа. +- -gt проверяет, больше ли первое число, чем второе. +- -lt проверяет, меньше ли первое число, чем второе. +- -ge выводит true, если первое число больше или равно второму. +- -le выводит true, если первое число меньше или равно второму. + +Использовать операторы сравнения можно с помощью команды test. Команда test принимает два значения и оператор сравнения и возвращает 1 или 0 в зависимости от результата: + +` test "hello" = "hello" echo $? # Выведет 0 (true), так как строки одинаковые test "hello" != "world" echo $? # Выведет 0 (true), так как строки различаются ` + +Помимо команды test, операторы сравнения можно использовать квадратных скобках [ ]. Но для этого нам понадобится разобраться, как работать с ветвлениями. + +### **Ветвления** + +Ветвления if-then-else позволяют проверить условие и выполнить один набор команд, если условие истинно, и другой набор команд, если условие ложно. Это выглядит так: + +` if [ условие ]; then # Команды, которые нужно выполнить, если условие истинно else # Команды, которые нужно выполнить, если условие ложно fi ` + +**Обратите внимание**: открывающую и закрывающую квадратные скобки нужно отделять от операндов пробелами. + +А если в паре с основным условием нужно проверить дополнительное, используют конструкцию elif: + +` if [ условие_1 ]; then # Команды, которые нужно выполнить, если условие_1 истинно elif [ условие_2 ]; then # Команды, которые нужно выполнить, если условие_2 истинно else # Команды, которые нужно выполнить, если все условия ложны fi ` + +Существует и более короткая форма записи условной конструкции — if-then. Её используют, когда нужно проверить только одно условие: + +` if [ условие ]; then # Команды, которые нужно выполнить fi ` + +В этом случае команды будут выполнены, только если условие истинно. + +Для наглядности давайте напишем скрипт, который проверяет правильность введённого пароля: + +` #!/bin/bash # Задаём значение переменной password password="14pomTEr" # Запрашиваем ввод пароля у пользователя и сохраняем полученное значение в переменную user_input read -p "Enter the password: " user_input # Сравниваем значение переменной password с введённым пользователем значением user_input if [ "$password" = "$user_input" ]; then # Если пароли совпадают, выводим сообщение о том, что пароль введён правильно echo "Password accepted" else # Если пароли не совпадают, выводим сообщение о том, что пароль введён неправильно echo "Wrong password" fi ` + +Кроме того, в Bash есть логические операторы & & (логическое И) и **||** (логическое ИЛИ), которые позволяют комбинировать несколько условий и возвращать соответствующее булево значение. + +Например, вот как будет выглядеть наша программа, если мы добавим проверку логина: + +` #!/bin/bash username="OlgaBelova94" # Устанавливаем переменную с именем пользователя password="14pomTEr" read -p "Enter your username: " user_input_username # Запрашиваем имя пользователя read -p "Enter the password: " user_input_username # Запрашиваем пароль echo "Enter the password: " read user_input_password # Запрашиваем пароль if [ "$username" == "$user_input_username" ] && [ "$password" == "$user_input_password" ]; then echo "Password accepted" else echo "Wrong username or password" # Уточняем, что именно было неверно fi ` + +Здесь мы получим значение true и сообщение «Password accepted», только если будут выполнены оба условия. + +### **Циклы** + +Как и в большинстве языков программирования, в Bash есть циклы. Они бывают двух видов: + +- for — когда количество итераций заранее известно. +- while — когда количество итераций заранее не известно. + +Вот как выглядит сигнатура цикла for: + +` for переменная цикла in элемент1 элемент2 ... элементN do # Команды, которые будут выполняться в цикле done ` + +Количество итераций (часть между in и do) можно указать простым перечислением элементов: + +` for fruit in apple banana cherry do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry ` + +Можно перебрать элементы массива: + +` my_array=("apple" "banana" "orange") for fruit in "${my_array[@]}" do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry ` + +Для явного указания нужного количества итераций используют арифметические выражения: + +` for ((i=0; i<5; i++)) do echo "Iteration number $i" done # Будет выведено: # Iteration number 0 # Iteration number 1 # Iteration number 2 # Iteration number 3 # Iteration number 4 ` + +А вот так выглядит сигнатура цикла while: + +` while [ условие ] do # Команды, которые будут выполняться в цикле done ` + +**Условие** **(condition)** — это выражение, результат которого является логическим значением true или false. Команды внутри цикла будут выполняться до тех пор, пока condition возвращает true. + +Давайте усовершенствуем нашу программу проверки пароля так, чтобы она запрашивала его до тех пор, пока пользователь не введёт верный: + +` #!/bin/bash password="14pomTEr" user_input="" while [ "$user_input" != "$password" ] do read -p "Enter the password: " user_input echo "Wrong password, login denied" done echo "Password accepted, login allowed" ` + +**Что здесь происходит.** В этом примере цикл while запрашивает пароль у пользователя, а потом проверяет его на совпадение с правильным с помощью оператора ["$user_input" != "$password"]. А дальше происходит следующее: + +- Если пароль неверный, программа выводит соответствующее сообщение, а цикл продолжается. +- Если пароль верный, программа выводит сообщение о принятии пароля и завершает выполнение. + +### **Функции** + +Функции на языке Bash имеют такой вид: + +` имя_функции (аргументы) { # Тело функции } ` + +Например, вот как выглядит простая функция без аргументов: + +` say_hello () { # Создаём функцию echo hello } say_hello # Вызываем функцию, будет выведено «hello» ` + +А вот как выглядит функция, которая принимает аргументы: + +` repeat_text () { local text=$1 local reps=$2 for (( i=0; i<$reps; i++ )); do echo "$text" done } repeat_text "hello" 3 ` + +**Что здесь происходит:** + +- С помощью ключевого слова local мы создали две локальные переменные — то есть переменные, существующие только внутри функции. +- В одну из них поместили текст, а во вторую — количество повторов. +- Затем создали цикл, который берёт текст из первой переменной и повторяет его столько раз, сколько раз указано во второй. +- Вызвали функцию, передав ей значения hello и 3 — то есть приказали повторить слово «hello» три раза. + +## **Ну здравствуй, Bash! Пишем первый скрипт** + +Настало время применить знания на практике — напишем скрипт для автоматической очистки кэша браузера и DNS. + +Состоять наш скрипт будет из трёх функций: первая — для очистки кэша браузера, вторая — для очистки кэша DNS, а в третью завернём небольшое меню для выбора нужного действия. + +Начинаем, как водится, с шебанга — специальной строки, которая говорит компьютеру, с помощью какой программы нужно запускать скрипт. Так как мы хотим использовать bash, которая лежит в папке /bin, шебанг будет выглядеть так: + +` #!/bin/bash ` + +Теперь напишем функцию, которая будет очищать браузерный кэш. В комментариях — разбор синтаксиса. + +` clear_browser_cache() { # Проверяем, какой браузер установлен на компьютере if command -v google-chrome >/dev/null 2>&1; then # Если установлен Google Chrome, очищаем кэш браузера google-chrome --user-data-dir=$(mktemp -d) --disable-extensions --disable-plugins --disable-geolocation --no-default-browser-check --no-first-run --noerrdialogs --disable-session-crashed-bubble --disable-infobars --disk-cache-size=0 --media-cache-size=0 # Далее проверяем, установлен ли Firefox elif command -v firefox >/dev/null 2>&1; then # Если установлен Firefox, очищаем кэш браузера firefox --new-instance --safe-mode # Если браузер не установлен, выводим сообщение об ошибке else echo "Error: no supported browser found" fi } ` + +Далее напишем функцию для очистки кэша DNS. + +` clear_dns_cache() { # Проверяем, какая операционная система установлена на компьютере # Если установлена Linux, очищаем кэш DNS if [[ "$OSTYPE" == "linux-gnu"* ]]; then sudo systemd-resolve --flush-caches # Если установлена macOS, очищаем кэш DNS elif [[ "$OSTYPE" == "darwin"* ]]; then sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder # Если операционная система не поддерживается, выводим сообщение об ошибке else echo "Error: unsupported operating system" fi } ` + +Ну а теперь дело за малым. Напишем небольшое меню, чтобы пользователь мог выбрать, кэш браузера или кэш DNS нужно очистить. + +` # Сначала выведем варианты clear_cache() { echo "Select cache to clear:" echo "1. Browser cache" echo "2. DNS cache" # Запросим у пользователя номер выбранного пункта меню read -p "Enter your choice: " choice # В зависимости от выбранного пункта меню вызываем соответствующую функцию для очистки кэша if [ "$choice" -eq 1 ]; then clear_browser_cache elif [ "$choice" -eq 2 ]; then clear_dns_cache else echo "Invalid choice" fi } ` + +Вуаля! Наш скрипт готов. Чтобы его запустить, нам нужно лишь вызвать функцию clear_cache: + +` clear_cache ` + +В теории можно сделать скрипт и ещё лучше — например, добавить больше браузеров, реализовать проверку прав администратора и другие фишки. Но на сегодня, пожалуй, достаточно. \ No newline at end of file diff --git "a/LINUX/BASH_script/15 \320\276\320\264\320\275\320\276\321\201\321\202\321\200\320\276\321\207\320\275\321\213\321\205 bash-\321\201\320\272\321\200\320\270\320\277\321\202\320\276\320\262.md" "b/LINUX/BASH_script/15 \320\276\320\264\320\275\320\276\321\201\321\202\321\200\320\276\321\207\320\275\321\213\321\205 bash-\321\201\320\272\321\200\320\270\320\277\321\202\320\276\320\262.md" new file mode 100644 index 0000000..555f4ff --- /dev/null +++ "b/LINUX/BASH_script/15 \320\276\320\264\320\275\320\276\321\201\321\202\321\200\320\276\321\207\320\275\321\213\321\205 bash-\321\201\320\272\321\200\320\270\320\277\321\202\320\276\320\262.md" @@ -0,0 +1,211 @@ +для упрощения рутинных задач + +1. Проверка использования +дискового пространства +Нехватка места на диске может привести к +сбою приложений. Эта команда выводит +список всех смонтированных разделов и +выделяет те, которые утилизированы на 80% +и более. +==`df -h | awk '$5+0 > 80 {print}' +- df -hотображает использование диска в +удобном для чтения формате. +- awk ‘$5+0 > 80 {print}’извлекает +строки, в которых утилизация превышает +80%. + +2. Поиск больших файлов, +которые занимают место +Определите 10 самых больших файлов в +системе. +==`find / -type f -exec du -h {} + | +sort -rh | head -10 +- find / -type fищет все файлы. +- du -hвычисляет размеры файлов в +удобном для чтения формате. +- sort -rhсортирует результаты по +убыванию. +- head -10ограничивает вывод 10 самыми +большими файлами. + +3. Отслеживание обновлений +лога в реальном времени +Просмотр файлов логов в режиме реального +времени, с фильтрацией сообщений об +ошибках. +==`tail -f /var/log/syslog | grep - +line-buffered "error" +- tail -fотслеживает файл журнала по +мере добавления новых записей. +- grep — line-buffered “error” +фильтрует строки, содержащие "error". + +4. Перезапуск службы в случае +сбоя +Проверка, что критически важная служба, +такая как Nginx, всегда запущена. +==`systemctl is-active - quiet nginx +|| systemctl restart nginx +- systemctl is-active — quiet +nginx проверяет состояние службы. +- Если она не запущена, systemctl +restart nginx перезапускает ее. + +5. Мониторинг использования +CPU в режиме реального +времени +Проверка загрузки CPU в реальном времени +для устранения неполадок с +производительностью. +==`top -b -n 1 | grep "Cpu(s)" +- top -b -n 1запускает «top» в пакетном +режиме для одной итерации. +- grep “Cpu(s)”извлекает сведения об +использовании CPU. + +6. Уничтожение самого +ресурсоемкого процесса +Поиск и завершение процесса, +потребляющего больше всего ресурсов CPU. +==`kill -9 $(ps -eo pid,%cpu - +sort=-%cpu | awk 'NR==2 {print +$1}') +- ps -eo pid,%cpu — sort=-%cpuвыводит +список процессов, отсортированных по +использованию CPU. +- awk ‘NR\==2 {print $1}’выбирает +процесс с наибольшим потреблением ЦП. +- kill -9принудительно завершает его. + +7. Получение публичного IP- +адреса +Быстрое получение публичного IP-адреса +сервера. +==`curl -s ifconfig.me +- Способ использует curl для запроса +текущего публичного IP-адреса из +«ifconfig.me». +- -s Подавляет ненужный вывод. + +8. Поиск всех открытых сетевых +портов +Перечисление всех активных +прослушиваемых портов на вашем +компьютере. +==`netstat -tulnp | grep LISTEN +- netstat -tulnpотображает открытые +порты и связанные с ними процессы. +- grep LISTENфильтрует результаты по +прослушиваемым портам. + +9. Копирование SSH-ключа на +удаленный сервер +Настройка беспарольной SSH- +аутентификации за секунды. +==`ssh-keygen -t rsa -b 2048 -q -N +"" && ssh-copy-id +user@remote_server +- ssh-keygen создает пару ключей RSA. +- ssh-copy-id передает открытый ключ на +удаленный сервер. + +10. Синхронизация файлов +между серверами +Использование rsync для зеркалирования +файлов с одного сервера на другой. +==`rsync -avz /local/path +user@remote:/remote/path +- -a сохраняет разрешения и временные +метки. +- -v включает подробный режим. +- -z сжимает данные для более быстрой +передачи. + +11. Планирование задач с +помощью Cron +Добавление задания cron для резервного +копирования файлов каждую ночь в 2 часа +ночи. +==`echo "0 2 * * * tar -czf / +backup.tar.gz /important/data" | +crontab - +- 0 2 * * *планирует задание на 2 часа +ночи ежедневно. +- tar -czfсжимает и создает резервную +копию "/important/data". + +12. Загрузка файла в фоновом +режиме +Использование «wget» для загрузки +больших файлов без блокировки терминала. +==`nohup wget -q https:// +example.com/bigfile.zip & +- nohup обеспечивает выполнение процесса +даже после выхода из системы. +- wget -q незаметно загружает файл. +- & запускает процесс в фоновом режиме. + +13. Поиск и удаление старых +файлов логов +Автоматическая очистка логов старше 7 +дней. +==`find /var/log -name "*.log" +-mtime +7 -exec rm -f {} \; +- -mtime +7выбирает файлы старше 7 дней. +- -exec rm -f {}удаляет их. + +14. Проверка открыт ли порт на +удаленном сервере +Проверка открыт ли определенный порт +(например, 443) на удаленном хосте. +==`nc -zv example.com 443 +- nc -zvпроверяет соединение без +отправки данных. +- Полезно для устранения неполадок +брандмауэра и подключения. + +15. Список всех запущенных +Docker-контейнеров +Удобный просмотр активных контейнеров +Docker. +==`docker ps - format "table {{.ID}} +\t {{.Image}} \t {{.Status}}" +- docker psвыводит список запущенных +контейнеров. +- — formatструктурирует вывод для лучшей +читабельности. + +========================= +Подборка полезных скриптов для опытных Linux-админов + +1) 🔍 Быстрый поиск крупных файлов (удобно перед очисткой диска) +du -ah / | sort -rh | head -n 30 + +2) 🛑 Массовое убийство зависших процессов по шаблону +pkill -f "pattern" + +3) 🧼 Очистка старых логов/кэша старше X дней +find /var/log -type f -mtime +7 -delete + +4) 🧬 Проверка файловой системы без остановки +fsck -n /dev/sdX + +5) 📦 Список пакетов, обновлённых за последние 5 дней +grep "upgrade" /var/log/dpkg.log | tail + +6) 🕵️ Слежение за открытыми портами в реальном времени +watch -n1 "ss -tulpn" + +7) 📊 Сбор top-нагружающих процессов по CPU за минуту +ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head + +8) 🔁 Авто-рестарт службы при падении +while true; do systemctl restart myservice; sleep 5; done + +9) 🔗 Быстрый тест сетевой задержки и MTU +tracepath google.com + +10) 🔐 Сканирование слабых SSH-ключей +ssh-audit -p 22 localhost + +Такие короткие утилитарные команды экономят кучу времени в рутине админа. \ No newline at end of file diff --git "a/LINUX/BASH_script/BASH. \320\240\320\260\320\267\320\275\320\276\320\265.md" "b/LINUX/BASH_script/BASH. \320\240\320\260\320\267\320\275\320\276\320\265.md" new file mode 100644 index 0000000..f76b28f --- /dev/null +++ "b/LINUX/BASH_script/BASH. \320\240\320\260\320\267\320\275\320\276\320\265.md" @@ -0,0 +1,40 @@ +_**Использование стандартных ключей**_ + +При написании bash-скриптов вы можете выбирать любые буквы для ключей командной строки и произвольно задавать реакцию скрипта на эти ключи. Однако, в мире Linux значения некоторых ключей стали чем-то вроде стандарта, которого полезно придерживаться. Вот список этих ключей: + +``` +-a Вывести все объекты. +-c Произвести подсчёт. +-d Указать директорию. +-e Развернуть объект. + +-f Указать файл, из которого нужно прочитать данные. +-h Вывести справку по команде. +-i Игнорировать регистр символов. +-l Выполнить полноформатный вывод данных. + +-n Использовать неинтерактивный (пакетный) режим. (ввод на той же строке) +-o Позволяет указать файл, в который нужно перенаправить вывод. +-p предотвращения чтения оболочкой файлов, контролируемых пользователем +-t 5 параметр ключа задаёт время ожидания ввода в секундах +-q Выполнить скрипт в quiet-режиме. +-r Обрабатывать папки и файлы рекурсивно. +-s Выполнить скрипт в silent-режиме. команды read предотвращает отображение на экране данных, вводимых с клавиатуры +-v Выполнить многословный вывод. +-x Исключить объект. +-y Ответить «yes» на все вопросы. + +$REPLY - специальная переменная среды в которую запоминается ввод + +``` + +```sh +# простое чтение данных из файла: + +#!/bin/bash +count=1 +cat myfile | while read line do +echo "Line $count: $line" count=$(( $count + 1 )) +done +echo "Finished" +``` diff --git "a/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 1.md" "b/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 1.md" new file mode 100644 index 0000000..abc45f8 --- /dev/null +++ "b/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 1.md" @@ -0,0 +1,221 @@ +## Введение + +BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов. + + +>`break` выход из цикла for, while или until +> `continue` выполнение следующей итерации цикла for, while или until +> `echo` вывод аргументов, разделенных пробелами, на стандартное устройство вывода +> `exit` выход из оболочки +> `export` отмечает аргументы как переменные для передачи в дочерние процессы в среде +> `hash` запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении +> `kill` посылает сигнал завершения процессу +> `pwd` выводит текущий рабочий каталог +> `read` читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\ +> `return` заставляет функцию оболочки выйти с указанным значением +> `shift` перемещает позиционные параметры налево +> `test` вычисляет условное выражение +> `times` выводит имя пользователя и системное время, использованное оболочкой и ее потомками +> `trap` указывает команды, которые должны выполняться при получении оболочкой сигнала +> `unset` вызывает уничтожение переменных оболочки +> `wait` ждет выхода из дочернего процесса и сообщает выходное состояние. + + +И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе + +## Что необходимо знать с самого начала + +1. Любой bash-скрипт должен начинаться со строки: + +> `#!/bin/bash` + +*в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав `whereis bash`) поменяйте её на ваш путь.* + +2. Коментарии начинаются с символа # (кроме первой строки). +3. В bash переменные не имеют типа(о них речь пойдет ниже) + +## Переменные и параметры скрипта + +Приведу как пример небольшой пример, который мы разберем: + +> `#!/bin/bash` #указываем где у нас хранится bash-интерпретатор +> \#присваиваем переменной parametr1 значение первого параметра скрипта +> `parametr1=$1` +> \#присваиваем переменной script_name значение имени скрипта +> `script_name=$0` +> \# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. +> `echo "Вы запустили скрипт с именем $script_name и параметром $parametr1"` +> \# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. +> `echo 'Вы запустили скрипт с именем $script_name и параметром $parametr1'` +> \#Выход с кодом 0 (удачное завершение работы скрипта) +> `exit 0` + + +Результат выполнения скрипта: + +> `ite@ite-desktop:~$ ./test.sh qwerty` +> Вы запустили скрипт с именем ./test.sh и параметром qwerty +> Вы запустили скрипт с именем $script_name и параметром $parametr1 + + +После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными: + +> `$DIRSTACK` - содержимое вершины стека каталогов +> `$EDITOR` - текстовый редактор по умолчанию +> `$EUID` - Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как... +> `$UID` - ...содержит реальный идентификатор, который устанавливается только при логине. +> `$FUNCNAME` - имя текущей функции в скрипте. +> `$GROUPS` - массив групп к которым принадлежит текущий пользователь +> `$HOME` - домашний каталог пользователя +> `$HOSTNAME` - ваш hostname +> `$HOSTTYPE` - архитектура машины. +> `$LC_CTYPE` - внутренняя переменная, котороя определяет кодировку символов +> `$OLDPWD` - прежний рабочий каталог +> `$OSTYPE` - тип ОС +> `$PATH` - путь поиска программ +> `$PPID` - идентификатор родительского процесса +> `$SECONDS` - время работы скрипта(в сек.) +> `$#` - общее количество параметров переданных скрипту +> `$*` - все аргументы переданыне скрипту(выводятся в строку) +> `$@` - тоже самое, что и предыдущий, но параметры выводятся в столбик +> `$!` - PID последнего запущенного в фоне процесса +> `$$` - PID самого скрипта + +> IFS=$'\n' - переназначение переменной среды на 'только перевод строки' +> IFS=: - переназначение переменной среды на ' : ' + +## Условия + +Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере): + + +> `#!/bin/bash` +> \#в переменную source засовываем первый параметр скрипта +> `source=$1` +> \#в переменную dest засовываем второй параметр скрипта +> `dest=$2` +> +> \# в ковычках указываем имена переменных для сравнения. -eq - логическое сравнение обозначающие "равны" +> `if [[ "$source" -eq "$dest" ]]` +> \# если они действительно равны, то +> `then` +> \#выводим сообщение об ошибке, т.к. $source и $dest у нас равны +> `echo "Применик $dest и источник $source один и тот же файл!"` +> \# выходим с ошибкой (1 - код ошибки) +> `exit 1` +> \# если же они не равны +> `else` +> \# то выполняем команду cp: копируем источник в приемник +> `cp $source $dest` +> `echo "Удачное копирование!"` +> `fi` #обозначаем окончание условия. + + +Результат выполнения скрипта: + + +> `ite@ite-desktop:~$ ./primer2.sh 1 1` +> Применик 1 и источник 1 один и тот же файл! + +> `ite@ite-desktop:~$ ./primer2.sh 1 2` +> Удачное копирование! + +Структура `if-then-else` используется следующим образом: + +> `if` <команда или набор команд возвращающих код возврата(0 или 1)> +> `then` +> <если выражение после if истино, то выполняется этот блок> +> `else` +> <если выражение после if ложно, тот этот> + + +В качестве команд возвращающих код возврата могут выступать структуры `[[ , [ , test, (( ))` или любая другая(или несколько) linux-команда. + + +> `test` - используется для логического сравнения. после выражения, неоьбходима закрывающая скобка "]" +>`[` - синоним команды test +>`[[` - расширенная версия "[" (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку "]]" +>`(( ))` - математическое сравнение. + + +для построения многоярусных условий вида: + +> `if ...` +>`then ....` +>`else` +>`if ....` +>`then....` +>`else ....` + +для краткости и читаемости кода, можно использовать структуру: + +> `if ..` +> `then ...` +> `elif ...` +> `then ...` +> `elif ...` + + +## Условия. Множественный выбор + +Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case. + +> `#!/bin/bash` +> `echo "Выберите редатор для запуска:"` +> `echo "1 Запуск программы nano"` +> `echo "2 Запуск программы vi"` +> `echo "3 Запуск программы emacs"` +> `echo "4 Выход"` +\#здесь мы читаем в переменную $doing со стандартного ввода +> `read doing` +> +> `case $doing in` +> `1)` +> `/usr/bin/nano` # если $doing содержит 1, то запустить nano +> `;;` +> `2)` +> `/usr/bin/vi` # если $doing содержит 2, то запустить vi +> `;;` +> `3)` +> `/usr/bin/emacs` # если $doing содержит 3, то запустить emacs +> `;;` +> `4)` +> `exit 0` +> `;;` +> `*)` #если введено с клавиатуры то, что в case не описывается, выполнять следующее: +> `echo "Введено неправильное действие"` +> +> `esac` #окончание оператора case. + +Результат работы: + +> `ite@ite-desktop:~$ ./menu2.sh` +> Выберите редатор для запуска: +> 1 Запуск программы nano +> 2 Запуск программы vi +> 3 Запуск программы emacs +> 4 Выход + +После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы :) ) + + +Прведу список логических операторв, которые используются для конструкции if-then-else-fi: + +> `-z` # строка пуста +> `-n` # строка не пуста +> `=, (==)` # строки равны +> `!=` # строки неравны +> +> `-eq` # равно +> `-ne` # неравно +> `-lt,(< )` # меньше +> `-le,(<=)` # меньше или равно +> `-gt,(>)` # больше +> `-ge,(>=)` # больше или равно +> `!` # отрицание логического выражения +> +> `-a,(&&)` # логическое «И» +> `-o,(||)` # логическое «ИЛИ» + + +С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций. diff --git "a/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 2.md" "b/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 2.md" new file mode 100644 index 0000000..dea8c45 --- /dev/null +++ "b/LINUX/BASH_script/BASH. \320\247\320\260\321\201\321\202\321\214 2.md" @@ -0,0 +1,223 @@ +## Циклы. Цикл for-in. + +Оператор `for-in` предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной. +Синтаксис следующий: + +``` +for переменная in список_значений +do +команды +done +``` + +Рассмотрим небольшой пример: + +``` +#!/bin/bash +for i in 0 1 2 3 4 #переменной $i будем поочередно присваивать значения от 0 до 4 включительно +do +echo "Console number is $i" >> /dev/pts/$i #Пишем в файл /dev/pts/$i(файл виртуального терминала) строку "Console number is $i" +done #цикл окончен +exit 0 +``` + +После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную `$i` поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной + +## Циклы. Цикл while. + +Цикл `while` сложнее цикла `for-in` и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). +Синтаксис оператора следующий: + +``` +while выражение или команда возвращающая код возврата +do +команды +done +``` + +Пример работы цикла рассмотрим на следующем примере: + +``` +#!/bin/bash +again=yes #присваиваем значение "yes" переменной again +while [ "$again" = "yes" ] #Будем выполнять цикл, пока $again будет равно "yes" +do +echo "Please enter a name:" +read name +echo "The name you entered is $name" + +echo "Do you wish to continue?" +read again +done +echo "Bye-Bye" +``` + + +А теперь результат работы скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer1.sh +Please enter a name: +ite +The name you entered is ite +Do you wish to continue? +yes +Please enter a name: +mihail +The name you entered is mihail +Do you wish to continue? +no +Bye-Bye +``` + +Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между `do` и `done` можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл. + +Теперь об условии истинности. После `while`, как и в условном операторе `if-then-else` можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор `[` аналог команды `test`, которая проверяет истинность условия, которое ей передали. + +Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов **UNTIL-DO**. Эта практически полный аналог цикла **WHILE-DO**, только выполняется пока какое-то выражение ложно. +Вот пример: +``` +#!/bin/bash +echo "Введите числитель: " +read dividend +echo "Введите знаменатель: " +read divisor + +dnd=$dividend #мы будем изменять переменные dividend и divisor, +#сохраним их знания в других переменных, т.к. они нам +#понадобятся +dvs=$divisor +remainder=1 + +until [ "$remainder" -eq 0 ] +do +let "remainder = dividend % divisor" +dividend=$divisor +divisor=$remainder +done + +echo "НОД чисел $dnd и $dvs = $dividend" +``` + +Результат выполнения скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer3.sh +Введите числитель: +100 +Введите знаменатель: +90 +НОД чисел 100 и 90 = 10 +``` + +## Математические операции + +Команда `let`. +Команда `let` производит арифметические операции над числами и переменными. +Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами: + +``` +#!/bin/bash +echo "Введите a: " +read a +echo "Введите b: " +read b + +let "c = a + b" #сложение +echo "a+b= $c" +let "c = a / b" #деление +echo "a/b= $c" +let "c <<= 2" #сдвигает c на 2 разряда влево +echo "c после сдвига на 2 разряда: $c" +let "c = a % b" # находит остаток от деления a на b +echo "$a / $b. остаток: $c " +``` + +Результат выполнения: +``` +ite@ite-desktop:~$ ./bash2_primer2.sh +Введите a: +123 +Введите b: +12 +a+b= 135 +a/b= 10 +c после сдвига на 2 разряда: 40 +123 / 12. остаток: 3 +``` + + +Ну вот, как видите ничего сложного, список математических операций стандартный: + +> `+` — сложение +> `—` — вычитание +> `*` — умножение +> `/` — деление +> `**` — возведение в степень +> `%` — модуль(деление по модулю), остаток от деления +> `let` позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: `a = a+b` эквивалентно `a +=b` и т.д + +## Работа с внешними программами при написании shell-скриптов + +Для начала немного полезной теории. +### Перенаправление потоков. + +В **bash** (как и многих других оболочках) есть встроенные файловые дескрипторы: `0 (stdin)`, `1 (stdout)`, `2 (stderr)`. +`stdout` — Стандартный вывод. Сюда попадает все что выводят программы +`stdin` — Стандартный ввод. Это все что набирает юзер в консоли +`stderr` — Стандартный вывод ошибок. +Для операций с этими дескрипторами, существуют специальные символы: `>` (перенаправление вывода), `<` (перенаправление ввода). Оперировать ими не сложно. Например: + +``` +cat /dev/random > /dev/null #перенаправить вывод команды cat /dev/random в /dev/null (абсолютно бесполезная операция :)) ) +``` +или + +``` +ls -la > listing #записать в файл listing содержание текущего каталога (уже полезней) +``` + +Если есть необходимость дописывать в файл(при использовании "`>`" он заменятеся), необходимо вместо "`>`" использовать "`>>`" +``` +sudo < my_password +``` +после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры. +Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать: +``` +./program_with_error 2> error_file +``` +цифра 2 перед "`>`" означает что нужно перенаправлять все что попадет в дескриптор 2(stderr). +Если необходимо заставить `stderr` писать в `stdout`, то это можно след. образом: +``` +./program_with_error 2>&1 +``` +символ "`&`" означает указатель на дескриптор `1(stdout)` +(Поумолчанию `stderr` пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)). + +### 2. Конвееры. + +Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой: +`команда1 | команда 2` — означает, что вывод команды 1 передастся на ввод команде 2 +Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например: +``` +ls -la | grep «hash» |sort > sortilg_list +``` +вывод команды `ls -la` передается команде `grep`, которая отбирает все строки, в которых встретится слово *hash*, и передает команде сортировке `sort`, которая пишет результат в файл *sorting_list*. Все довольно понятно и просто. + +Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке `stdout` одной команды и передача на `stdin` другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты. + +### 1. Передача вывода в переменную. + +Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в ` `` ` ковычки, например +> a = \` echo "qwerty" \` +> echo $a + +Результат работы: qwerty + +Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример: +``` +LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` +for ONE_OF_LIST in $LIST +do +svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST +done +``` +Здесь мы используем цикл `for-do-done` для архивирование всех директорий в папке */svn/* с помощью команды `svnadmin hotcopy`(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу. \ No newline at end of file diff --git "a/LINUX/BASH_script/\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\277\320\270\321\201\320\272\320\260 \320\277\320\260\320\272\320\265\321\202\320\276\320\262 \320\270 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\271.md" "b/LINUX/BASH_script/\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\277\320\270\321\201\320\272\320\260 \320\277\320\260\320\272\320\265\321\202\320\276\320\262 \320\270 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\271.md" new file mode 100644 index 0000000..bfa1302 --- /dev/null +++ "b/LINUX/BASH_script/\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\277\320\270\321\201\320\272\320\260 \320\277\320\260\320\272\320\265\321\202\320\276\320\262 \320\270 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\271.md" @@ -0,0 +1,24 @@ +```sh +#!/bin/bash + +# Обновление списка пакетов и установка обновлений +echo "----------------------------" +echo "Обновление системы." +echo "----------------------------" +sudo apt-get update +sudo apt-get upgrade -y + +# Автоматическое удаление ненужных пакетов и очистка кэша +echo "----------------------------" +echo "Очистка системы." +echo "----------------------------" +sudo apt-get autoremove -y +sudo apt-get autoclean -y +sudo apt-get clean + +# Вывод сообщения о завершении +echo "----------------------------" +echo "Система обновлена и очищена." +echo "----------------------------" +``` + diff --git "a/LINUX/BASH_script/\320\241\320\272\321\200\320\270\320\277\321\202\321\213 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\276\320\262.md" "b/LINUX/BASH_script/\320\241\320\272\321\200\320\270\320\277\321\202\321\213 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\276\320\262.md" new file mode 100644 index 0000000..ec58a6a --- /dev/null +++ "b/LINUX/BASH_script/\320\241\320\272\321\200\320\270\320\277\321\202\321\213 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\276\320\262.md" @@ -0,0 +1 @@ +![[СкриптыДляАдмина.jpg]] \ No newline at end of file diff --git a/LINUX/BAT.md b/LINUX/BAT.md new file mode 100644 index 0000000..99adb16 --- /dev/null +++ b/LINUX/BAT.md @@ -0,0 +1,21 @@ +```sh +brew install bat + +sudo apt install bat + +#-------------------- + +bat +bat -p # открывает без строк нумерации +bat -H 14:17 # подсветка строк 14:17 + +# bat проинтегрирован с GIT: +bat -d # показать только изменения (diff) + +bat --list-themes # темы bat + +bat --themes dark # установить(открыть файл) с темой + + +``` + diff --git a/LINUX/BEGIN.md b/LINUX/BEGIN.md new file mode 100644 index 0000000..d5b7615 --- /dev/null +++ b/LINUX/BEGIN.md @@ -0,0 +1,218 @@ +/boot - 500Mb - ext2 +/ 20Gb - ext4 +swap = озу +/home - остальное + +```sh +# Изменение текстового редактора по умолчанию: +sudo update-alternatives --config editor +``` + +```bash +sudo apt update && sudo apt upgrade -y +sudo apt install mc ranger nload tmux wireguard samba gpg pass smartmontools lm-sensors + +# Диски: +mkdir 1Tb-a 1Tb-temp 2Tb-a 2Tb-b +sudo blkid +lsblk +# редактируем /etc/fstab, монтируем диски и RAID по UUID: +sudo mount -a +sudo systemctl daemon-reload + +# Samba: + + + + + + +sudo apt-get install -f +# Эта команда подтянет нужные пакеты и переустановит проблемный. + + +# Какая версия установлена: +lsb_release -a +``` + +## КОНСОЛЬ клавиши## +```sh +Ctrl-a - перейти в начало +Ctrl-e - перейти в конец + +Ctrl-w - вырезать слово перед курсором +Ctrl-k - вырезать от курсора и до конца строки +Ctrl-u - вырезать от курсора и назад до начала строки +Ctrl-y - вставить вырезанное +Ctrl- <- (Alt- ) +Ctrl- -> (Alt- ) + +Ctrl-u - очищает слева от курсора +Ctrl-k - очищает справа от курсора +Ctrl-r - поиск по истории команд + +history - список всех введенных команд + +reset - исправить вывод + +mkdir 123/name/345 -p - создать папку с полным путем + +cat /var/log/syslog | grep ssh +``` +## Файловая система SWAP ( файл подкачки ) ## +```sh +# Создание swap-пространство на разделе hda3 +mkswap /dev/hda3 + +# Включить swap-пространство, расположенное на разделе hda3 +swapon /dev/hda3 + +# Активировать swap-пространства, расположенные на разделах hda2 и hdb3 +swapon /dev/hda2 /dev/hdb3 +``` +## TERMINAL ## +```bash +# добавить сторонний репозиторий: +sudo add-apt-repository ppa:name_rep/ppa + +# Обновление информации о пакетах и обновление самих пакетов +sudo apt update && sudo apt upgrade -y + +# Установка пакетов +sudo apt install -y htop curl wget build-essential git openssh-server +sudo apt install nload git tmux vim mc wireguard gpg pass + +# Редактор по умолчанию: +update-alternatives --config editor + +# Печатаем сразу в файл +echo «Hello World !» > /tmp/file.txt + + +cat /etc/*-release +whoami +whatis +whereis + +# - выводит файл в консоль +cat (-n) + +# - выводит текст задом на перед +tac + +# - поиск в тексте +grep <какой> file.txt + +# найти и вывести все что начинается с '#': +sudo grep -v ^#/etc/ssh/sshd_config + +# + убрать все пустые строки в выводе: +sudo grep -v ^#/etc/ssh/sshd_config | grep -v ^$ + +# + посчитать кол-во строк в выводе: +sudo grep -v ^#/etc/ssh/sshd_config | grep -v ^$ | wc -l + +# посчитать общее кол-во строк в файле: +sudo wc -l /etc/ssh/sshd_config + +# - если текст длинный и перемещаемся кнопками вверх и вниз если нажать "/" то откроется строка для поиска в этом файле "n" - перемещаемся в поиске вперед и "ctrl+n" - назад "q" - выход +less + +# - последние или первые 10 строк файла `"-f"` онлайн просмотр +tail / head + +# - создание каталога с путем +mkdir -p + +# - переместить/переименовать +mv + +# - просмотр сразу 2 каталогов +ls dir1 dir2 + +# - копирование `-r` - копируем каталог +cp + +# - удаление каталога +rm -r +``` +## GROUP ## +```sh +groupadd # — не выводит ничего при создании группы; лучше при использовании в скрипте, так как нет лишнего вывода на терминал + +addgroup # — выводит создаваемый  при создании группы. +--gid 5555 # - можно задать при создании + +groupdel +delgroup + +# Чтобы пользователю добавить дополнительную группу можно воспользоваться командой  +usermod -aG +-a #— добавляет к текущим группам пользователя дополнительные. Без этой опции группы заменяются на новые, а с этой опцией к старым группам добавляются новые; +-G #— указывает, что работать будем с дополнительными группами а не с первичной. +#(`usermod -aG testgroup alex`) +# Утилитой  нельзя удалять дополнительные группы, можно только не используя опцию **-a**, написать список групп в которые должен будет входить данный пользователь, не указав ту группу, из которой вы хотите удалить пользователя. + +# Если мы хотим поменять пользователю первичную группу, то нужно использовать опцию -g: +usermod -g testgroup alex + +id alex +# uid=1000(alex) gid=1002(testgroup) группы=1002(testgroup),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev)` + +# И вернем все как было: +usermod -g alex alex + +# Еще один способ добавить пользователя в дополнительную группу (и наверное более запоминающийся) это использовать утилиту adduser, при этом утилите вначале передается имя пользователя, затем группы: +adduser alex testgroup + +# Удалить пользователя из группы можно командой deluser: +deluser alex testgroup + +# И так, для добавления или удаления пользователя в дополнительную группу я бы рекомендовал использовать команды adduser и deluser. А для изменения первичной группы команду usermod -g. +``` +## PASSWD ## +```sh +passwd - изменить пароль текущему пользователю + +/etc/passwd +/etc/group +/etc/shadow + +# В passwd хранится информация о пользователях в системе, вот информация о пользователе alex: +grep alex /etc/passwd + +alex:x:1000:1000:Alexandr,,,:/home/alex:/bin/bash + +# То что после имени идет буква «x» означает что пароль зашифрован в файле shadow. + +# В /etc/group хранится информация о группах в системе, вот информация о группе alex и о дополнительных группах пользователя alex: +grep alex /etc/group + +cdrom:x:24:alex +floppy:x:25:alex +audio:x:29:alex +dip:x:30:alex +video:x:44:alex +plugdev:x:46:alex +netdev:x:109:alex +alex:x:1000: + +# Здесь вначале идет имя группы, потом символ «x» обозначает что пароль зашифрован, затем gid, затем пользователи Linux для которых эта группа является дополнительной. Таким образом группа alex имеет gid=1000, а пользователь alex входит в дополнительные группы cdrom, floppy и так далее. + +# В /etc/shadow хранятся соленые хэши паролей пользователей, вот например строка для alex: +grep alex /etc/shadow + +alex:$y$j9T$STsC82fbWIlhONPF0rXcm1$a.c./bIw7BUBiewrYoKnEBGBAH3Z5UGsWCFQsW3HOR8:19006:0:99999:7::: + +# Строка файла содержит поля разделённые двоеточиями, в полях находится следующая информация: + +- имя пользователя; +- хеш пароля; +- дата последней смены пароля в днях начиная с 1 января 1970 года, чем больше число, тем новее пароль; +- минимальный срок действия пароля, если 0 то неограничен; +- максимальный срок действия пароля; +- период предупреждения о необходимости сменить пароль; +- период неактивности пароля — у меня пустое поле, период неактивности отсутствует; +- дата истечения срока действия учётной записи — у меня пустое поле, учётная запись никогда не устаревает; +- зарезервированное поле для использования в будущем. +``` diff --git a/LINUX/BorgBackup.md b/LINUX/BorgBackup.md new file mode 100644 index 0000000..d737616 --- /dev/null +++ b/LINUX/BorgBackup.md @@ -0,0 +1,32 @@ +**BorgBackup: безопасные и эффективные бэкапы в Linux** + +**BorgBackup** — это инструмент для создания зашифрованных, сжатых и дедуплицированных резервных копий. Он идеально подходит как для серверов, так и для персональных машин. В этом гайде разберёмся, как его установить, настроить и использовать. + +1️⃣ **Установка BorgBackup** +В большинстве дистрибутивов Borg доступен в официальных репозиториях. +`sudo apt install borgbackup + +2️⃣ **Инициализация репозитория** +Перед созданием бэкапов необходимо инициализировать репозиторий. Это место, где будут храниться резервные копии. +`borg init --encryption=repokey /mnt/backup + +🟢 --encryption=repokey включает шифрование (ключ хранится в репозитории). +🟢 Можно использовать --encryption=none, если защита не нужна. + +3️⃣ **Создание бэкапа** +Допустим, нам нужно сделать резервную копию директорий Documents и Pictures: +`borg create --progress /mnt/backup::backup-$(date +%F) ~/Documents ~/Pictures + +🟢 /mnt/backup — путь к репозиторию. +🟢 backup-$(date +%F) — имя бэкапа с датой. +🟢 ~/Documents ~/Pictures — папки, которые сохраняем. +🟢 --progress — показывает прогресс выполнения. + +4️⃣ **Проверка и восстановление данных** +Посмотреть список всех бэкапов: +`borg list /mnt/backup + +Извлечь конкретный бэкап (например, backup-2025-01-28): +`borg extract /mnt/backup::backup-2025-01-28 --progress + +🔜 Если хотите автоматизировать создание бэкапов, можно добавить cron-задачу. \ No newline at end of file diff --git a/LINUX/CAL.md b/LINUX/CAL.md new file mode 100644 index 0000000..0d2995f --- /dev/null +++ b/LINUX/CAL.md @@ -0,0 +1,9 @@ +```sh +sudo apt install ncal +cal # отображает календарь в терминале.  + +cal # показывает текущий месяц, +cal 2025 # показывает календарь на 2025 год. + +# Идеально подходит для быстрого поиска дат! +``` diff --git a/LINUX/CERTBOT.md b/LINUX/CERTBOT.md new file mode 100644 index 0000000..c8b1b45 --- /dev/null +++ b/LINUX/CERTBOT.md @@ -0,0 +1,123 @@ +# [Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04](https://www.8host.com/blog/sozdanie-sertifikata-lets-encrypt-dlya-nginx-v-ubuntu-20-04/ "Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04") + +4 августа, 2020 12:20 + +Let’s Encrypt – это центр сертификации (ЦС, или Certificate Authority, CA), который предоставляет простой способ создания бесплатных сертификатов TLS/SSL, тем самым позволяя шифровать HTTPS на веб-серверах. Этот ЦС упрощает процесс создания сертификатов путём автоматизации большинства необходимых действий при помощи клиентского ПО. Процесс получения и установки сертификата полностью автоматизирован на веб-серверах Apache и Nginx. + +Данный мануал расскажет, как получить SSL-сертификат для Nginx в системе Ubuntu 20.04 с помощью Certbot и как обновлять этот сертификат. + +В мануале используется отдельный виртуальный хост Nginx, а не хост по умолчанию. Рекомендуем вам создать такой хост для каждого домена, чтобы избежать общих ошибок и иметь возможность использовать стандартные конфигурации в случае сбоя. + +### Требования + +- Сервер Ubuntu 20.04, настроенный по [этому мануалу](https://www.8host.com/blog/nachalnaya-nastrojka-servera-ubuntu-20-04/). +- Доменное имя, которое можно использовать в сертификате (в руководстве используется условный домен example.com). +- Записи А, связывающие домены example.com и www.example.com с внешним IP-адресом сервера. Они необходимы для того, чтобы Let’s Encrypt мог проверить доменное имя +- Установленный сервер Nginx и блок server для вашего домена (согласно [этому мануалу](https://www.8host.com/blog/ustanovka-nginx-v-ubuntu-20-04/)). Здесь в качестве примера используется хост /etc/nginx/sites-available/example.com. + +## 1: Установка Certbot + +Для начала нужно установить клиент Certbot на ваш сервер. + +Чтобы установить пакет certbot и плагин для Nginx с помощью стандартного пакетного менеджера, введите команду: + +`sudo apt install certbot python3-certbot-nginx` + +Теперь Certbot готов к работе, но для того, чтобы настроить SSL для Nginx, нужно проверить некоторые конфигурации. + +## 2: Проверка параметров Nginx + +Certbot должен иметь возможность найти целевой виртуальный хост (блок server) в конфигурации Nginx, чтобы автоматически настроить сертификат SSL. Для этого Certbot ищет директиву server_name – в ней указан домен, для которого предназначен запрашиваемый сертификат. + +Если вы следовали разделу по установке виртуального хоста в [мануале по установке Nginx](https://www.8host.com/blog/ustanovka-nginx-v-ubuntu-20-04/), у вас должен быть виртуальный хост для домена в ==`/etc/nginx/sites-available/example.com`==, а директива server_name в нем уже настроена соответствующим образом. + +Чтобы проверить это, откройте файл виртуального хоста, используя nano или другой текстовый редактор: + +`sudo nano /etc/nginx/sites-available/example.com` + +Найдите строку server_name: + +`... server_name example.com www.example.com; ...` + +Если она выглядит так, можете закрыть редактор. Если нет, вам нужно обновить ее. Укажите в ней свой домен, а затем сохраните и закройте файл. После этого нужно проверить синтаксис конфигурации. + +`sudo nginx -t` + +Если команда сообщила об ошибке, вам нужно снова открыть файл и исправить ее. После этого повторите проверку. + +Если ошибок в конфигурации нет, перезапустите веб-сервер. + +`sudo systemctl reload nginx` + +Теперь Certbot сможет найти правильный блок server и автоматически обновить его. + +## 3: Настройка брандмауэра + +Если во время настройки сервера вы включили брандмауэр ufw, вам нужно настроить его для поддержки соединений HTTPS. + +Во время установки Nginx регистрирует в ufw несколько профилей. Просмотреть текущие настройки можно с помощью команды: + +`sudo ufw status` + +Скорее всего, брандмауэр пока что поддерживает только трафик HTTP: + +`Status: active +To                         Action      From +--                         ------      ---- +OpenSSH                    ALLOW       Anywhere +Nginx HTTP                 ALLOW       Anywhere +OpenSSH (v6)               ALLOW       Anywhere (v6) +Nginx HTTP (v6)            ALLOW       Anywhere (v6)` + +Чтобы разблокировать трафик HTTPS, активируйте профиль Nginx Full и удалите профиль Nginx. + +`sudo ufw allow 'Nginx Full' sudo ufw delete allow 'Nginx HTTP'` + +Теперь параметры брандмауэра будут выглядеть так: + +`sudo ufw status +Status: active +To                         Action      From +--                         ------      ---- +OpenSSH                    ALLOW       Anywhere +Nginx Full                 ALLOW       Anywhere +OpenSSH (v6)               ALLOW       Anywhere (v6) +Nginx Full (v6)            ALLOW       Anywhere (v6)` + +Теперь пора запустить Certbot и получить сертификаты. + +## 4: Получение SSL-сертификата + +Certbot предлагает различные способы получения сертификатов SSL через плагины. Плагин Nginx позаботится о реконфигурации веб-сервера и при необходимости перезагрузит его. Чтобы использовать этот плагин, введите: + +`sudo certbot --nginx -d example.com -d www.example.com` + +Эта команда запустит certbot с плагином — nginx, а флаг –d определит имена, для которых предназначен сертификат. + +Если вы запускаете certbot впервые, вам будет предложено ввести адрес электронной почты и принять условия обслуживания. После этого certbot свяжется с сервером Let’s Encrypt, а затем отправит запрос, чтобы убедиться, что вы контролируете домен, для которого запрашиваете сертификат. + +Если проверка пройдет успешно, certbot спросит, как вы хотите настроить HTTPS: + +`Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):` + +Сделайте свой выбор, затем нажмите Enter. Конфигурация будет обновлена, и Nginx перезагрузится, чтобы использовать новые настройки. Клиент certbot выведет сообщение о том, что процесс был выполнен успешно и скажет, где хранятся ваши сертификаты: + +`IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate Donating to EFF:                    https://eff.org/donate-le` + +Сертификаты будут загружены и установлены. Попробуйте перезагрузить свой сайт, указав https://, и обратите внимание на индикатор безопасности в браузере. Он должен указывать, что сайт надежно защищен (как правило, для этого используется зеленый замочек в адресной строке). Если вы протестируете свой сервер с помощью [SSL Labs Server Test](https://www.ssllabs.com/ssltest/), он получит оценку A. + +Теперь давайте протестируем процесс обновления сертификата. + +## 5: Проверка автоматического обновления сертификата + +Сертификаты Let’s Encrypt действительны только в течение девяноста дней. Потому пользователи должны автоматизировать процесс продления сертификата. Установленный вами пакет certbot позаботится об этом с помощью таймера systemd. Он запускается два раза в день и автоматически обновляет сертификат, срок действия которого истекает через тридцать дней. + +Чтобы проверить статус таймера, введите: + +`sudo systemctl status certbot.timer certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service` + +Чтобы протестировать процесс обновления сертификата, запустите сухой прогон: + +`sudo certbot renew --dry-run` + +Если вы не видите ошибок, все настроено правильно. При необходимости Certbot обновит ваши сертификаты и перезагрузит Nginx, чтобы активировать изменения. Если процесс автоматического обновления не срабатывает, Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты, предупредив вас о завершении срока действия вашего сертификата. \ No newline at end of file diff --git a/LINUX/CHMOD, CHOWN.md b/LINUX/CHMOD, CHOWN.md new file mode 100644 index 0000000..97a50b8 --- /dev/null +++ b/LINUX/CHMOD, CHOWN.md @@ -0,0 +1,79 @@ +## CHMOD ## +```sh +chmod опции права /путь/к/файлу + +# Сначала рассмотрим какими бывают права доступа linux и как они устанавливаются. Пред этим рекомендую прочитать статью про права, ссылка на которую есть выше. Есть три основных вида прав: + +- r - чтение; +- w - запись; +- x - выполнение; +- s - выполнение  от имени суперпользователя (дополнительный); + +# Также есть три категории пользователей, для которых вы можете установить эти права на файл linux: + +- u - владелец файла; +- g - группа файла; +- o - все остальные пользователи; + +# Синтаксис настройки прав такой: +# Группа_пользователейДействиеВид_прав + +"+" - включить или  +"-" - отключить. + +- u+x - разрешить выполнение для владельца; +- ugo+x - разрешить выполнение для всех; +- ug+w - разрешить запись для владельца и группы; +- o-x - запретить выполнение для остальных пользователей; +- ugo+rwx - разрешить все для всех; + +# Но права можно записывать не только таким способом. Есть еще восьмеричный формат записи, он более сложен для понимания, но пишется короче и проще. Я не буду рассказывать как считать эти цифры, просто запомните какая цифра за что отвечает, так проще: + +# rwx = 7 | x=1 w=2 r=4 + +- 0 - никаких прав; +- 1 - только выполнение; +- 2 - только запись; +- 3 - выполнение и запись; +- 4 -  только чтение; +- 5 - чтение и выполнение; +- 6 - чтение и запись; +- 7 - чтение запись и выполнение. + +# Права на папку linux такие же, как и для файла. Во время установки прав сначала укажите цифру прав для владельца, затем для группы, а потом для остальных. Например, : + +- 744 - разрешить все для владельца, а остальным только чтение; +- 755 - все для владельца, остальным только чтение и выполнение; +- 764 - все для владельца, чтение и запись для группы, и только чтение для остальных; +- 777 - всем разрешено все. + +Каждая из цифр не зависит от предыдущих, вы вбираете именно то, что вам нужно. Теперь давайте рассмотрим несколько опций команды, которые нам понадобятся во время работы: + +-c - выводить информацию обо всех изменениях; +-f - не выводить сообщения об ошибках; +-v - выводить максимум информации; +--preserve-root - не выполнять рекурсивные операции для корня "/"; +--reference - взять маску прав из указанного файла; +-R - включить поддержку рекурсии; +--version - вывести версию утилиты; +``` + +## CHOWN ## +```sh +chown пользователь:группа опции /путь/к/файлу + +# В поле пользователь надо указать пользователя, которому мы хотим передать файл. Также можно указать через двоеточие группу, например, пользователь:группа. Тогда изменится не только пользователь, но и группа. Вот основные опции, которые могут вам понадобиться: + +-c, --changes - подробный вывод всех выполняемых изменений; +-f, --silent, --quiet - минимум информации, скрыть сообщения об ошибках; +--dereference - изменять права для файла к которому ведет символическая ссылка вместо самой ссылки (поведение по умолчанию); +-h, --no-dereference - изменять права символических ссылок и не трогать файлы, к которым они ведут; +--from - изменять пользователя только для тех файлов, владельцем которых является указанный пользователь и группа; +-R, --recursive - рекурсивная обработка всех подкаталогов; +-H - если передана символическая ссылка на директорию - перейти по ней; +-L - переходить по всем символическим ссылкам на директории; +-P - не переходить по символическим ссылкам на директории (по умолчанию). +``` + + +![[2024-09-05 01.32.11.jpg]] \ No newline at end of file diff --git a/LINUX/CIFS.md b/LINUX/CIFS.md new file mode 100644 index 0000000..163bff7 --- /dev/null +++ b/LINUX/CIFS.md @@ -0,0 +1,189 @@ +```sh +sudo apt install cifs-utils -y + +# Монтирование ресурса выглядит так: +mount.cifs {ресурс} {путь к директории в которую монтируем } + +# Автоматическое монтирование директории происходит с использованием файла fstab. Для начала создадим дополнительный файл с учетными данными пользователя для авторизации. Оправданно будет создать этот файл в директории root. +sudo vim /root/.smbselus + +# вносим в файл: +username = vlapa +password = uspass + +sudo vim /etc/fstab + +# добавляем: +//10.10.10.2/что_монтируем /куда_монтирем cifs user,rw,crdentials=/root/.smbselus 0 0 + +# ======= +cifs user 一 разрешает монтировать любому пользователю; +rw 一 предоставляет права на чтение и запись; +credentials=/root/.smbselus 一 файл с учетными данными пользователя; +_0_ используется утилитой dump 0 一 выключен; +_0_ используется утилитой fsck 0 一 выключен. + +В некоторых случаях требуется добавить директиву domain в файл .smbselus. + +#================ +# Настройка сетевой корзны: +sudo mkdir /var/recycle +sudo chmod 777 /var/recycle + +sudo vim /etc/samba/smb.conf + +[Recycle] + comment = rec_dir + path = /var/recycle + public = yes + browseable = yes + writable = yes + vfs objects = recycle + recycle:repository = .recycle/%U + recycle:keeptree = Yes + recycle:touch = Yes + recycle:version = Yes + recycle:maxsize = *.tmp, ~$* + recycle:exclude_dir = /tmp + +#============== +[Recycle] 一 имя ресурса, отображаемое клиенту при подключении                                                                       + +comment = rec_dir 一 комментарий + +path = /var/recycle 一 директория, в которой размещена сетевая корзина + +public = yes 一 доступ на чтение всем авторизованным пользователям, также гостевым  + +browseable = yes 一 параметр устанавливает, будет ли общий ресурс отображаться в списке доступных общих ресурсов в сетевом окружении и в списке просмотра + +writable = yes 一 право записи в сетевой ресурс + +vfs objects = recycle 一 использование подсистемы recycle + +recycle:repository = .recycle/%U 一 место хранения удаленных объектов. В этой директиве настроено попадание удаленных файлов в каталог с именем пользователя, который создается автоматически в директории .recycle + +recycle:keeptree = Yes 一 удаление с сохранением дерева каталогов + +recycle:touch = Yes 一 изменение даты при перемещении файла в сетевую корзину + +recycle:versions = Yes 一 добавление номера версии при удалении файлов с одинаковыми именами + +recycle:maxsize = 0 一 параметр отвечает за максимальный размер файла, который может быть перемещен в корзину. При текущем значении возможно переместить файл любого размера + +recycle:exclude = *.tmp, ~$*  一 исключение файлов заданного типа + +recycle:exclude_dir = /tmp 一 исключение директории заданного типа + +``` +# Как в Linux монтировать шару CIFS + + ![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 19.06.2024  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 18.07.2016 + +Работа с общими папками Windows происходит с использованием протокола CIFS (SMB). Все примеры в данном руководстве выполняются на Linux Ubuntu и CentOS. + +### Установка пакетов + +`apt install cifs-utils + +### Сетевые порты + +Если мы будем монтировать сетевую папку, сервер которой находится за брандмауэром, необходимо открыть следующие порты: + +- 137/UDP +- 138/UDP +- 139/TCP +- 445/TCP + +## Синтаксис + +`mount.cifs <папка на сервере> <во что монтируем> <-o опции> + +_* вместо **mount.cifs** можно написать **mount -t cifs**._ + +Пример: + +`mount.cifs //192.168.1.1/public /mnt + +_* простой пример монтирования папки **public** на сервере **192.168.1.1** в локальный каталог **/mnt**._ + +`apt install samba-client +`smbclient -L 192.168.1.1 + + или, при необходимости авторизоваться на файловом сервере:> +`smbclient -L 192.168.1.1 -U username + +## Ручное монтирование + +Теперь монтирование можно выполнить следующей командой: + +`mount.cifs //192.168.1.10/share /mnt -o user=dmosk + +_* в данном примере будет примонтирован каталог **share** на сервере **192.168.1.10** в локальную папку **/mnt** под учетной записью **dmosk**._ + +То же самое, с использованием домена: + +`mount.cifs //192.168.1.10/share /mnt -o user=dmosk,domain=dmosk.local + +## Автоматическое монтирование CIFS через fstab + +Для начала создаем файл, в котором будем хранить данные авторизации при подключении к общей папке: + +vim /root/.smbclient + +И добавляем в него данные следующего вида: + +```sh +username=dmosk +password=dPassw0rd +domain=dmosk.local +``` +_* в этом примере создана пара логин/пароль — **dmosk**/**dPassw0rd**;_ **domain** указывать не обязательно, если аутентификация выполняется без него. + +Задаем права на созданный файл, чтобы доступ был только у пользователя, скажем, root: +`chmod 600 /root/.smbclient +`chown root:root /root/.smbclient + +Теперь открываем конфигурационный файл fstab: +`vim /etc/fstab + +и добавляем в него следующее: +`//192.168.1.10/share /mnt cifs user,rw,credentials=/root/.smbclient 0 0 + +_* в данном примере выполняется монтирование общей папки **share** на сервере с IP-адресом **192.168.1.10** в каталог **/mnt**. Параметры для подключения — **user**: позволяет выполнить монтирование любому пользователю, **rw**: с правом на чтение и запись, **credentials**: файл, который мы создали на предыдущем шаге._ + +Чтобы проверить правильность настроек, вводим следующую команду: +`mount -a + +## Примеры использования опций + +### Версии SMB + +Если на стороне Windows используется старая или слишком новая версия протокола SMB, при попытке монтирования мы можем получить ошибку **mount error(112): Host is down**. Чтобы это исправить, указываем версию: +`mount.cifs //192.168.1.10/share /mnt/ -o vers=1.0 + +_* монтирование по протоколу SMB1.0_ + +### Монтирование от гостевой учетной записи + +Если сервер принимает запросы без логина и пароля, то клиент подключается, как гость: +`mount.cifs //192.168.1.10/share /mnt -o guest + +или в fstab: +`//192.168.1.10/share    /mnt    cifs    guest    0 0 + +Для монтирования шары Windows, иногда, недостаточно указать опцию **guest**. Нужно делать так: +`mount.cifs //192.168.1.10/share /mnt -o user=guest,pass='' + +Или в fstab: +`//192.168.1.10/share    /mnt    cifs    guest,pass    0 0 + +### Права на примонтированные каталоги + +При монтировании папки мы можем указать определенные права: +`mount.cifs //192.168.1.10/share /mnt -o file_mode=0777,dir_mode=0777 + +Для указания владельца, который будет назначен для примонтированного каталога, используем: + `mount.cifs //192.168.1.10/share /mnt -o uid=33,gid=33 + +_* чтобы посмотреть идентификаторы пользователя, вводим **id -u <имя пользователя>** и **id -g <имя группы>**._ \ No newline at end of file diff --git a/LINUX/CRON.md b/LINUX/CRON.md new file mode 100644 index 0000000..ca554dc --- /dev/null +++ b/LINUX/CRON.md @@ -0,0 +1,93 @@ +_www.crontab.guru_ + + + +```sh +systemctl status cron +crontab --help + +crontab -e # настройка для текущего пользователя +crontab -l # настройка для супер пользователя +crontab -r # удалить все задачи +``` + +**_минута_** **_час_** **_день_** **_месяц_** **_день_недели_** **_/путь/к/исполняемому/файлу_** +**обязательно нужно писать полный путь к команде** **_!_** +**Дата и время указываются с помощью цифр или символа ' * '.** +**интервал указывается «** **7-9** **»** +**несколько раз - «** **5,7,12 »** +**раз в 10 мин - « /10 »** + +****@reboot**** **- при загрузке, только один раз;** +****@yearly, @annually**** - раз год; +****@monthly**** - раз в месяц; +****@weekly**** - раз в неделю; +****@daily, @midnight**** - каждый день; +****@hourly**** - каждый час. + +команда запуска скрипта раз в час: + +`@hourly /usr/local/bin/serve` + +Если же вы собрались добавить скрипт в одну из папок, то, как я уже говорил, нужно чтобы его имя было без точек и у него были права на выполнение: + +`sudo vi /etc/corn.daily/basckup` + +`#!/bin/bash ......` + +смотрим лог cron. Иногда он находится в `/var/log/cron`, +а иногда пишется в syslog. + +`grep CRON /var/log/syslog` + +`sudo run-parts /etc/cron.daily/` + +Дальше вы увидите весь вывод, включая вывод скрипта и сможете быстро понять в чем проблема. + + +Можно еще отправлять результат работы скрипта на почту указав команду MAILTO=user@email.ru + +`tail /var/log/syslog` +-получаем "хвост", последние 10 строк лог-файла + +``` +@hourly rsync -avzhe ssh vlapa@178.20.46.157:/home/vlapa/git/ /home/vlapa/1Tb_r1-a/Backup/_git/ + +@hourly rsync -avzh /home/vlapa/300Gb/yaDisk/All-reports /home/vlapa/1Tb_r1-a/Backup/ + +@hourly rsync -avzh /home/vlapa/300Gb/yaDisk/Family /home/vlapa/1Tb_r1-a/Backup/ + +#@hourly rsync -avzh /home/vlapa/300Gb/yaDisk/_MY /home/vlapa/1Tb_r1-a/Backup/ +``` +⚙️ **Синтаксис** + +*`* * * * * команда + +Каждая звезда отвечает за время: + +•  минуты +•  часы +•  дата +•  месяц +•  день недели + +`30 2 * * * /home/user/backup.sh + +Эта задача будет выполняться каждый день в 2:30. + +👀 **Просмотр и редактирование** + +• Чтобы редактировать cron-задачи, используйте: +`crontab -e + +• Чтобы увидеть текущие: +`crontab -l + +✍️ **Логирование cron-задач** +Важно отслеживать выполнение задач. Для этого можно записывать вывод задач в файл: + +`* * * * * /path/to/script.sh >> /var/log/cron.log 2>&1 + +2>&1 — это перенаправление стандартного потока ошибок (stderr) в тот же файл, что и стандартный вывод. То есть любые ошибки скрипта будут также записываться в файл cron.log + + diff --git a/LINUX/DIFFERENT.md b/LINUX/DIFFERENT.md new file mode 100644 index 0000000..f19a55f --- /dev/null +++ b/LINUX/DIFFERENT.md @@ -0,0 +1,51 @@ +============================ +`dpkg --list` +`sudo apt remove package-name` +`sudo apt purge package-name` +`sudo apt autoremove` + +`sudo apt autoclean` + +============================ +Сделать пользователя СуперПользователем: +`sudo usermod -aG sudo sampleuser` +`sudo gpasswd -a sampleuser sudo` + +проверить: +`groups sampleuser` + +удалить из группы sudo: +`sudo gpasswd -d sampleuser sudo` + +============================ +Сразу выкл: +`sudo power off` ??? +`shutdown -h now` + + +пароль, потом выкл: +`sudo poweroff` + +Запланировать выключение через: +`shutdown -h` (time in minutes) +`Shutdown +30` +`shutdown +30 "you have a meeting right now"`` + +Отменить запланированное выкл: +`shutdown -c` + +Выключение в: +`shutdown –h 20:3` + +Справка: +`poweroff --help` + +============================= +`sudo reboot` +`sudo shutdown -r` +`sudo shutdown -r +mins` +`sudo shutdown -r hh:mm` + +`init 6` + +============================= \ No newline at end of file diff --git a/LINUX/DISK/DF, DU.md b/LINUX/DISK/DF, DU.md new file mode 100644 index 0000000..a06b473 --- /dev/null +++ b/LINUX/DISK/DF, DU.md @@ -0,0 +1,101 @@ +мгновенно создать пустой файл, не используя touch: +`>text.txt + +================================ + +команда `du` дает вам возможность исключить файлы определенного типа при расчете размера каталога + +`du -h --exclude="*.txt" tutorials + +================================ + +`df -help` +`df -h` - размер и информация о дисках +`df -i` - inode + +. du -help` +`du -h` - размер директории +`du -d1 / | sort -nr - с сортировкой по весу папки + +$ **du** **опции** **/путь/к/папке** + +А вот опции утилиты: + +_**-a, --all**_ - выводить размер для всех файлов, а не только для директорий, по умолчанию размер выводится только для папок; +_**-B, --block-size**_ - указать единицы вывода размера, доступно: K,M,G,T,P,E,Z,Y для 1024 и KB, MB и так далее для 1000; +_**-c, --total**_ - выводить в конце общий размер всех папок; +_**-d, --max-depth**_ - максимальная глубина вложенности директорий; +_**-h, --human-readable**_ - выводить размер в единицах измерения удобных для человека; +_**--inodes**_ - выводить информацию об использованию inode; +_**-L, --dereference**_ - следовать по всем символическим ссылкам; +_**-l, --count-links**_ - учитывать размер файла несколько раз для жестких ссылок; +_**-P, --no-dereference**_ - не следовать по символическим ссылкам, это поведение используется по умолчанию; +_**-S, --separate-dirs**_ - не включать размер подпапок в размер папки; +_**--si**_ - выводить размер файлов и папок в системе си, используется 1000 вместо 1024; +_**-s, --summarize**_ - выводить только общий размер; +_**-t, --threshold**_ - не учитывать файлы и папки с размером меньше указанного; +_**--time**_ - отображать время последней модификации для файла или папки, вместо времени модификации можно выводить такие метки: atime, access, use, ctime; +_**-X, --exclude**_ - исключить файлы из подсчёта; +_**-x, --one-file-system**_ - пропускать примонтированные файловые системы; +_**--version**_ - вывести версию утилиты. + +Здесь перечислены не все опции. Если вам надо больше, смотрите в: + +_**man du**_ + +## Bash скрипт мониторинга свободного места в Linux + +Рассмотрим простой bash скрипт, для мониторинга дискового пространства на сервере и отправке email уведомления администратору, если места недостаточно. + +```sh +#!/bin/bash +CURRENT=$(df /dev/sdd5 | grep / | awk '{ print $5}' | sed 's/%//g) +THRESHOLD=90 +if [ "$CURRENT" -gt "$THRESHOLD" ] ; then +echo "Осталось слишком мало дискового пространства. Используется: $CURRENT%" | mail -s 'Заканчивается дисковое пространство !' -r home@server.ru vlapa@yandex.ru +fi +``` + +При достижении заполняемости директории / до 90% к вам на почту будет отправляться уведомление. Добавьте данный скрипт в [cron](https://winitpro.ru/index.php/2020/04/21/planirovshhik-zadach-cron-v-linux/) и мониторьте вашу систему. Можно изменить скрипт, чтобы он смотрел за размером определенного раздела или каталога. + +=========================== +**du** — позволяет быстро и эффективно проанализировать использование дискового пространства, найти самые «тяжёлые» файлы и папки, чтобы освободить место. + +🟠 **Показать размер папки:** +`du -sh /path/to/folder +➡️ Выводит общий размер папки в удобном формате (МБ/ГБ). + +🟠 **Посмотреть размеры всех вложенных папок:** +`du -h /path/to/folder +➡️ Отлично подходит для поиска «тяжёлых» файлов. + +🟠 **Сортировка по размеру:** +`du -h /path/to/folder | sort -h +➡️ Самые большие файлы окажутся внизу списка. + +=========================== +**Быстрое удаление больших файлов в Linux** + +Когда на диске заканчивается место, полезно быстро находить и удалять самые "тяжелые" файлы. В Linux это можно сделать несколькими способами. + +**🟢 Найти файлы больше 1ГБ:** +find / -type f -size +1G 2>/dev/null +Отобразит файлы больше 1ГБ во всей системе. + +**🟢 Найти и удалить файлы больше 500МБ в указанной папке:** +find /var/log -type f -size +500M -delete +Удаляет файлы в /var/log, превышающие 500МБ. + +**🟢 Найти самые "тяжелые" каталоги:** +du -ah / | sort -rh | head -10 +Выведет 10 самых больших файлов и папок. + +🗣 **Полезно для очистки места на сервере, анализа логов и удаления ненужных файлов.** + +=========================== + +=========================== + +=========================== + +=========================== diff --git a/LINUX/DISK/FDISK.md b/LINUX/DISK/FDISK.md new file mode 100644 index 0000000..f034e53 --- /dev/null +++ b/LINUX/DISK/FDISK.md @@ -0,0 +1,217 @@ +## Разбить диск на разделы с помощью команды fdisk + +Выполните следующие действия, чтобы разбить диск в Linux с помощью команды `fdisk`. +#### Шаг 1. Список существующих разделов + +Выполните следующую команду, чтобы вывести список всех существующих разделов: +`sudo fdisk -l +Вывод содержит информацию о дисках и разделах хранилища: + +[![sudo fdisk -l](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/9.png "sudo fdisk -l")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/9.png) +#### Шаг 2: Выберите диск для хранения + +Выберите диск для хранения, на котором вы хотите создать разделы, выполнив следующую команду: +`sudo fdisk /dev/sdb + +Диск `/dev/sdbstorage` открыт: + +[![/dev/sdbstorage](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/10.png "/dev/sdbstorage")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/10.png) +Будет предложено ввести `m` для справки, вводим и смотрим какие есть возможности по работе с диском +Help: + +  **GPT** +   M   enter protective/hybrid MBR + +  **Generic** +   d   delete a partition +   F   list free unpartitioned space +   l   list known partition types +   n   add a new partition +   p   print the partition table +   t   change a partition type +   v   verify the partition table +   i   print information about a partition + +  **Misc** +   m   print this menu +   x   extra functionality (experts only) + +  **Script** +   I   load disk layout from sfdisk script file +   O   dump disk layout to sfdisk script file + +  **Save & Exit** +   w   write table to disk and exit +   q   quit without saving changes + +  **Create a new label** +   g   create a new empty GPT partition table +   G   create a new empty SGI (IRIX) partition table +   o   create a new empty MBR (DOS) partition table +   s   create a new empty Sun partition table +   +#### Шаг 3: Создайте новый раздел + +1. Запустите команду `n`, чтобы создать новый раздел. +2. Выберите номер раздела, набрав номер по умолчанию (2). +3. После этого вас попросят указать начальный и конечный сектор вашего жесткого диска. Лучше всего ввести в этом разделе номер по умолчанию (3622912). +4. Последний запрос связан с размером раздела. Вы можете выбрать несколько секторов или установить размер в мегабайтах или гигабайтах. Введите `+ 2 GB`, чтобы установить размер раздела 2 ГБ. + +Появится сообщение, подтверждающее создание раздела. + +[![n](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/11.png "n")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/11.png) +#### Шаг 4: запись на диск + +Система создала раздел, но изменения не записываются на диск. +1. Чтобы записать изменения на диск, выполните команду `w`: + +[![w](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/12.png "w")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/12.png) +2. Убедитесь, что раздел создан, выполнив следующую команду: +`sudo fdisk -l +Как видите, раздел `/dev/sdb2` создан. + +### Отформатируйте раздел + +После создания раздела с помощью команды `parted` или `fdisk` отформатируйте его перед использованием. +Отформатируйте раздел, выполнив следующую команду: +`sudo mkfs -t ext4 /dev/sdb1 + +[![sudo mkfs -t ext4 /dev/sdb1](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/14.png "sudo mkfs -t ext4 /dev/sdb1")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/14.png) +#### Смонтировать раздел + +Чтобы начать взаимодействие с диском, создайте точку монтирования (mount point) и смонтируйте к ней раздел. + +1. Создайте точку монтирования, выполнив следующую команду: +`sudo mkdir -p /mt/sdb1 +2. После этого смонтируйте раздел, введя: +`sudo mount -t auto /dev/sbd1 /mt/sdb1 + +Терминал не распечатывает вывод, если команды выполнены успешно. +3. Убедитесь, что раздел смонтирован, с помощью команды `df hT`: +[![df hT](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/15.png "df hT")](https://wiki.merionet.ru/images/kak-sozdavat-razdely-diska-v-linux/15.png) +========================================== +`lsblk` - диски со структурой + +`cat /proc/mdstat` - информация о RAID массивах в системе + +`sudo blkid` +Примерный вывод: + +`/dev/sda1: UUID="00a4ad8e-dbcc-4c32-a0b4-074b5ee2bfb4" TYPE="ext4"` +`/dev/sda2: LABEL="Win7" UUID="0E42D6D242D6BE21" TYPE="ntfs"` +`/dev/sda3: LABEL="Shared" UUID="7ECCC7F5CCC7A62D" TYPE="ntfs"` +`/dev/sda4: UUID="1050e484-896f-42a9-bdb3-49eb1255cc77" TYPE="swap"` +`/dev/sr0: LABEL="DrWebLiveCD" TYPE="iso9660"` +`/dev/sdb1: LABEL="TRENDNET8GB" UUID="355B-FE37" TYPE="vfat"` + +Предположим, мы хотим подключить раздел «Shared» (NTFS-раздел, находящийся на основном диске компьютера) и «TRENDNET8GB» (флэшка, отформатированная в FAT32). + +Бонус использования команды blkid по сравнению с инспекцией каталога `/dev/disk/by-uuid/` в том,что вы сразу видите тип файловой системы на блочном устройстве, если ядру удалось его определить. + +- Создаём каталоги для монтирования: + + `sudo mkdir /mnt/Shared /mnt/TrendNet8Gb` + +- Открываем **от имени администратора** файл _/etc/fstab_, содержащий информацию о всех монтируемых при загрузке разделах: + +`sudo nano /etc/fstab + +Добавляем в конец файла, +для NTFS: + +`UUID="7ECCC7F5CCC7A62D" /mnt/Shared ntfs rw,nls=utf8,gid=plugdev,umask=0002 0 0` + +для FAT и FAT32: + +`UUID="355B-FE37" /mnt/TrendNet8Gb vfat rw,exec,codepage=866,nls=utf8,gid=plugdev,umask=0002,nofail,users 0 0` + +Монтируем только что вписанные разделы диска: + +`sudo mount -a` + +`fdisk -u -l /dev/sd?` +`sudo mkdir /mnt/raid0` +`sudo mount /dev/md0 /mnt/raid0 -t auto -o rw,nls=utf8,noatime` + +`$ mount` + +_**....**_ + +`/dev/md0 on /mnt/raid0 type ext3 (rw,noatime,nls=utf8)` + + +`$ mount опции -t файловая_система -o опции_монтирования файл_устройства папка_назначения` + +Опции задают различные дополнительные особенности работы утилиты. Опция -t необязательна, но она позволяет задать файловую систему, которая будет использована и иногда это очень полезно. С помощью опции -o вы можете задать различные параметры монтирования, например, монтировать только для чтения и т д. Последних два параметра - это файл устройства, например, /dev/sda1 и папка назначения, например, /mnt. + +Перед тем как перейти к рассмотрению примеров работы утилитой, давайте рассмотрим ее основные опции: + +- **-V** - вывести версию утилиты; +- **-h** - вывести справку; +- **-v** - подробный режим; +- **-a, --all** - примонтировать все устройства, описанные в fstab; +- **-F, --fork** - создавать отдельный экземпляр mount для каждого отдельного раздела; +- **-f, --fake** - не выполнять никаких действий, а только посмотреть что собирается делать утилита; +- **-n, --no-mtab** - не записывать данные о монтировании в /etc/mtab; +- **-l, --show-labels** - добавить метку диска к точке монтирования; +- **-c** - использовать только абсолютные пути; +- **-r, --read-only** - монтировать раздел только для чтения; +- **-w, --rw** - монтировать для чтения и записи; +- **-L, --label** - монтировать раздел по метке; +- **-U, --uuid** - монтировать раздел по UUID; +- **-T, --fstab** - использовать альтернативный fstab; +- **-B, --bind** - монтировать локальную папку; +- **-R, --rbind** - перемонтировать локальную папку. + +`sudo umount /home/vlapa/2Tb_ext` + +`lsof -w /mnt` + +`sudo umount -l /mnt` +-жесткое размонтирование + + +`lsblk ( -f )` + + +****N********AME**** ****-**** имя устройства +****M********AJ********:M********IN**** ****-**** Гланый и Минимальные Номера устройств +****RM**** - Является ли устройство съемным (1) или не (0) +****S********IZE**** - Объем устройства +****RO -**** устройство, только для чтения (1) или не (0) +****TYPE**** - типа устройства, т.е., если это - диск или разделы и т.д. +****M********OUNT POINT**** - точка монтирования устройства (если применимо). + +`sudo fdisk -l` +`sudo parted -l` + + +`sudo mkdir /mnt/name_folder` +`sudo mount /dev/имя_раздела /точка/монтирования` +`sudo chmod 0777 /mnt/name_folder` +`sudo umount /dev/имя_раздела` +`sudo umount /точка_монтирования` + +`sudo nano /etc/fstab` + +`/etc/fstab` +: static file system information. + + +Use =='blkid'== to print the universally unique identifier for a +device; this may be used with UUID= as a more robust way to name devices that works even if disks are added and removed. See fstab(5). + + + + +/dev/disk/by-uuid/c1ca47b1-6f02-4cbb-a917-0bf76c7beae6 none swap sw 0 0 +# / was on /dev/sda3 during curtin installation +/dev/disk/by-uuid/2b69c1d7-9e7a-48bb-91f5-28cce8b4a0e2 / ext4 defaults 0 1 +# /home was on /dev/sda4 during curtin installation +/dev/disk/by-uuid/0c68c1b7-3621-454b-8a4a-02a5c3ce5e92 /home ext4 defaults 0 1 +# /home/1Tb +/dev/disk/by-uuid/1c513d3e-3aa1-4f67-b815-e62369251830 /home/vlapa/1Tb ext4 defaults 0 1 +# /home/2Tb-a +/dev/disk/by-uuid/caa5ad3b-4f1c-45ae-9cd9-d8011ad024e5 /home/vlapa/2Tb-a ext4 defaults 0 1 +# /home/2Tb-b +/dev/disk/by-uuid/e800aa0b-5217-42ad-bac0-5a3f07a748bf /home/vlapa/2Tb-b ext4 defaults 0 1 diff --git a/LINUX/DISK/FSTAB.md b/LINUX/DISK/FSTAB.md new file mode 100644 index 0000000..3d4d30f --- /dev/null +++ b/LINUX/DISK/FSTAB.md @@ -0,0 +1,100 @@ +```sh +# При загрузке Linux на определенном этапе выполняется чтение файла /etc/fstab, в котором описаны правила монтирования разделов. Рассмотрим синтаксис его заполнения. + +# Каждый раздел, который должен быть смонтирован записывается с новой строки: + +#                 + +# device — накопитель, который мы монтируем. Это может быть путь до устройства или его идентификатор. +# dir — каталог, в который выполняем монтирование **device**. +# type — файловая система. +# options — опции монтирования, например, владелец каталога или параметры аутентификации. +# dump — указываем, нужно ли создать резервную копию с помощью утилиты dump. +# fsck — нужно ли проверять файловую систему при помощи fsck. Стоит очень аккуратно относится к данному параметру, так как не со всеми файловыми системами утилита fsck корректно работает. Если нет уверенности, ставим 0. Доступны значения: + # 0 — не выполнять проверку. + # 1 — проверять с высоким приоритетом. Рекомендовано только для корневого раздела. + # 2 — проверять с низким приоритетом. + +# Пример файла fstab: + +#                       +/dev/pve/root     /               ext4     errors=remount-ro  0       1 +/dev/pve/swap     none            swap     sw                 0       0 + +# в данном примере будут смонтированы 2 раздела: + +# /dev/pve/root — в корневой раздел с файловой системой ext4. +# /dev/pve/swap — файл подкачки. + +``` +## Монтирование по имени диска +```sh +vi /etc/fstab + +# добавляем в него следующую строчку: + +/dev/sda1     /db     xfs     defaults     0 0 + +# Где: +# /dev/sda1 — диск, который мы монтируем; +# /db — каталог, в который монтируем диск; +# xfs — файловая система; defaults — стандартные опции; +# 0 0 — первый отключает создание резервных копий при помощи утилиты dump, второй отключает проверку диска. + +# создаем каталог, в который монтируем диск (в данном примере, /db): +mkdir /db + +# И монтируем вручную диск, чтобы проверить правильность настроек fstab: +mount /db + +# Должен появиться новый диск. Это можно проверить следующей командой +mount +``` + +## Монтирование по идентификатору +```sh +# Данный способ не сильно отличается от монтирования по имени диска — вместо имени мы указываем идентификатор. Такой подход считается более надежным, так как при переподключении дисков к другим портам материнской платы может поменяться приоритет и, как следствие, имя устройства — это может привести к проблемам монтирования. UUID диска не меняется и поэтому, данная проблема при таком монтировании не страшна. +blkid + +# Мы получим ответ на подобие: +/dev/sdb: UUID="3e53fc7e-a417-4fa5-b034-b227bea2474c" BLOCK_SIZE="4096" TYPE="ext4" +/dev/sda1: UUID="358f032e-3efb-42ab-b3ba-05ddc82fedfd" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="0beca126-01" + +# допустим, диск который мы хотим примонтировать — sda1. Его идентификатор: 358f032e-3efb-42ab-b3ba-05ddc82fedfd + +vim /etc/fstab +# добавляем в него следующую строчку: +UUID=358f032e-3efb-42ab-b3ba-05ddc82fedfd     /db     xfs     defaults     0 0 + +# Монтирование можно проверить командой: +mount -a + +# Пример монтирования сетевого диска + +192.168.0.1/network /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0 + +# выполняется монтировние общей папки *network* на сервере с IP-адресом 192.168.0.1 в каталог /mnt. В качестве сетевой файловой системы используется *cifs (протокол SMB: сервер samba или общая папка Windows). Параметры для подключения: +# user - позволяет выполнить монтирование любому пользователю +# rw - с правом на чтение и запись +# noauto - не монтировать автоматически при старте системы +# credentials - файл, в котором написаны логин и пароль для подключения к общей папке + +# Теперь создадим файл аутентификации (credentials): +vim /root/.smbclient + +# и приведем его к следующему виду: +username=backup +password=backup + +# username - имя пользоватля +# password - пароль (Само собой, в вашем случае )указываются свои данные) + +# Теперь вводим следующую команду: +mount /mnt + +# Должна примонтироваться сетевая папка //192.168.0.1/network +# Это можно проверить следующей командой: + +mount +``` + diff --git "a/LINUX/DISK/GPT-\320\264\320\270\321\201\320\272 \320\262 Linux.md" "b/LINUX/DISK/GPT-\320\264\320\270\321\201\320\272 \320\262 Linux.md" new file mode 100644 index 0000000..8c313f4 --- /dev/null +++ "b/LINUX/DISK/GPT-\320\264\320\270\321\201\320\272 \320\262 Linux.md" @@ -0,0 +1,68 @@ + (носитель более 2 ТБ) + + ![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 24.05.2024  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 17.01.2017 + +C [GPT](https://www.dmosk.ru/terminus.php?object=gpt) в системах [Linux](https://www.dmosk.ru/terminus.php?object=linux) работает [утилита](https://www.dmosk.ru/terminus.php?object=utility) **parted**. + +Чтобы узнать, какой именно тип диска (GPT или [MBR](https://www.dmosk.ru/terminus.php?object=mbr)) настроен вводим команду: + +fdisk /dev/sdb -l + +_* где sdb — наш [жесткий диск](https://www.dmosk.ru/terminus.php?object=hdd)._ + +Либо будет выведено предупреждение **WARNING: GPT (GUID Partition Table) detected**, значит используется GPT, либо мы увидим: + +Тип метки диска: gpt + +Также, для определения диска можно использовать **gdisk**: + +gdisk /dev/sdb + +Мы должны увидеть строку на подобие: + +Found valid GPT with protective MBR; using GPT. + +## Создаем GPT + +Открываем наш диск утилитой parted: + +parted /dev/sdb + +Откроется интерактивное меню утилиты — нажимаем **p:** + +(parted) p + +На экран будет выведена информация о разделах. Если они есть, удаляем командой **rm:** + +(parted) rm 1 + +_* где **1** — номер раздела. Команду нужно повторить для всех разделов. Их список мы смотрели на предыдущем шаге командой **p**. +* если на разделе есть важная информация, ее нужно скопировать на другой носитель._ + +Создаем разметку GPT: + +(parted) mklabel gpt + +И создаем новый раздел: + +(parted) mkpart primary 0 0 + +_* где **primary** указывает, что раздел является основным; **0** и **0** — использовать весь диск для создания раздела, но можно использовать часть диска, например, 0 2048GB._ + +Выходим из parted: + +(parted) q + +И форматируем диск: + +mkfs.ext4 /dev/sdb + +_* где в качестве файловой системы выбрана **ext4**._ + +Для проверки, монтируем отформатированный диск в директорию **/mnt**: + +mount /dev/sdb /mnt + +И выводим список дисков: + +df -h \ No newline at end of file diff --git "a/LINUX/DISK/GeeseFS ( Yandex Cloud \320\264\320\270\321\201\320\272 ).md" "b/LINUX/DISK/GeeseFS ( Yandex Cloud \320\264\320\270\321\201\320\272 ).md" new file mode 100644 index 0000000..1539cc5 --- /dev/null +++ "b/LINUX/DISK/GeeseFS ( Yandex Cloud \320\264\320\270\321\201\320\272 ).md" @@ -0,0 +1,73 @@ +### Установка компонентов + +Сначала устанавливаем утилиты fuse и wget. В зависимости  + +а) Для Deb (Debian / Ubuntu): + +apt update + +apt install fuse wget + +б) Для RPM (Rocky / CentOS): + +yum install fuse fuse3 wget + +Скачиваем geesefs и сохраняем ее в /usr/bin/geesefs: + +wget https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64 -O /usr/bin/geesefs + +Выставляем разрешение утилиты geesefs на запуск: + +chmod a+x /usr/bin/geesefs + +Проверяем работу утилиты, посмотрев ее версию: + +geesefs -v + +Мы должны увидеть что-то на подобие: + +geesefs version 0.36.2 + +### Авторизация + +Yandex Cloud для монтирования диска требует прохождение аутентификации с помощью токена. Его мы получаем в личном кабинете хостера. + +Для настройки доступа создаем каталог **.aws** в домашней директории пользователя, под которым будем монтировать диск. В моем случае, пользователь root: + +mkdir /root/.aws + +После создаем файл с токеном: + +vi /root/.aws/credentials + +[default] +aws_access_key_id = H.....D +aws_secret_access_key = H......7 + +### Ручное монтирование + +Для монтирования используем команду geesefs: + +geesefs <имя бакета> <точка монтирования> + +Например: + +geesefs testbacket /mnt + +### Автоматическое монтирование + +Чтобы раздел автоматически монтировался при перезапуске компьютера, открываем на редактирование файл fstab: + +vi /etc/fstab + +Добавляем строку: + +<имя бакета>    <точка монтирования>    fuse.geesefs    _netdev,allow_other,--file-mode=0666,--dir-mode=0777    0   0 + +> Если мы хотим, чтобы точке монтирования назвачался определенный владелец и группы, указываем опции **uid** и **gid**: +> +> <имя бакета>    <точка монтирования>    fuse.geesefs    _netdev,allow_other,--file-mode=0666,--dir-mode=0777,--uid=1024,--gid=1024    0   0 + +Чтобы применить настройку и проверить ее, вводим: + +mount -a \ No newline at end of file diff --git "a/LINUX/DISK/HDPARM \321\201\320\272\320\276\321\200\320\276\321\201\321\202\321\214 \320\264\320\270\321\201\320\272\320\260.md" "b/LINUX/DISK/HDPARM \321\201\320\272\320\276\321\200\320\276\321\201\321\202\321\214 \320\264\320\270\321\201\320\272\320\260.md" new file mode 100644 index 0000000..866f5be --- /dev/null +++ "b/LINUX/DISK/HDPARM \321\201\320\272\320\276\321\200\320\276\321\201\321\202\321\214 \320\264\320\270\321\201\320\272\320\260.md" @@ -0,0 +1,133 @@ +```sh +hdparm -tT /dev/sda + +``` + +/dev/sda: + Timing cached reads:   24138 MB in  1.98 seconds = 12174.75 MB/sec + + Timing buffered disk reads: 1006 MB in  3.00 seconds = 335.09 MB/sec +  + +`$ hdparm опция значение /dev/имя_файла_диска` + +Если опцию передать без значения, то как правило, она просто выводит текущее значения параметра, если передать значение, то оно устанавливается вместо старого. Давайте сначала рассмотрим основные опции утилиты, которые мы будем сегодня использовать: + +- ****-a**** - позволяет включить режим read-ahead, когда чтение выполняется в первую очередь. Этот режим позволяет улучшить производительность чтения больших объемов данных; + +- ****-A**** - позволяет включить режим read-look-ahead, когда диск просматривается перед чтением. По умолчанию включена; +- ****-b**** - остановить жесткий диск до следующего к нему обращения; +- ****-B**** - настройка управления питанием Advanced Power Management (APM), чем ниже значение, тем лучше энергосбережение. Чтобы отключить режим полностью установите значение в 255. +- ****-c**** - включает 32-битный режим передачи для IDE; +- ****-C**** - позволяет посмотреть текущий режим питания IDE; +- ****-d**** - включает режим DMA; +- ****-D**** - включает обнаружение дефектных областей на диске; +- ****-E**** - позволяет установить скорость для CD/DVD привода; +- ****-f**** - позволяет записать кэш диска на носитель; +- ****-i**** - выводит информацию о диске; +- ****-I**** - тоже выводит информацию о диске, но в более подробной форме; +- ****-m**** - позволяет указать количество секторов для многосекторного ввода/вывода. Чтобы отключить эту опцию установите её в 0; +- -M - позволяет управлять уровнем шума диска с помощью Automatic Acoustic Management (AAM); +- ****-n**** - позволяет включить флаг ****ignore write errors**** для игнорирования ошибок записи; +- ****-r**** - включает флаг read only. После этого с устройства можно только читать данные, но не записывать; +- ****-S**** - устанавливает время неактивности диска для перехода его в режим сна. Если установлено в 0, то диск сразу же отключается; +- ****-T**** - выполняет тест скорости чтения из кэша; +- ****-t**** - выполняет тест скорости чтения с диска без кэширования; +- ****-v**** - выводит все настройки; +- ****-w**** - выполняет сброс диска; +- ****-W**** - включает или отключает кэш для записи данных на IDE; +- ****-y**** - переводит IDE диск в режим низкого энергопотребления, замедляя скорость вращения диска; +- ****-Y**** - переводит IDE диск в режим низкого энергопотребления останавливая его; +- ****-z**** - просит ядро перечитать таблицу разделов для этого диска; +- ****-Z**** - отключает режим энергосбережения диска. + +### Hdparm + +`hdparm` - программа для получения/установки параметров устройств SATA/IDE - из одноимённого пакета, которая поддерживает управление временем автопарковки: + +Проверить, что установлено (`hdparm` работает от имени **root**): + +$ su - +`hdparm -J /dev/sdX + +Выключить: + +`hdparm -J0 --please-destroy-my-drive /dev/sdX + +Настройка диска (команда idle3ctl из пакета idle3-tools) + +1. idle3ctl -s 900 /dev/sda +2. idle3ctl -d /dev/sda + +- [https://forum.altlinux.org/index.php?topic=29692.105](https://forum.altlinux.org/index.php?topic=29692.105) +- [https://bugs.etersoft.ru/show_bug.cgi?id=9438](https://bugs.etersoft.ru/show_bug.cgi?id=9438) + +Если указанный выше способ не сработал, можно отключить парковку головок жесткого диска через функцию **APM (расширенного управления питанием)** жесткого диска. Сначала нужно узнать, какой уровень управления энергопитанием установлен: + +$ su - +`hdparm -B /dev/sdX +где sdX - имя нужного жесткого диска в системе. + +Во время питания ноутбука от сети значение APM равно 254. При работе от батареи можно установить его на уровне 128, а при одном-двух запущенных приложениях — 96. Запуска веб-браузера в этом случае стоит избегать. + +$ sudo hdparm -B 96 -S 0 /dev/sda + +При частой работе за ноутбуком от аккумулятора, вероятно, лучшим решением будет использование твердотельного накопителя — SSD: он очевидно превосходит HDD в экономии энергии. Возможно также комбинировать два варианта, когда на SDD установлена сама операционная система, а HDD используется для хранения данных. + +Возможные значения варьируются от 1 до 254. Наивысшая степень управления питанием достигается при значении 1, а наивысшая производительность ввода-вывода - при значении 254. Значение 255 указывает `hdparm` на полное отключение расширенного управления питанием на диске (не все диски поддерживают его отключение, но большинство поддерживают). + + +Для настройки APM при загрузке — создаем исполняемый файл `[rc.local](https://www.altlinux.org/Rc.local "Rc.local")`: + +$ su - +`echo '#!/bin/sh' > /etc/rc.d/rc.local +`chmod +x /etc/rc.d/rc.local + +В этот файл добавляем строчку: + +hdparm -B 254 /dev/sda + +Для настройки APM при выходе из ждущего режима — создаем файл `/etc/systemd/system/root-resume.service`: + +`touch /etc/systemd/system/root-resume.service + +В этот файл добавляем строчки: + +[Unit] +Description=Local system resume actions +After=suspend.target + +[Service] +Type=simple +ExecStart=/sbin/hdparm -B 254 /dev/sda + +[Install] +WantedBy=suspend.target + +И выполняем команду: + +`systemctl enable root-resume + +Для настройки APM при выходе из спящего режима — создаем файл `/etc/systemd/system/root-resume-sleep.service`: + +`touch /etc/systemd/system/root-resume-sleep.service + +В этот файл добавляем строчки: + +[Unit] +Description=Local system resume actions +After=hibernate.target + +[Service] +Type=simple +ExecStart=/sbin/hdparm -B 254 /dev/sda + +[Install] +WantedBy=hibernate.target + +И выполняем команду: + +`systemctl enable root-resume-sleep + + + diff --git "a/LINUX/DISK/MDADM \320\276\321\200\320\263\320\260\320\275\320\270\320\267\320\260\321\206\320\270\321\217 RAID.md" "b/LINUX/DISK/MDADM \320\276\321\200\320\263\320\260\320\275\320\270\320\267\320\260\321\206\320\270\321\217 RAID.md" new file mode 100644 index 0000000..7a50f40 --- /dev/null +++ "b/LINUX/DISK/MDADM \320\276\321\200\320\263\320\260\320\275\320\270\320\267\320\260\321\206\320\270\321\217 RAID.md" @@ -0,0 +1,535 @@ +![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 28.09.2023  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 08.03.2019 + +mdadm — утилита для работы с программными RAID-массивами различных уровней. В данной инструкции рассмотрим примеры ее использования. + +[Установка утилиты mdadm](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#install) +[Создание RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create) +    [Подготовка носителей](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-prepare) +    [Сборка отказоустойчивого массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-raid) +[Файл mdadm.conf](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#conf) +[Создание файловой системы и монтирование](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#fs-mount) +[Получение информации о RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#info) +[Проверка целостности массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#check) +[Восстановление RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore) +    [Заменой диска](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-disk) +    [Пересборка массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-assemble) +[Использование Hot Spare](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#spare) +[Добавление диска к массиву](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#add-to-raid) +[Удаление массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#remove) + +## Установка mdadm + +`apt-get install mdadm + +## Сборка RAID + +Перед сборкой, стоит подготовить наши носители. Затем можно приступать к созданию рейд-массива. + +### Подготовка носителей + +Сначала необходимо занулить суперблоки на дисках, которые мы будем использовать для построения RAID (если диски ранее использовались, их суперблоки могут содержать служебную информацию о других RAID): + +`mdadm --zero-superblock --force /dev/sd{b,c} + +_* в данном примере мы зануляем суперблоки для дисков **sdb** и **sdc**._ + +> Посмотреть, какие в вашей системе есть устройства можно командой: +> +> `lsblk + +Если мы получили ответ: + +`mdadm: Unrecognised md component device - /dev/sdb +`mdadm: Unrecognised md component device - /dev/sdc + +... то значит, что диски не использовались ранее для RAID. Просто продолжаем настройку. + +Далее нужно удалить старые метаданные и подпись на дисках: + +`wipefs --all --force /dev/sd{b,c} + +### Создание рейда + +Для сборки избыточного массива применяем следующую команду: + +`mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sd{b,c} + +_* где:_ +- _**/dev/md0** — устройство RAID, которое появится после сборки;_  +- _**-l 1** — уровень RAID;_  +- _**-n 2** — количество дисков, из которых собирается массив;_  +- _**/dev/sd{b,c}** — сборка выполняется из дисков sdb и sdc._ + +Мы должны увидеть что-то на подобие: + +`mdadm: Note: this array has metadata at the start and +    `may not be suitable as a boot device.  If you plan to +    `store '/boot' on this device please ensure that +    `your boot-loader understands md/v1.x metadata, or use +    `--metadata=0.90 +`mdadm: size set to 1046528K + +Также система задаст контрольный вопрос, хотим ли мы продолжить и создать RAID — нужно ответить **y**: + +`Continue creating array? y + +Мы увидим что-то на подобие: + +`mdadm: Defaulting to version 1.2 metadata +`mdadm: array /dev/md0 started. + +Вводим команду: + +`lsblk + +... и находим информацию о том, что у наших дисков sdb и sdc появился раздел md0, например: +... +sdb                     8:16   0    2G  0 disk   +??md0                   9:0    0    2G  0 raid1  +sdc                     8:32   0    2G  0 disk   +??md0                   9:0    0    2G  0 raid1  +... + +_* в примере мы видим собранный raid1 из дисков sdb и sdc._ + +## Создание файла mdadm.conf + +В файле mdadm.conf находится информация о RAID-массивах и компонентах, которые в них входят. Для его создания выполняем следующие команды: + +`mkdir /etc/mdadm + +`echo "DEVICE partitions" > /etc/mdadm/mdadm.conf + +`mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf + +Пример содержимого: + +`DEVICE partitions +`ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=proxy.dmosk.local:0 UUID=411f9848:0fae25f9:85736344:ff18e41d + +_* в данном примере хранится информация о массиве **/dev/md0** — его уровень 1, он собирается из 2-х дисков._ + +## Создание файловой системы и монтирование массива + +Создание файловой системы для массива выполняется также, как для раздела, например: + +`mkfs.ext4 /dev/md0 + +_* данной командой мы создаем на **md0** файловую систему **ext4**._ +или: + +`mkfs.xfs /dev/md0 + +_* для файловой системы **xfs**._ + +Примонтировать раздел можно командой: + +`mount /dev/md0 /mnt + +_* в данном случае мы примонтировали наш массив в каталог **/mnt**._ + +Чтобы данный раздел также монтировался при загрузке системы, добавляем в fstab. + +Сначала смотрим идентификатор раздела: + +`blkid + +Мы увидим что-то на подобие: + +`/dev/md0: UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6" TYPE="ext4" + +_* в моем примере мы будем использовать идентификатор **ffa7c082-7613-4dbc-ae62-3f5508652cf6**._ + +Открываем теперь fstab и добавляем строку: + +`vim /etc/fstab + +`UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6"    /mnt    ext4    defaults    0 0 + +Если ранее мы монтировали раздел в каталог /mnt, вводим: + +`umount /mnt + +И после:  + +`mount -a + +Мы должны увидеть примонтированный раздел md, например: + +`df -h + +`/dev/md0               990M         2,6M  921M            1% /mnt + +## Информация о RAID + +Посмотреть состояние всех RAID можно командой: + +`cat /proc/mdstat + +В ответ мы получим что-то на подобие: + +`md0 : active raid1 sdc[1] sdb[0] +      `1046528 blocks super 1.2 [2/2] [UU] + +_* где **md0** — имя RAID устройства; **raid1 sdc[1] sdb[0]** — уровень избыточности и из каких дисков собран; **1046528 blocks** — размер массива; **[2/2] [UU]** — количество юнитов, которые на данный момент используются. +** мы можем увидеть строку **md0 : active(auto-read-only)** — это означает, что после монтирования массива, он не использовался для записи._ + +Подробную информацию о конкретном массиве можно посмотреть командой: + +`mdadm -D /dev/md0 + +_* где **/dev/md0** — имя RAID устройства._ + +Пример ответа: + +           Version : 1.2 +     Creation Time : Wed Mar  6 09:41:06 2019 +        Raid Level : raid1 +        Array Size : 1046528 (1022.00 MiB 1071.64 MB) +     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB) +      Raid Devices : 2 +     Total Devices : 2 +       Persistence : Superblock is persistent + +       Update Time : Wed Mar  6 09:41:26 2019 +             State : clean  +    Active Devices : 2 +   Working Devices : 2 +    Failed Devices : 0 +     Spare Devices : 0 + +Consistency Policy : resync + +              Name : proxy.dmosk.local:0  (local to host proxy.dmosk.local) +              UUID : 304ad447:a04cda4a:90457d04:d9a4e884 +            Events : 17 + +    Number   Major   Minor   RaidDevice State +       0       8       16        0      active sync   /dev/sdb +       1       8       32        1      active sync   /dev/sdc + +_* где:_ + +- _**Version —** версия метаданных._ +- _**Creation Time —** дата в время создания массива._ +- _**Raid Level —** уровень RAID._ +- _**Array Size —** объем дискового пространства для RAID._ +- _**Used Dev Size —** используемый объем для устройств. Для каждого уровня будет индивидуальный расчет: RAID1 — равен половине общего размера дисков, RAID5 — равен размеру, используемому для контроля четности._ +- _**Raid Devices —** количество используемых устройств для RAID._ +- _**Total Devices —** количество добавленных в RAID устройств._ +- _**Update Time —** дата и время последнего изменения массива._ +- _**State —** текущее состояние. clean — все в порядке._ +- _**Active Devices —** количество работающих в массиве устройств._ +- _**Working Devices —** количество добавленных в массив устройств в рабочем состоянии._ +- _**Failed Devices —** количество сбойных устройств._ +- _**Spare Devices —** количество запасных устройств._ +- _**Consistency Policy —** политика согласованности активного массива (при неожиданном сбое). По умолчанию используется **resync** — полная ресинхронизация после восстановления. Также могут быть bitmap, journal, ppl._ +- _**Name —** имя компьютера._ +- _**UUID —** идентификатор для массива._ +- _**Events —** количество событий обновления._ +- **Chunk Size** (для RAID5) — размер блока в килобайтах, который пишется на разные диски. + +Подробнее про каждый параметр можно прочитать в мануале для mdadm: + +`man mdadm + +Также, информацию о разделах и дисковом пространстве массива можно посмотреть командой fdisk: + +`fdisk -l /dev/md0 + +## Проверка целостности + +Для проверки целостности вводим: + +`echo 'check' > /sys/block/md0/md/sync_action + +Результат проверки смотрим командой: + +`cat /sys/block/md0/md/mismatch_cnt + +_* если команда возвращает **0**, то с массивом все в порядке._ + +Остановка проверки: + +`echo 'idle' > /sys/block/md0/md/sync_action + +## Восстановление RAID + +Рассмотрим два варианта восстановлении массива. + +### Замена диска + +В случае выхода из строя одного из дисков массива, команда cat /proc/mdstat покажет следующее: + +`cat /proc/mdstat + +Personalities : [raid1]  +md0 : active raid1 sdb[0] +      1046528 blocks super 1.2 [2/1] [U_] + +_* о наличии проблемы нам говорит нижнее подчеркивание вместо U — **[U_]** вместо **[UU]**._ + +Или: + +`mdadm -D /dev/md0 + +... +       Update Time : Thu Mar  7 20:20:40 2019 +             State : clean, degraded +... + +_* статус **degraded** говорит о проблемах с RAID._ + +Для восстановления, сначала удалим сбойный диск, например: + +`mdadm /dev/md0 --remove /dev/sdc + +> Если нам нужно заменить диск, но при этом он в mdadm имеет рабочее состояние, мы получим ошибку: +> +> ... device or resource busy +> +> Сначала, нам нужно пометить диск как сбойный: +> +> `mdadm /dev/md0 --manage --fail /dev/sdc +> +> _* в данном примере диск **sdb** массива **md0** будет помечен сбойным._ +> +> Теперь удаляем: +> +> `mdadm /dev/md0 --remove /dev/sdc + +Теперь добавим новый: + +`mdadm /dev/md0 --add /dev/sde + +Смотрим состояние массива: + +`mdadm -D /dev/md0 + +... +       Update Time : Thu Mar  7 20:57:13 2019 +             State : clean, degraded, recovering +... +    Rebuild Status : 40% complete +... + +_* **recovering** говорит, что RAID восстанавливается; **Rebuild Status** — текущее состояние восстановления массива (в данном примере он восстановлен на **40%**)._ + +Если синхронизация выполняется слишком медленно, можно увеличить ее скорость. Для изменения скорости синхронизации вводим: + +`echo '10000' > /proc/sys/dev/raid/speed_limit_min + +_* по умолчанию скорость **speed_limit_min** = 1000 Кб, **speed_limit_max** — 200000 Кб. Для изменения скорости, можно поменять только минимальную._ + +### Пересборка массива + +Если нам нужно вернуть ранее разобранный или развалившийся массив из дисков, которые уже входили в состав RAID, вводим: + +`mdadm --assemble --scan + +_* данная команда сама найдет необходимую конфигурацию и восстановит RAID._ + +Также, мы можем указать, из каких дисков пересобрать массив: + +`mdadm --assemble /dev/md0 /dev/sdb /dev/sdc + +=============================================== + +**Чтобы вытащить данные из одного диска RAID-1 в Ubuntu, можно попробовать следующее:** + +При подключении одного жесткого диска к моей машине Ubuntu `fdisk -l`отчеты: + +``` +Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors + Units: sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 4096 bytes +I/O size (minimum/optimal): 4096 bytes / 4096 bytes +Disklabel type: gpt +Disk identifier: D1C4E003-11FD-4223-AA98-61CB9C6322BD + +Device Start End Sectors Size Type +/dev/sdb1 2048 1050623 1048576 512M Linux swap +/dev/sdb2 3147776 3904929899 3901782124 1.8T Microsoft basic data +/dev/sdb3 3904931840 3907029134 2097295 1G Microsoft basic data +/dev/sdb4 1050624 3147775 2097152 1G Microsoft basic data +``` + +Я попробовал шаги из похожего вопроса на этом сайте: + +``` +root@host:/mnt# mount /dev/sdb2 /mnt/old_nas/ +mount: /mnt/old_nas: unknown filesystem type 'linux_raid_member'. + +root@host:/mnt# mdadm --assemble --run /dev/md0 /dev/sdb2 +mdadm: failed to RUN_ARRAY /dev/md0: Invalid argument +mdadm: Not enough devices to start the array. +``` + +Предположим, /deb/sdb2 — это старый участник raid 1, который вы хотите восстановить. + +**Первый вариант** : попробуйте заново собрать RAID 1 со старым диском: + +Вам необходимо собрать деградировавший RAID-массив на новой машине, используя что-то вроде этого: + +``` +mdadm --force --assemble --run /dev/md0 /dev/sdb2 +``` + +Конечно, выберите номер помимо md0, если он уже используется. Затем вы можете смонтировать /dev/md0, где захотите. + +Другой вариант: + +``` +mdadm --force --run --assemble --scan +``` + +Вы получите что-то вроде этого: + +``` +mdadm: /dev/md/0 has been started with 1 drive (out of 2) +``` + +Затем смонтируйте и просмотрите свои файлы: + +``` +cd /mnt && mkdir md0 && mount /dev/md0 md0 +ls -la md0 +``` + +Наконец, вы можете добавить второй диск в массив: + +``` +mdadm /dev/md0 --manage --add /dev/sdc1 +``` + +**Второй вариант** : использование циклического устройства только для чтения + +Получите смещение данных для старого диска: + +``` +mdadm --examine /dev/sdb2 | grep -i offset +``` + +Создайте петлевое устройство (представим, что смещение данных равно 2048): + +``` +losetup --find --show --read-only --offset $((2048*512)) /dev/sdb2 +``` + +Смонтируйте печатное устройство петли, полученное в результате предыдущей команды. + +``` +mount -o ro /dev/loo1 /mnt/ +``` + +Mount может сделать это напрямую с помощью опций -o ro,loop,offset=: + +``` +mount -o ro,loop,offset=$((2048*512)) /dev/sdb2 /mnt +``` + +Насколько я понимаю, проблема, с которой вы столкнулись, может быть связана с тем, что mdadm считает ваш массив RAID 1 "чистым", что не так. Перед тем, как извлечь диск из массива, вы должны явно сообщить mdadm, что ваш второй диск (sdb2) вышел из строя: + +``` +mdadm --manage /dev/md0 --fail /dev/sdb2 +mdadm --manage /dev/md0 --remove /dev/sdb2 +``` + +=============================================== +## Запасной диск (Hot Spare) + +Если в массиве будет запасной диск для горячей замены, при выходе из строя одного из основных дисков, его место займет запасной. + +Диском Hot Spare станет тот, который просто будет добавлен к массиву: + +`mdadm /dev/md0 --add /dev/sdd + +Информация о массиве изменится, например: + +`mdadm -D /dev/md0 + +... +    Number   Major   Minor   RaidDevice State +       0       8       16        0      active sync   /dev/sdb +       2       8       48        1      active sync   /dev/sdc + +       3       8       32        -      spare   /dev/sdd + +Проверить работоспособность резерва можно вручную, симулировав выход из строя одного из дисков: + +`mdadm /dev/md0 --fail /dev/sdb + +И смотрим состояние: + +`mdadm -D /dev/md0 + +... +    Rebuild Status : 37% complete +... +    Number   Major   Minor   RaidDevice State +       3       8       32        0      spare rebuilding   /dev/sdd +       2       8       48        1      active sync   /dev/sdc + +       0       8       16        -      faulty   /dev/sdb +... + +_* как видим, начинается ребилд. На замену вышедшему из строя **sdb** встал hot-spare **sdd**._ + +## Добавить диск к массиву + +В данном примере рассмотрим вариант добавления активного диска к RAID, который будет использоваться для работы, а не в качестве запасного. + +Добавляем диск к массиву: + +`mdadm /dev/md0 --add /dev/sde + +Новый диск мы увидим в качестве spare: + +4       8       16        -      spare   /dev/sde + +Теперь расширяем RAID: + +`mdadm -G /dev/md0 --raid-devices=3 + +_* в данном примере подразумевается, что у нас RAID 1 и мы добавили к нему 3-й диск._ + +## Удаление массива + +При удалении массива внимательнее смотрите на имена массива и дисков и подставляйте свои значения. + +Если нам нужно полностью разобрать RAID, сначала размонтируем и остановим его: + +`umount /mnt + +_* где **/mnt** — каталог монтирования нашего RAID._ + +> Если мы получим ошибку **umount: /mnt: target is busy**, то смотрим пользовательские процессы, которые мешают отмонтировать раздел: +> +> `fuser -vm /mnt +> +> И останавливаем их. + +`mdadm -S /dev/md0 + +_* где **/dev/md0** — массив, который мы хотим разобрать._ + +> Если мы получим ошибку **mdadm: fail to stop array /dev/md0: Device or resource busy**, с помощью команды +> +> `lsof -f -- /dev/md0 +> +> ... смотрим процессы, которые используют раздел и останавливаем их. + +Затем очищаем суперблоки на всех дисках, из которых он был собран: + +`mdadm --zero-superblock /dev/sdb + +`mdadm --zero-superblock /dev/sdc + +`mdadm --zero-superblock /dev/sdd + +_* где диски **/dev/sdb**, **/dev/sdc**, **/dev/sdd** были частью массива md0._ + +А также удаляем метаданные и подпись: + +`wipefs --all --force /dev/sd{b,c,d} + diff --git a/LINUX/DISK/NTFS.md b/LINUX/DISK/NTFS.md new file mode 100644 index 0000000..c813187 --- /dev/null +++ b/LINUX/DISK/NTFS.md @@ -0,0 +1,57 @@ +### Установка компонентов + +Для начала необходимо установить пакет ntfs-3g. В противном случае, при попытке запустить команду на монтирование раздела NTFS мы получим ошибку **mount: unknown filesystem type 'ntfs'.** + +В зависимости от дистрибутива Linux, наши действия будут отличаться. + +**а) Linux Deb (Debian / Ubuntu / Astra):** + +apt update + +apt install ntfs-3g + +**б) Linux RPM (Rocky / РЕД ОС / CentOS):** + +yum install epel-release + +yum install ntfs-3g + +После установки данного пакета в системе появятся дополнительные команды **mount.ntfs-fuse** и **mount.ntfs-3g**., а также команда mount распознает опцию -t ntfs. + +### Ручное монтирование + +Монтирование NTFS на чтение и запись выполняется любой из трех команд: + +mount -t ntfs /dev/sdb1 /mnt + +или:  + +mount -t ntfs-3g /dev/sdb1 /mnt + +или + +mount.ntfs-3g /dev/sdb1 /mnt + +_* в данном примере, примотировано устройство **/dev/sdb1** в раздел **/mnt**. Понять, какой устройство нужно монтировать можно при помощи команды **fdisk -l**_ + +### Автоматическое монтирование + +Чтобы раздел автоматически монтировался при перезапуске компьютера, открываем на редактирование файл: + +vi /etc/fstab + +Добавляем строку: + +/dev/sdb1     /mnt      ntfs    defaults    0 0 + +_* в данном примере мы раздел /dev/sdb1 будем монтировать в каталог /mnt._ + +Чтобы применить настройку и проверить ее, вводим: + +mount -a + +Посмотреть примонтированные разделы и файловые системы можно командой: + +df -hT + + diff --git a/LINUX/DISK/SMARTMONTOOLS.md b/LINUX/DISK/SMARTMONTOOLS.md new file mode 100644 index 0000000..4101b02 --- /dev/null +++ b/LINUX/DISK/SMARTMONTOOLS.md @@ -0,0 +1,85 @@ +```sh +sudo apt install smartmontools + +# узнаём какие диски подключены: +ls -l /dev | grep -E 'sd|hd' +#  или: +smartctl --scan +lsblk + +# отображение информации о диске: +smartctl --info /dev/sda + +# запустить проверку: +smartctl -s on -a /dev/sda + +# Здесь опция -s включает флаг SMART на указном устройстве. Вы можете его убрать если поддержка SMART уже включена. Информация о диске разделена на несколько разделов, В разделе **READ SMART DATA** находится общая информация о здоровье жесткого диска. + +`=== START OF READ SMART DATA SECTION === SMART overall-health self-assessment rest result: PASSED` + +# Этот тест может быть пройден (PASSED) или нет (FAILED). В последнем случае сбой неизбежен, начинайте резервное копирование данных с этого диска. +``` +Следующая вещь которую можно посмотреть, когда выполняется диагностика HDD в linux, это таблица SMART атрибутов. + +[![](https://losst.pro/wp-content/uploads/2015/08/Snimok-ekrana-ot-2020-05-14-14-20-12-1024x576.png)](https://losst.pro/wp-content/uploads/2015/08/Snimok-ekrana-ot-2020-05-14-14-20-12.png) + В SMART таблице записаны параметры, определенные для конкретного диска разработчиком, а также порог отказа для этих параметров. Таблица заполняется автоматически и обновляется на основе прошивки диска. + +- **ID #** - идентификатор атрибута, как правило, десятичное число между 1 и 255; +- **ATTRIBUTE_NAME** - название атрибута; +- **FLAG** - флаг обработки атрибута; +- **VALUE** - это поле представляет нормальное значение для состояния данного атрибута в диапазоне от 1 до 253, 253 - лучшее состояние, 1 - худшее. В зависимости от свойств, начальное значение может быть от 100 до 200; +- **WORST** - худшее значение value за все время; +- **THRESH** - самое низкое значение value, после перехода за которое нужно сообщить что диск непригоден для эксплуатации; +- **TYPE** - тип атрибута, может быть Pre-fail или Old_age. Все атрибуты по умолчанию считаются критическими, то-есть если диск не прошел проверку по одному из атрибутов, то он уже считается не пригодным (FAILED) но атрибуты old_age не критичны; +- **UPDATED** - показывает частоту обновления атрибута; +- **WHEN_FAILED** - будет установлено в **FAILING_NOW** если значение атрибута меньше или равно THRESH, или в "**-**" если выше. В случае **FAILING_NOW**, лучше как можно скорее выполнить резервное копирование, особенно если тип атрибута **pre-fail**. +- **RAW_VALUE** - значение, определенное производителем. + + +## Автоматическая диагностика в smartd + +Автоматическая диагностика HDD в Linux настраивается очень просто. Сначала отредактируйте файл конфигурации smartd - /etc/smartd.conf. Добавьте следующую строку: + + `nano /etc/smartd.conf` + +`/dev/sda -m myemail@mydomain.com -M test` + +Здесь: + +- **-m ** - адрес электронной почты для отправки результатов проверки. Это может быть адрес локального пользователя, суперпользователя или внешний адрес, если настроен сервер для отправки электронной почты; +- **-M** - частота отправки писем. once - отправлять только одно сообщение о проблемах с диском. **daily** - отправлять сообщения каждый день если была обнаружена проблема. **diminishing** - отправлять сообщения через день если была обнаружена проблема. **test** - отправлять тестовое сообщение при запуске smartd. **exec** - выполняет указанную программу в место отправки почты. + +Сохраните изменения и перезапустите **smartd**: + +`sudo systemctl restart smartd` + +Вы должны получить на электронную почту письмо о том, что программа была запущена успешно. Это будет работать только если на компьютере настроен почтовый сервер. + +[![](https://losst.pro/wp-content/uploads/2015/08/Snimok-ekrana-ot-2020-05-14-15-27-39-1024x576.png)](https://losst.pro/wp-content/uploads/2015/08/Snimok-ekrana-ot-2020-05-14-15-27-39.png) + +Также можно запланировать тесты по своему графику, для этого используйте опцию **-s** и регулярное выражение типа **T/MM/ДД/ДН/ЧЧ**, где: + +Здесь **T** - тип теста: + +- **L** - длинный тест; +- **S** - короткий тест; +- **C** - тест перемещения (ATA); +- **O** - оффлайн тест. + +Остальные символы определяют дату и время теста: + +- **ММ** - месяц в году; +- **ДД** - день месяца; +- **ЧЧ** - час дня; +- **ДН** -  день недели (от 1 - понедельник 7 - воскресенье; +- **MM, ДД и ЧЧ** - указываются с двух десятичных цифр. + +Точка означает все возможные значения, выражение в скобках (A|B|C) - означает один из трех вариантов, выражение в квадратных скобках [1-5] означает диапазон (от 1 до 5). + +Например, чтобы выполнять полную проверку жесткого диска linux каждый рабочий день в час дня добавьте опцию **-s** в строчку конфигурации вашего устройства: + +`/dev/sda -m myemail@mydomain.com -M once -s (L /../../[1-5]/13)` + +Если вы хотите чтобы утилита сканировала и проверяла все устройства, которые есть в системе используйте вместо имени устройства директиву DEVICESCAN: + +`DEVICESCAN -m myemail@mydomain.com -M once -s (L /../../[1-5]/13)` \ No newline at end of file diff --git "a/LINUX/DISK/SOFT RAID1 (mdadm) \320\263\320\276\321\200\321\217\321\207\320\260\321\217 \320\267\320\260\320\274\320\265\320\275\320\260 \320\264\320\270\321\201\320\272\320\260.md" "b/LINUX/DISK/SOFT RAID1 (mdadm) \320\263\320\276\321\200\321\217\321\207\320\260\321\217 \320\267\320\260\320\274\320\265\320\275\320\260 \320\264\320\270\321\201\320\272\320\260.md" new file mode 100644 index 0000000..b8935d7 --- /dev/null +++ "b/LINUX/DISK/SOFT RAID1 (mdadm) \320\263\320\276\321\200\321\217\321\207\320\260\321\217 \320\267\320\260\320\274\320\265\320\275\320\260 \320\264\320\270\321\201\320\272\320\260.md" @@ -0,0 +1,26 @@ +```sh +# Смотрим диски: +cat /proc/mdstat +lsblk + +# Смотрим SMART: +sudo smartctl -a /dev/sda +# смотрим: -Rellocated Sector_ct +# -Current_Pending_Sector + +# Копируем и сохраняем Serial Number плохого диска + +# Открываем в разных окнах: +watch n1 cat /proc/mdstat + +# Говорим что sdc1 в md0 это fail: +sudo mdadm /dev/md0 --fail /dev/sdc1 + +# Удаляем sdc1 из md0: +sudo mdadm /dev/md0 --remove /dev/sdc1 + +sudo vim /etc/mdadm.conf +# В файле нужно указать опцию: +MAILADDR vlapa@ya.ru +``` + diff --git "a/LINUX/DISK/WD - \320\260\320\262\321\202\320\276\320\277\320\260\321\200\320\272\320\276\320\262\320\272\320\260.md" "b/LINUX/DISK/WD - \320\260\320\262\321\202\320\276\320\277\320\260\321\200\320\272\320\276\320\262\320\272\320\260.md" new file mode 100644 index 0000000..43da641 --- /dev/null +++ "b/LINUX/DISK/WD - \320\260\320\262\321\202\320\276\320\277\320\260\321\200\320\272\320\276\320\262\320\272\320\260.md" @@ -0,0 +1,51 @@ +```sh +sudo apt install idle3-tools + +# Чтобы получить текущее значение времени парковки нужно выполнить полученный в процессе сборки файл idle3ctl со следующим параметром: +idle3ctl -g /dev/sda + +# Отключить idle3 таймер: +idle3ctl -d /dev/sda + +# Выставить таймер на 10 секунд: +idle3ctl -s 100 /dev/sda +``` +Дополнительные опции указаны на сайте программы и доступны по ключу -h. + +Чтобы новые значения вступили в действие нужно выключить и включить диск, по-этому после установки нового значения таймера программа попросит вас перезагрузиться. + +Проверено на двух 2TB WD20EARX. Счетчик количества парковок перестал так быстро расти, интенсивность уменьшилась до нескольких парковок в час. + +========================================== +#### Western Digital - отключение автопарковки в дисках серии EARS + +Заглянув в очередной раз в параметры SMART диска Western Digital(WD) серии Green (WD15EARS) увидел аномально высокое значение Load_Cycle_Count: + +manumba ~ # smartctl -A /dev/sdb +... +193 Load_Cycle_Count 0x0032 194 194 000 Old_age Always - 18713 +... + +Для сравнения параметры SMART диска WD серии BLACK: + +manumba ~ # smartctl -A /dev/sdc +... +193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 18 +... + +Load_Cycle_Count - показывает количество парковок диска. Почитав информацию в интернете узнал что диски WD серии Green паркуются с целью энергосбережения. +Понаблюдав за параметром Load_Cycle_Count диска WD15EARS обнаружил что он увеличивается на 200 каждые сутки. Это примерно 72000 парковок в год. Согласно данным производителя, предел количества парковок для дисков WD Green находится на отметке около 600 000 парковок, т.е. при данном темпе парковок диску отмерено около 8-9 лет. С одной стороны за это время диск морально устареет, или (все может быть) выйдет из строя по другим причинам. С другой стороны взбредет что то прошивке диска, изменится характер нагрузки на диск, и вдруг диск начнет парковаться с скоростью 1000 парковок в день? Поскольку энергосбережение 10-15 ватт для домашнего компьютера мало значит, думаю выгодней отключить эту странную функцию. + +### Отключение автопарковки + +Для отключения автопарковки нужно использовать утилиту wdidle3 от WD. Утилита для DOS, поэтому лучше скачать какой нибудь LiveCD содержащий эту утилиту, для того что бы удобно запустить оную. Например [HirenBootCD](http://rutracker.org/forum/viewtopic.php?t=3419055 "http://rutracker.org/forum/viewtopic.php?t=3419055"). Итак: + +- Скачиваем [HirenBootCD](http://rutracker.org/forum/viewtopic.php?t=3419055 "http://rutracker.org/forum/viewtopic.php?t=3419055"). +- Выключаем компьютер. +- Отключаем все диски кроме WD15EARS, на котором мы будем отключать автопарковку (это рекомендовано WD и сторонними источниками в интернете). +- Загружаемся в HirenBootCD и выбираем из Hard Disk tools: wdidle3. +- В командной строке набираем wdidle3.exe /D (Эта команда отключит функцию автопарковки) +- Выключаем компьютер. +- Подключаем все остальные диски обратно. +- Включаем BIOS, восстанавливаем порядок дисков в BIOS (иначе первым диском по версии BIOS может оказаться диск на котором отключалась автопарковка, что в случае если порядок дисков был раньше другой, может стать удивительным открытием для GRUB) +- Загружаемся и радуемся отключенной автопарковке. \ No newline at end of file diff --git "a/LINUX/DISK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 USB \320\275\320\260\320\272\320\276\320\277\320\270\321\202\320\265\320\273\321\217 \320\262 \320\267\320\260\320\264\320\260\320\275\320\275\321\203\321\216 \320\277\320\260\320\277\320\272\321\203.md" "b/LINUX/DISK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 USB \320\275\320\260\320\272\320\276\320\277\320\270\321\202\320\265\320\273\321\217 \320\262 \320\267\320\260\320\264\320\260\320\275\320\275\321\203\321\216 \320\277\320\260\320\277\320\272\321\203.md" new file mode 100644 index 0000000..0f2b882 --- /dev/null +++ "b/LINUX/DISK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 USB \320\275\320\260\320\272\320\276\320\277\320\270\321\202\320\265\320\273\321\217 \320\262 \320\267\320\260\320\264\320\260\320\275\320\275\321\203\321\216 \320\277\320\260\320\277\320\272\321\203.md" @@ -0,0 +1,34 @@ +Этот скрипт автоматически монтирует USB-накопитель в указанную директорию при подключении. Полезен для серверов, киосков и систем с минимальным GUI. + +```sh +#!/bin/bash + +# Точка монтирования +MOUNT_DIR="$HOME/usb_mount" + +# Создаём папку, если её нет +mkdir -p "$MOUNT_DIR" + +# Ищем новое USB-устройство +DEVICE=$(lsblk -o NAME,TYPE,HOTPLUG | awk '$2 == "disk" && $3 == 1 {print $1}' | tail -n1) + +# Если устройство найдено +if [ -n "$DEVICE" ]; then +    # Получаем раздел (например, sdb1) +    PARTITION="/dev/${DEVICE}1" + +    # Монтируем раздел +    sudo mount "$PARTITION" "$MOUNT_DIR" + +    echo "✅ Устройство $PARTITION смонтировано в $MOUNT_DIR" +else +    echo "❌ USB-устройство не найдено" +fi +``` + +🟢 Использует lsblk для поиска подключённых устройств +🟢 Автоматически монтирует первый раздел USB-устройства +🟢 Создаёт директорию монтирования, если она отсутствует. + +➡️ **Скрипт можно запускать вручную или автоматически через** udev**-триггеры.** + diff --git "a/LINUX/DISK/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271 raid \320\262 Linux.md" "b/LINUX/DISK/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271 raid \320\262 Linux.md" new file mode 100644 index 0000000..af8e621 --- /dev/null +++ "b/LINUX/DISK/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\321\213\320\271 raid \320\262 Linux.md" @@ -0,0 +1,169 @@ +### Доступны такие режимы: + +- **RAID 0** - позволяет увеличить скорость записи. Все диски массива будут использоваться для записи данных, поэтому их скорости будут складываться. Например, если у вас есть три диска объемом 512 Гб и скоростью записи 200 Мб в секунду, то объединив их в RAID 0 вы получите виртуальный диск объемом 1,5 Тб и максимальной скоростью записи 600 Мб в секунду. +- **RAID 1** - этот режим увеличивает сохранность данных. Во время записи одни и те же данные пишутся параллельно на подключённые диски. В результате у вас будет несколько копий одних и тех же данных. Если один из дисков массива выйдет из строя, система продолжит работать, так как данные есть ещё и на другом диске. Например, если вы объедините два диска по 1 Тб в RAID 1, то получите один виртуальный диск с объемом 1 Тб. +- **RAID 10** - объединяет в себе два предыдущих варианта. Он может состоять как минимум из четырех дисков. В таком случае сначала создаются два массива RAID 1, а поверх них создается массив RAID 0 для увеличения производительности. + +Конечно, существуют и другие режимы работы, но эти самые популярные. В сегодняшней статье мы рассмотрим как создать программный RAID уровней 0 и 1. + +## Создание программного RAID в Linux + +### Шаг 1. Установка mdadm + +Для управления программными RAID массивами в Linux используется утилита mdadm. Для того чтобы установить её в Ubuntu или Debian выполните такую команду: + +`sudo apt install mdadm` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid4-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid4.png) + +Для установки утилиты в CentOS/Fedora/RedHat необходимо выполнить: + +`sudo yum install mdadm` + +### Шаг 2. Подготовка дисков + +Посмотреть список дисков, подключённых к системе можно с помощью команды lsblk: + +`lsblk` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid.png) + +В этой статье я покажу как объединить три диска в RAID на примере дисков **/dev/sda**, **/dev/sdb** и **/dev/sdc**. Сначала необходимо определиться стоит ли размещать RAID непосредственно на диски или на разделы. Лучше выбрать разделы, так как это дает больше гибкости и безопасности. Во первых, операционная система может перезаписать суперблок RAID если он размещён прямо на диске. Во вторых, если вы выделяете весь диск под RAID, то у вас могут возникнуть проблемы при замене диска. Диски одинакового объема, обычно, немного отличаются у разных производителей. Поэтому для замены вам придется искать точно такой же диск с точно таким же реальным объемом. Если же у вас будет раздел, вы просто сможете создать раздел нужного объема. + +Сначала нужно создать таблицу разделов на всех выбранных дисках: + +`sudo parted /dev/sda mklabel msdos` +`sudo parted /dev/sdb mklabel msdos` +`sudo parted /dev/sdc mklabel msdos` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid1-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid1.png) + +Если на диске уже существует таблица разделов программа предупредит о том, что создание новой сотрёт все данные с диска. После создания таблицы разделов следует создать по разделу на каждом диске. Например, создадим разделы размером 460 гигабайт. Для этого можно воспользоваться той же командой parted: + +`sudo parted /dev/sda mkpart primary ext4 2048 460Gb` +`sudo parted /dev/sdb mkpart primary ext4 2048 460Gb` +`sudo parted /dev/sdc mkpart primary ext4 2048 460Gb` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid2-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid2.png) + +Теперь диски готовы к размещению на них RAID: + +[![](https://losst.pro/wp-content/uploads/2021/06/raid3-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid3.png) + +### Шаг 3. Создание RAID 0 + +Для создания RAID массива надо выполнить команду mdadm с опцией --create, указать режим работы массива, количество дисков и сами диски. Синтаксис команды такой: + +**$ sudo mdadm --create /dev/имя_массива --level=режим_работы --raid-devices=количество_устройств список устройств** + +Например: + +`sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid5-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid5.png) + +После выполнения этой команды вы увидите раздел raid в lsblk. С этим разделом можно работать как с любым обычным разделом в вашей системе. + +### Шаг 4. Тестирование RAID 0 + +Давайте для примера отформатируем полученный раздел в файловую систему Ext4, смонтируем и попробуем записывать туда файлы: + +`sudo mkfs -t ext4 /dev/md0` +`sudo mount /dev/md0 /mnt` + +Затем можно тестировать скорость с помощью dd: + +`sudo dd if=/dev/zero of=/mnt/file bs=1G count=5` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid8-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid8.png) + +Как видите, при записи 5 Гб данных мы получаем скорость 400 Мб/сек, это уже на уровне обычного SSD. + +### Шаг 5. Информация о RAID + +Найти информацию обо всех созданных в системе RAID массивах вы можете в файле **/proc/mdstat:** + +`cat /proc/mdstat` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid9-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid9.png) + +Именно так можно посмотреть RAID Linux. Посмотреть более детальную информацию о массиве /dev/md0 можно с помощью самой утилиты mdadm: + +`sudo mdadm --detail /dev/md0` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid10-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid10.png) + +Здесь в том числе отображается состояние RAID Linux. Посмотреть детальную информацию о каждом устройстве, которое входит в RAID можно с помощью опции **--examine**: + +`sudo mdadm --examine /dev/sda1 /dev/sdb1 /dev/sdc1` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid11-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid11.png) + +### Шаг 6. Сохранение RAID массива + +В принципе, уже сейчас RAID массив работает и продолжит работать после перезагрузки, потому что mdadm просканирует все диски, найдёт метаданные массива и построит его. Но неизвестно какое имя программа присвоит полученному массиву и неизвестно все ли параметры будут восстановлены верно. Поэтому конфигурацию массива лучше сохранить. Для этого используйте такую команду: + +`sudo mdadm --detail --scan --verbose | sudo tee -a /etc/mdadm/mdadm.conf` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid12-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid12.png) + +Затем нужно пересоздать initramfs с поддержкой этого массива: + +`sudo update-initramfs -u` + +С полученным массивом можно обращаться как с обычным разделом диска. Например, для того чтобы автоматически монтировать его в систему добавьте такую строчку в /etc/fstab: + +`sudo vi /etc/fstab` + +`/dev/md0 /mnt/ ext4 defaults 0 0` + +На этом создание raid массива linux завершено. + +### Шаг 7. Переименование RAID массива + +Если вы не выполните предыдущий пункт и перезагрузите компьютер, то можете получить RAID массив с именем md127 вместо md0, такое имя также может быть присвоено второму RAID массиву. Для того чтобы переименовать массив, его придется пересобрать. Для этого сначала остановите существующий массив: + +`sudo mdadm --stop /dev/md127` + +Затем выполните команду переименования. Синтаксис у неё такой: + +**$ sudo mdadm --assemble --update=name --name=номер /dev/md_номер список устройств** + +Например: + +`sudo mdadm --assemble --update=name --name=0 /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1` + +После этого следует повторить предыдущий шаг для уже правильного сохранения RAID устройства. + +### Шаг 8. Удаление RAID массива + +Если вы не хотите чтобы ваши диски и дальше были объединены в RAID, его можно удалить. Для этого выполните такую команду: + +`sudo mdadm --remove /dev/md0` + +Она удалит все метаданные с дисков /dev/md0. Дальше останется только удалить или закомментировать секцию данного RAID массива в /etc/mdadm/mdadm.conf + +`sudo vi /etc/mdadm/mdadm.conf` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid13-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid13.png) +### Шаг 10. Создание массива RAID 1 + +Теперь вы знаете как создать raid linux на примере RAID 0. Давайте ещё разберемся с RAID 1. Для создания RAID 1 используется такая же команда как и для RAID 0, но указывается другой уровень работы массива: + +`sudo mdadm --create /dev/md0 --level=1 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1` + +Затем вы можете убедится что RAID создан посмотрев информацию о нём: + +`sudo mdadm --detail /dev/md0` + +Ну и с помощью lsblk можно оценить размер устройства: + +`lsblk` + +[![](https://losst.pro/wp-content/uploads/2021/06/raid14-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid14.png) + +Как и ожидалось, размер не увеличился, поскольку копии данных будут записываться на все три диска. Теперь давайте посмотрим на скорость: + +[![](https://losst.pro/wp-content/uploads/2021/06/raid15-830x576.png)](https://losst.pro/wp-content/uploads/2021/06/raid15.png) + +Скорость записи данных такая же как и у одного диска. Это цена сохранности данных. Если вы отключите один из дисков, то все данные всё равно будут вам доступны. \ No newline at end of file diff --git a/LINUX/DOCKER.md b/LINUX/DOCKER.md new file mode 100644 index 0000000..0f6c942 --- /dev/null +++ b/LINUX/DOCKER.md @@ -0,0 +1,87 @@ +**Собираем минимальный Docker образ** + +**Docker** — это инструмент для запуска приложений в изолированных контейнерах. Он делает разработку и развертывание проще, быстрее и безопаснее. + +**Нужен он для:** изоляции приложений и зависимостей, переносимости (софтина работает одинаково  на любой системе) и DevOps-процессов. + +**Плюсы докера:** простота развёртывания, экономия ресурсов по сравнению с виртуальными машинами, стандартизация окружения. + +**Минусы докера:** не подходит для задач, требующих полной виртуализации, не оптимален для GUI-приложений, требует грамотной настройки безопасности. + +Минимальный пример запуска первого **Docker-контейнера** с **Python** (**FastAPI**): + +1. Для развертывания для начала создадим новый проект и установим зависимости. Если не имели раньше дела с питухоном питоном и докером, также скачиваем все необходимое: +```sh +sudo apt install python3 python3-pip -y +sudo apt install docker.io -y +``` +После установки создаем рабочую папку: + +```sh +mkdir fastapi_backend && cd fastapi_backend +``` + +Активируем виртуальное окружение, чтобы изолировать зависимости проекта и с помощью команды **pip freeze** автоматически сформировать **requirements.txt**, не заполняя его вручную: + +```sh +python3 -m venv venv +source venv/bin/activate +``` +Cкачиваем необходимые для создания API зависимости с помощью пакетного менеджера pip и сохраняем их в **requirements.txt**: + +```sh +pip install fastapi uvicorn +pip freeze > requirements.txt +``` +2. Создадим в каталоге проекта файл "**main.py**" с простым **API**: + +```sh +touch main.py +``` + +```python +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/") +def read_root(): +    return {"Hello": "LinuxCamp"} +``` +3. Ну и наконец добавим в локальный каталог сам **Dockerfile** - это инструкция по созданию **docker** контейнера. Cейчас приведу общий пример, в следующих постах подробнее разберем его структуру: +```docker +FROM python:3.11-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD ["uvicorn", "main:app", "--host", "127.0.0.1", "--port", "8000"] +``` + +4. На этом все! Мы уже можем собрать свой **Docker-образ** и запустить его, после чего приложение будет доступно по адресу ниже: + +```sh +sudo docker build -t myapp . +sudo docker run -d -p 8000:8000 myapp +``` + +```sh +curl -L http://127.0.0.1:8000  +{"Hello":"LinuxCamp"} +``` +http://127.0.0.1:8000 + +Также можно посмотреть наличие нашего docker контейнера в списке запущенных контейнеров с помощью команды **docker ps**: + +```sh +docker ps + +CONTAINER ID   IMAGE                     +COMMAND              +640d6f4d1acb   fastapi_backend   +"uvicorn main:app --…" +``` diff --git a/LINUX/ENVIRONMENT.md b/LINUX/ENVIRONMENT.md new file mode 100644 index 0000000..85cfb8d --- /dev/null +++ b/LINUX/ENVIRONMENT.md @@ -0,0 +1,30 @@ +Системные переменные окружения: +`/etc/enviroments` +==`echo $PATH`== + +Сессионные переменные пользователя: +`.bashrc` +`export WORKON_HOME = ~/.envs` + +Системный bashrc (только локально): +`/etc/bash.bashrc` + +Системный profile (только для ВСЕХ удаленных): +`/etc/profile` + +Переменные SSH сессии: +`.bash_profile` + +После каждого изменения: +`source file_name` +или выход/вход в сессию + + +Создание с помощью файла: +`vim setenv.sh` +`export VAR1=234` +`export VAR2=hdhdy` +`export VAR3=7564888` + +запускаем файл: +==`./setenv.sh`== diff --git a/LINUX/EXIFTOOL.md b/LINUX/EXIFTOOL.md new file mode 100644 index 0000000..e68a0f3 --- /dev/null +++ b/LINUX/EXIFTOOL.md @@ -0,0 +1,41 @@ +🔍  **ExifTool — универсальный инструмент для анализа и правки метаданных** + +Если ты работаешь с фото, видео, документами или архивами — exiftool поможет тебе **увидеть, изменить или удалить метаданные** в любых файлах. + +💡  **Поддерживает более 130 форматов, включая:** +✔️ JPG, PNG, TIFF   +✔️ PDF, DOCX, XLSX   +✔️ MP4, MOV, AVI   +✔️ ZIP, RAR, ISO   +✔️ даже .exe, .torrent и .psd + +📌 **Установка (Debian/Ubuntu):** +`sudo apt install libimage-exiftool-perl + +🔧 **Основные команды:** + +📖 Посмотреть все метаданные файла: +`exiftool файл.jpg + +✏️ Удалить все метаданные: +`exiftool -all= файл.jpg + +🔁  Изменить дату создания: +`exiftool -CreateDate="2024:01:01 12:00:00" файл.jpg + +📝  Переименовать фото по дате съёмки: +`exiftool '-FileName -prune -o -name "*.json" - print + +find . -type d -name "* -prune -o -name "*.json" - print + +# поиск без учета регистра: +find . -iname "*.JSoN" + +# поиск файлов которые были изменены ДО: +find . -type f -atime 0 # =0= суток + +# или ПОСЛЕ: +find . -type f -mtime 0 # =0= суток + +# найти файлы доступ к которому был позднее чем: +find . -type f -anewer + +# найти файлы измененные позднее чем: +find . -type f -cnewer + +# ищем файлы размером: +find . -type f -size 140M + +# ищем файлы размером больше чем: +find . -type f -size +140M + +# ищем файлы размером меньше чем: +find . -type f -size -140M + +# ищем файлы размером между: +find . -type f -size -140M -a -type f -size +120M + +# отображаем размер файлов с сортировкой по размеру: +find . -type f -exec du -sh {} \; | sort -h | tail -3 # или | head -3 + +# вывести содержимое всех файлов: +find . -type f -exec {} \; + +# вывести содержимое всех файлов с разделением: +find . -type f -exec ls -la {} \; -exec cat {} \; -exec echo "" \; +``` +======================================= +💡 Архивируйте и удаляйте логи старше 7 дней с помощью этой команды: + +`find /var/log -type f -mtime +7 -exec tar -rvf old_logs.tar {} \; -exec rm {} \; + +🌟 Вы также можете запланировать это в cron, чтобы автоматизировать очистку! + +======================================= +⚙️ **Поиск последних измененных файлов в Linux** + +Когда нужно найти недавно измененные файлы, например, для отладки или мониторинга активности, можно использовать команду find. + +**📌 Поиск файлов по времени изменения** + +**🟢 Найти файлы, измененные за последние 24 часа:** + +find /path/to/dir -type f -mtime -1 + +Выведет файлы, измененные за последние сутки. + +**🟢 Найти файлы, измененные за последние 10 минут:** + +find /var/log -type f -mmin -10 + +Полезно для отслеживания активных логов. + +**🟢 Вывести 10 последних измененных файлов:** + +ls -lt | head -10 + +Сортирует файлы по времени изменения и показывает 10 самых свежих. + +🗣 **Эти команды помогают быстро находить файлы, с которыми недавно работали, а также анализировать активность в системе.** + +======================================= +⚙️ **Поиск и удаление пустых файлов и папок в Linux** + +Со временем в системе накапливаются пустые файлы и каталоги, занимая место и создавая беспорядок. Эти команды помогут быстро их найти и удалить. + +**📌 Поиск и очистка пустых файлов и папок** + +**🟢 Найти все пустые файлы в каталоге:** + +find /path/to/dir -type f -empty + +Выведет список всех пустых файлов в указанной директории. + + +**🟢 Удалить все пустые файлы:** + +find /path/to/dir -type f -empty -delete + +Автоматически удалит все найденные пустые файлы. + + +**🟢 Найти все пустые папки:** + +find /path/to/dir -type d -empty + +Выведет список пустых каталогов. + + +**🟢 Удалить пустые папки:** + +find /path/to/dir -type d -empty -delete + +Очищает систему от ненужных пустых директорий. + +➡️ **Автоматическая проверка битых символических ссылок в Linux** +```sh +#!/bin/bash + +# Целевая директория +TARGET_DIR="$HOME" + +# Поиск и удаление битых симлинков +find "$TARGET_DIR" -xtype l -print -delete + +echo "✅ Все битые символические ссылки удалены из $TARGET_DIR" +``` +🟢 Использует find с флагом -xtype l для поиска битых ссылок +🟢 Удаляет только символические ссылки, указывающие на несуществующие файлы. + +➡️ **Можно добавить в crontab для автоматической очистки раз в месяц:** +`0 5 1 * * /path/to/script.sh + +🗣 **Эти команды помогают поддерживать порядок в системе и освобождать место на диске.** + +#========================= +🖥 Команда **find** очень мощная, но многие пользователи не осознают, насколько гибкой может быть опция -exec! + +🌟 Так можно найти и удалить все файлы .log, которым больше 7 дней: +`find /path/to/logs -type f -name "*.log" -mtime +7 -exec rm {} \; + +🌟 А вот так найти и сжать все файлы .txt: +`find /path/to/files -type f -name "*.txt" -exec gzip {} \; + diff --git "a/LINUX/Fail2ban - \320\236\321\201\320\275\320\276\320\262\321\213 \320\267\320\260\321\211\320\270\321\202\321\213 \321\201\320\265\321\200\320\262\320\265\321\200\320\276\320\262.md" "b/LINUX/Fail2ban - \320\236\321\201\320\275\320\276\320\262\321\213 \320\267\320\260\321\211\320\270\321\202\321\213 \321\201\320\265\321\200\320\262\320\265\321\200\320\276\320\262.md" new file mode 100644 index 0000000..6f7e476 --- /dev/null +++ "b/LINUX/Fail2ban - \320\236\321\201\320\275\320\276\320\262\321\213 \320\267\320\260\321\211\320\270\321\202\321\213 \321\201\320\265\321\200\320\262\320\265\321\200\320\276\320\262.md" @@ -0,0 +1,42 @@ + +**Fail2ban** — это инструмент, который автоматически блокирует IP-адреса, совершающие подозрительную активность (например, попытки подбора паролей). Он анализирует логи и применяет временные баны через брандмауэр. + +`sudo apt install fail2ban + +⚙️ **Базовая настройка** + +1. Создадим копию конфига: +`sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local + +2. Отредактируем `jail.local`. Он поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки. Добавим сервис, который нужно защищать, например SSH: +```sh +[DEFAULT] +ignoreip = 127.0.0.1/8 +bantime  = 600 +maxretry = 3 +banaction = iptables-multiport + +[ssh] +enabled  = true +port     = ssh +filter   = sshd +logpath  = /var/log/auth.log +maxretry = 6 +``` +• maxretry: количество неудачных попыток входа. +• bantime: время блокировки IP. + +Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force». + +Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены. + +3. После настройки, запускаем службу: +`sudo systemctl start fail2ban +`sudo systemctl enable fail2ban + +🔐 **Проверка работы** +• Посмотреть заблокированные IP: +`fail2ban-client status + +• Увидеть детали конкретного сервиса: +`fail2ban-client status ssh diff --git a/LINUX/GPG, PASS.md b/LINUX/GPG, PASS.md new file mode 100644 index 0000000..3720f0f --- /dev/null +++ b/LINUX/GPG, PASS.md @@ -0,0 +1,276 @@ +```sh +sudo su +apt install gpg + +gpg —full-gen-key + +# ставим 4096 бит +# 0 - ключ бессрочный +# y +# Real name: vlapa +# Email address: vlapa@ya.ru +# Comment: My Keys ! +# o +# Passphrase: `xxxxxxxxxx` +# мышь, клавиатура +``` + +```sh +echo "keyid-format 0xlong +> throw-keyids +> no-emit-version +> no-comments" > ~/.gnupg/gpg.conf + +gpg -k - публичный ключ +gpg -K - приватный ключ + +cd /tmp +echo "Hello World !" > /tmp/file.txt +ls +file.txt +cat file.txt +Hello World ! + + +# шифруем: +gpg -e -a -r vlapa@ya.ru file.txt + +# расшифровываем: +gpg -d -o file.txt file.txt.asc + +======================================== +# экспортируем: +gpg —export -a vlapa@ya.ru > pubkey.gpg +gpg —export-secret-key -a vlapa@ya.ru > seckey.gpg + +# Удаляем: +gpg —delete-secret-keys vlapa@ya.ru +gpg —delete-keys vlapa@ya.ru + +# импортируем: +gpg —import pubkey.gpg +gpg —import seckey.gpg + +# делаем доверенным: +gpg --edit-key +# - trust +# - 5 +# - Y +# - quit + +# Если нужно изменить пароль GPG-ключа (не содержимое записи) + +# Если вы сменили пароль самого GPG-ключа, но `pass` по-прежнему запрашивает старый, выполните: + +gpg --edit-key "Ваше_имя_или_email" + +# Затем в интерактивном меню введите: +passwd +save + +# Где найти имя ключа? +# Посмотрите в файле: +~/.password-store/.gpg-id +# там указано имя или ID ключа, используемого pass. + +======================================== +``` + +```sh +sudo apt install pass +which pass +pass init vlapa@ya.ru + +cd /root/.password-store/ +ls -la ~/.password-store/ + +# Добавить запись: +pass insert -m Email/mail.ru +конец - < ctrl+d > + +# Удалить запись: +pass rm Email/mail.ru + +# Редактировать запись: +pass edit Email/mail.ru + +# Система откроет файл в текстовом редакторе (по умолчанию заданный в переменной окружения $EDITOR или $VISUAL). + + +# Посмотреть запись: +pass Email/ya.ru + +# Помощь: +pass —-help | less + +# Сгенерировать: +pass generate email/vlapa.ru 25 + +# Получить пароль: +pass -c Email/ya.ru +# Будет предложено ввести мастер пароль Pass. Пароль будет находиться в буфере в течении 45 секунд. После чего буфер обмена будет очищен. + +# Если просто необходимо отобразить сохраненный пароль, просто удалите `-c` + +# Изменить данные пароля: +pass edit Email/ya.ru + +# =============================== + +pass git init +pass git remote add origin git@10.10.10.2:~/git/pass +pass git push +# commit делать не надо! +``` + +```sh +# Заменить первую строку в записи pass новым сгенерированным паролем, оказывается, можно так: + +pass generate -i Email/my@email.com 20 +``` + +============================================ +## Шифрование файлов при помощи GPG + +GNU Privacy Guard – это и есть GPG – свободная реализация шифрования данных для их защиты. Это очень актуально, ведь информацию, если она персональная, конфиденциальная или просто секретная необходимо защищать. Технология GPG основана на защите данных при помощи ключей шифрования, которые изначально должны быть созданы, а также соответствующим образом распространены между участниками обмена защищаемыми данными. + +Как работает защита данных с помощью ключей GPG + +Для того, чтобы стороны могли передавать друг другу зашифрованные данные, должен быть выполнен ряд условий: + +- наличие ключей шифрования GPG, которые представляют собой пару ключей — открытый и закрытый; + +- обе стороны должны обменяться открытыми ключами; + +- передающая сторона должна зашифровать данные с помощью + + открытого ключа, полученного от принимающей стороны при обмене + + этими ключами; + +- принимающая сторона при получении шифрованных данный должна + + расшифровать их своим закрытым ключом, открытой частью которого (т. е. открытым ключом) были зашифрованы данные передающей стороной. + + Отсюда вытекают два важных момента: + + +- расшифровать данные можно только закрытым ключом, который должен храниться у его владельца в надёжном и недоступном для посторонних месте; + +- данные всегда шифруются именно ключом адресата, т. е. того, кому нужно передать зашифрованные данные. + + Открытые ключи распространяются свободно. Ими можно обмениваться непосредственно, либо загружать на специальные сервера для хранения и обслуживания ключей GPG. + + Также необходимо иметь специальный сертификат для отзыва открытых ключей, чтобы сделать их недействительными. Кроме того механизм защиты данных по ключам позволяет подписывать отправляемые данные закрытым ключом, т. е. гарантировать, что эти данные отправлены именно тем, кто указан как отправитель. А соответствующий этому закрытому ключу открытый ключ, имеющийся у принимающей стороны может это подтвердить. Таким образом и достигается достоверная идентификация пользователей и надёжная защита передаваемых данных. + + Установка системы GPG в Linux + + Практически во всех популярных дистрибутивах Linux установить систему GPG позволяет система управления пакетами (СУП) этого дистрибутива. Например, для Ubuntu: + + `$ sudo apt install gnupg + + Наименования пакетов также могут различаться в зависимости от используемого дистрибутива, так для CentOS: + + `$ sudo yum install gnupg2 + + Теперь можно приступить к созданию самих ключей. + + Генерация и подпись ключей + + Для генерации и управления ключами системы GPG предназначена команда gpg. Более подробно с ней можно ознакомиться на страницах интерактивного руководства, используя команду man gpg. Для создания же, собственно, пары (открытый и закрытый) ключей нужно выполнить команду gpg с опцией —gen-key: + + +`$ gpg --gen-key + +В ходе выполнения команды у пользователя будут запрошены некоторые персональные данные, такие как полное имя и e-mail, необходимо их ввести, после чего начнётся генерация ключей, которая может занять некоторое время. После чего будет выведена информация о созданных ключах: + +`gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc. +`This is free software: you are free to change and redistribute it. +`There is NO WARRANTY, to the extent permitted by law. +Замечание: "gpg --full-generate-key" вызывает полнофункциональный диалог создания ключа. + +GnuPG должен составить идентификатор пользователя для идентификации ключа. +Ваше полное имя: John Silver +Адрес электронной почты: john@silver.ru + +Вы выбрали следующий идентификатор пользователя: +"John Silver " +Сменить (N)Имя, (E)Адрес; (O)Принять/(Q)Выход? O +Необходимо получить много случайных чисел. Желательно, чтобы Вы +в процессе генерации выполняли какие-то другие действия (печать +на клавиатуре, движения мыши, обращения к дискам); это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии. + +Необходимо получить много случайных чисел. Желательно, чтобы Вы +в процессе генерации выполняли какие-то другие действия (печать +на клавиатуре, движения мыши, обращения к дискам); это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии. +gpg: ключ 49192168EGELF50S помечен как абсолютно доверенный +gpg: создан каталог '/home/john/.gnupg/openpgp-revocs.d' +gpg: сертификат отзыва записан в '/home/john/.gnupg/openpgp- revocs.d/FFBD0C66CBA22A8739ACB07949192168EGELF50S.rev'. +открытый и секретный ключи созданы и подписаны. + +`pub rsa3072 2019-03-27 [SC] [годен до: 2021-03-26] FFBD0C66CBA22A8739ACB07949192168EGELF50S uid John Silver +`sub rsa3072 2019-03-27 [E] [годен до: 2021-03-26] + +Здесь pub – это открытый ключ, значение «FFBD0C66CBA22A8739ACB07949192168EGELF50S» — его отпечаток, uid – идентификатор, состоящий из полей имени и e-mail, пользователя-владельца ключа. Этот идентификатор нужно использовать при указании ключа, а также + +для обозначения адресата, которому предназначается сообщение (данные), зашифрованное этим ключом. Можно указывать любое из полей. В нижеследующих примерах будет указываться email. + +Для созданных ключей также автоматически будет сгенерирован и сертификат отзыва. Либо это можно сделать вручную: + +`$ gpg --output ~/revocation.crt --gen-revoke your_email@address.ru + +Созданный сертификат revocation.crt нужно хранить также надёжно, как и закрытые ключи. При создании сертификата отзыва нужно указать возможную причину отзыва ключа, а также комментарий к отзыву. Эту информацию будут видеть другие пользователи систем управления ключами GPG. Опция —output служит для вывода сертификата отзыва в файл, в данном случае revocation.crt. + +Очень важно также подписывать ключи, которые были получены от других пользователей, если достоверно известно, что это именно те пользователи, за которых они себя выдают и ключи принадлежат действительно им. Это часто происходит при импорте открытых ключей других пользователей. После проверки их (и ключей и их пользователей-владельцев) очень желательно эти ключи подписать: + +`$ gpg --sign-key other_user@address.ru + +После подписи импортированного ключа нужно дать знать об этом его владельцу, чтобы он мог использовать этот ключ (ведь он подписанный) как аргумент для других пользователей, которые буду видеть, что его уже кто-то «одобрил» и доверяет ему. Для этого подписанный ключ экспортируется в файл и отправляется обратно его владельцу. + +Импорт и экспорт ключей + +Для того, чтобы экспортировать, например подписанный (в предыдущей главе) ключ нужно выполнить команду: + +`$ gpg –-output ~/signed.key –-export –-armor other_user@address.ru + +Опция —armor создаёт вывод в виде символов ASCII, т. е. в виде текста. По- умолчанию (если эту опцию не указывать) gpg создаст двоичный вывод. Теперь полученный файл с подписанным ключом можно отправлять его владельцу. Он в свою очередь может его импортировать себе в GPG, а также внести некоторую информацию о подписи: + +`$ gpg --import ~/signed.key + +Таким образом происходит, собственно обмен открытыми и подписанными ключами между пользователями. + +Если нужно перенести свой секретный ключ куда-либо (для использования на других компьютерах), то нужно использовать опцию —export-secrert-key: + +`$ gpg --output mygpgkey_private.txt --armor --export-secret-key my_email.address.ru + +Чтобы теперь импортировать этот секретный ключ на другом компьютере, нужно воспользоваться опцией —allow-secret-key-import: + +`$ gpg --allow-secret-key-import --import mygpgkey_private.txt + +Шифрование и дешифровка данных + +Чтобы зашифровать данные в GPG используется опция —encrypt: + +`$ gpg --recipient other_user@address.ru --encrypt somefile + +Здесь какой-либо файл somefile зашифруется открытым ключом пользователя, идентифицируемого с помощью его e-mail (other_user@address.ru) и только он сможет расшифровать этот файл своим закрытым ключом: + +`$ gpg --decrypt-files somefile.gpg + +Как можно видеть, при шифровке на выходе получаются файлы с расширением *.gpg. + +Проверка подлинности ключа пользователя + +Каким образом можно узнать, что пользователь, предоставивший свой открытый ключ действительно тот, за кого себя выдаёт, т. е. подлинный владелец соответствующего закрытого ключа? + +Для этого существует отпечаток ключа, который можно получить с помощью опции —fingerprint: + +`$ gpg --fingerprint john@silver.ru +`pub rsa3072 2019-03-27 [SC] [годен до: 2021-03-26] FFBD 0C66 CBA2 2A87 39AC B079 4919 2168 EGEL F50S uid [ абсолютно ] John Silver +`sub rsa3072 2019-03-27 [E] [годен до: 2021-03-26] + +Значение «FFBD 0C66 CBA2 2A87 39AC B079 4919 2168 EGEL F50S» нужно сверять с соответствующим значением, полученным таким же образом, но на стороне пользователя, приславшего этот ключ. Значения должны быть идентичны. + +Заключение + +В заключение необходимо отметить некоторую сложность для быстрого понимания самого механизма защиты GPG. Которая главным образом заключается в предварительном обмене ключами между взаимодействующими сторонами. Механизм GPG становится довольно просто использовать на практике. Если хотя бы пару раз выполнить обмен шифрованными данными, тем более, что это очень надёжно. \ No newline at end of file diff --git a/LINUX/GREP.md b/LINUX/GREP.md new file mode 100644 index 0000000..47619ef --- /dev/null +++ b/LINUX/GREP.md @@ -0,0 +1,392 @@ +```sh +# Найти точное соответствие +Для того чтобы искать соответствия только целым словам, используйте флаг "-w": +ls +'test script.sh' test test_1 test_2 +ls | grep -w test +test script.sh +test + + +# Аналогичного результата можно добиться через регулярное выражение: +ls | grep "\" +test script.sh +test + + +# "\<" — начало слова. +# "test" — искомый текст. +# "\>" — конец слова. + +# Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы. + +# Игнорировать регистр + +# По умолчанию, grep чувствительна к регистру, что немного мешает поиску. Проблема решается путем добавления ключа "-i" к команде: +ls | grep -i new +newFile +NewFile + + +#Вывод файлов с совпадениями. Используйте параметр "-l", чтобы вывести не сами строки, а только пути к файлам, в которых они содержатся: +grep -r -l "libnma" /usr/share +/usr/share/doc/libnma-gtk4-0/copyright + + +# Параметр "-r" отвечает за рекурсивный поиск - grep прошерстит не только 1 уровень каталога, а пойдет вглубь. + +# Поиск по нескольким параметрам. Для того, чтобы передать команде несколько вводных данных для определения совпадений, используется флаг "-e" перед каждым объектом поиска: +ls | grep -i -e new -e old +NewFile +newFile +oldFile +# Эту команду система понимает, как "или-или" и выводит все вхождения указанных слов. + +# Использование регулярных выражений. +# Настоящая сила grep проявляется, когда вы переходите от сопоставления простых строк к сопоставлению шаблонов - регулярных выражений. + +# Выражения бывают 2 типов: basic и extended. Одна из особенностей второго типа заключается в том, что некоторые символы требуют экранирования для сохранности фич: ?, +, {, |, (, ), <, >. + +# Но можно обойтись просто добавлением флага "-E": +ls | grep -E "script|test" + + +# Квадратные скобки "[]" используются, чтобы провести проверку на соответствие одному из указанных символов: +ls | grep "test[23]" +test2 +test3 + + +# Можем указать "-" для того, чтобы использовать диапазон значений: +ls | grep "test[1-3]" +test2 +test3 + + +# Каретка "^" используется для поиска строк, которые начинаются с указанного шаблона. Давайте найдем совпадение всех строк, начинающихся с заглавной буквы: +grep "^[A-Z]" myfile +A lot of text +Hello world + + +# Знак доллара "$" означает конец строки. В результат входят только те элементы, конец которых подходит под шаблон: +grep "world$" myfile +Hello world +hello world + + +# Точка "." обозначает любой одиночный символ, кроме новой строки. Регулярное выражение "....." обозначает любую строку, содержащую минимум 5 символов: +grep '.....' myfile + + +# Вертикальная черта "|" выполняет роль логического оператора "ИЛИ": +ls | grep "script\|test" +script +test + + +# В общем, регулярные выражения прекрасны и многообразны. Детальнее ознакомиться с ними можете по ссылке. + +# Экранирование +# Иногда выражения приводят к неожиданным результатам. +# Предположим, вы хотите найти в файле "myfile" только те строки, которые заканчиваются на ".sh". + +# Следующая команда выдаст неверный результат, поскольку точка — это регулярное выражение, означающее «любой символ»: +grep ".sh" myfile +script_name.sh +script_namesh + + +# Чтобы обойти эту проблему, требуется экранировать спецсимвол: +grep "\.sh" myfile +script_name.sh + + +# Такое решение иногда становится громоздким. К счастью, можно заставить grep забыть о регулярных выражениях и искать буквально то, что мы указываем. + +# Для этого используется параметр (fixed) "-F": +grep -F ".sh" myfile +script_name.sh + +``` + +**Полезные опции для поиска файлов через grep** + +Иногда нужно найти один/несколько файлов, содержащих определённую строку в: логах, конфигах или исходном коде. Для этого очень часто под рукой оказывается утилита **grep**. Для сводки, интересные флаги и регулярные выражения для grep мы рассматривали тута. + +По умолчанию команда фильтрует один файл. Для того чтобы выполнять поиск по каталогу, нужно добавить флаг "**-r**": + +```sh +grep -r "root" /etc/ +/etc/mdadm/mdadm.conf:MAILADDR root +``` + +Если хотим подсветить вхождения цветом, используем опцию "**--color=always**": +```sh +grep --color=always -r "root" /etc/ +``` + +Опции "-**C, -B, -A**" вообще имбовые, использую их целую неделю) Вы можете включить отображение не только текущей строки, в которой было найдено вхождение, но и **n** строк **до/после**: + +1) **-C**: выводит n строк до и после вхождения; + +```sh +grep -C2 -r --color=always "Hello3" ./ +./hello-Hello1 +./hello-Hello2 +./hello:Hello3 +./hello-Hello4 +./hello-Hello5 +``` + +1) **-B**: выводит n строк перед вхождением; +```sh +grep -B2 -r --color=always "Hello3" ./ +./hello-Hello1 +./hello-Hello2 +./hello:Hello3 +``` + +1) **-A**: выводит n строк после вхождения; + +```sh +grep -A2 -r --color=always "Hello3" ./ +./hello:Hello3 +./hello-Hello4 +./hello-Hello5 +``` + +Если наш шаблон поиска походит на регулярное выражения, нужно использовать флаг "**-F**". Таким образом мы говорим команде искать ровно то, что мы запросили - без скрытых подтекстов. + +Без флага мы получим строки, в которых присутствует хотя бы 1 символ из набора (**H, e, l, o**). С флагом получим строки с буквальным совпадением: + +```sh +grep "[Hello]" hello +Help me please +Helloup +[Hello] +``` + +```sh +grep -F "[Hello]" hello +[Hello] +``` +==================================================== +Команды `grep`, `egrep`и `fgrep`являются мощными утилитами для текстового поиска в Linux. Они позволяют пользователям выполнять поиск в файлах или выводе по шаблонам текста с использованием регулярных выражений (regex). В статье мы углубимся в эти команды, их расширенное использование и то, чем они отличаются. + +**grep** расшифровывается как **Global Regular Expression Print** . Утилита ищет шаблоны в файлах или входных данных и печатает строки, соответствующие шаблону. + +### Начнем с простого: базовый синтаксис и флаги grep: + +`grep [OPTIONS] PATTERN [FILE...] + +### Популярные опции: + +- `-i`: Поиск без учета регистра. +- `-v`: Обратное соответствие (показать строки, не соответствующие шаблону). +- `-r`: Рекурсивный поиск файлов в каталогах. +- `-l`: Показывать только те имена файлов, которые содержат совпадения. +- `-c`: Показать количество совпадающих строк. +- `-n`: Показывать номера строк с соответствующими строками. +- `--color`: Выделение соответствующих шаблонов в выходных данных. +- `-f`опция считывает шаблоны из указанного файла +- `-F`пропускает механизм регулярных выражений, это быстрее, чем использование обычного`grep` + +**Примеры:** + +Поиск без учета регистра: поиск "error" в файле, игнорируя регистр +`grep -i "error" /var/log/syslog + +Рекурсивный поиск в каталоге: поиск шаблона "disk" во всех файлах в /etc/, включая подкаталоги: +`grep -r "disk" /etc/ + +Отображение номеров строк: отображение строк, содержащих "bash" в ~/.bashrc, включая номера строк +`grep -n "bash" ~/.bashrc + +Обратное совпадение: отображение всех строк, не содержащих "root", в /etc/passwd +`grep -v "root" /etc/passwd + +Поиск по нескольким шаблонам с -E: поиск строк, содержащих либо "warn", либо "error" +`grep -E "warn|error" /var/log/syslog + +`egrep`: расширенный `grep`с увеличенной мощностью + +**egrep** является сокращением от **Extended GREP** . По сути, это то же самое, что и `grep -E`, то есть утилита использует расширенные регулярные выражения, которые поддерживают более продвинутые функции регулярных выражений, такие как `+`, `?`, `|`, и скобки без необходимости их экранирования. + +Найти строки, содержащие "error" или "fail" без экранирования | +`egrep "error|fail" /var/log/syslog + +Эквивалентно: +`grep -E "error|fail" /var/ log /syslog + +Найти строки с "color" или "colour" +`egrep "colou?r" file.txt + +Расширенные регулярные выражения — шаблоны соответствия: найти строки, где появляется "log", за которым следует 1 или более цифр +`egrep "log[0-9]+" logfiles.txt + +Расширенные шаблоны grep: находим то, что другие не могут найти: + +1. Мониторинг системных журналов в режиме реального времени + +Вы можете использовать `grep` совместно с`tail`для динамического мониторинга журналов и фильтрации определенных шаблонов: + +`tail -f /var/log/syslog | grep --color=auto -E "error|warn|critical" + +- **Пояснение:** в примере выше выполняется отслеживание `/var/log/syslog`в реальном времени и фильтрует строки, содержащие «error», «warn» или «critical». Опция `--color`выделяет совпадения. + +2. Поиск и замена шаблонов в нескольких файлах + +Используйте `grep`совместно с `sed`для замены шаблонов в файлах. Это полезно для массовых обновлений в нескольких файлах конфигурации. + +`grep -rl "old-string" /path/to/directory | xargs sed -i 's/old-string/new-string/g' + +- **Пояснение**: в примере выше выполняется рекурсивный поиск ( `-r`) всех файлов, содержащих «old-string», и передача их для `sed`замены на «new-string» ( `-i`для редактирования файлов на месте). + +3. Извлечение определенных данных из больших логов + +Для извлечения определенных типов информации, например IP-адресов или временных меток из файла лога, можно использовать расширенные регулярные выражения. + +**Пример:** извлечение всех IP-адресов из файла лога: + +`grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/apache2/access.log + +- **Пояснение**: в примере выше используется `-oE`для сопоставления IP-адресов (формат адреса IPv4, соответствующий регулярному выражению) и их вывода. + +**Пример:** извлечение всех временных меток из файлов журнала: + +`grep -oE "\[([0-9]{2}/[A-Za-z]+/[0-9]{4}):([0-9]{2}:[0-9]{2}:[0-9]{2})" /var/log/apache2/access.log + +- **Пояснение** : в примере выше извлекаются временные метки лога Apache в формате `[dd/Mon/yyyy:hh:mm:ss]`. + +4. Аудит прав доступа к файлам + +Если вам нужно выполнить аудит безопасности, вы можете использовать `grep`для поиска файлов с определенными разрешениями. + +**Пример:** найти все файлы с разрешением `777` в каталоге и его подкаталогах: + +`find / -type f -perm 777 2>/dev/null | grep --color=auto "^" + +- **Пояснение** в примере выше утилита`find`ищет файлы с разрешениями `777`и направляет вывод в `grep`для их дополнительного выделения цветом. + +5. Поиск файлов на основе метаданных (размер, время, владелец) + +`grep`может использоваться в сочетании с `find`для поиска файлов на основе более конкретных метаданных, таких как время изменения файла, размер и владельцы. + +**Пример:** найти и отобразить файлы размером более 100 МБ со словом «ERROR»: + +`find /var/log/ - type f -size +100M - exec grep -H "ERROR" {} \; + +- **Пояснение**: этот метод использует `find`для поиска файлов размером более 100 МБ в `/var/log/`,а `-exec`запускает `grep`для поиска строк, содержащих «ERROR». + +**Пример:** найти файлы, измененные за последние 7 дней, и выполнить поиск по слову «failure»: + +`find /etc/ -type f -mtime -7 -exec grep -H "failure" {} \; + +- **Пояснение**: `find`ищет файлы, измененные за последние 7 дней, и передает их `grep`для поиска «failure». + +6. Параллельный grep для повышения производительности + +При поиске в больших каталогах с большим количеством файлов параллельный запуск `grep` может значительно повысить производительность. + +**Пример:** параллельный поиск строки «timeout» в большом каталоге: + +`find /path/to/dir -type f | xargs -P 4 grep "timeout" + +- **Пояснение**: `xargs -P 4`запускает параллельно 4 процесса `grep`, ускоряя поиск. + +7. Поиск множественных сложных шаблонов + +Вы можете использовать `grep`для поиска несколько сложных шаблонов, используя расширенные регулярные выражения. + +**Пример:** поиск строк, содержащих «error» с последующим числом или любую строку с «timeout»: + +`grep -E "error[[:digit:]]+|timeout" /var/log/syslog + +- **Пояснение**: этот подход позволяет найти строки, в которых после слова «error» следует одна или несколько цифр, или строки, содержащие слово «timeout». + +**Пример:** найти в логах строки, содержащие либо «failed login», либо «successful login»: + +`grep -E "(failed|successful) login" /var/log/auth.log + +- **Пояснение**: здесь используется расширенное регулярное выражение для сопоставления «failed login» или «successful login». + +8. Поиск в двоичных файлах и игнорирование непечатаемых символов + +`grep`может использоваться для поиска строк в двоичных файлах, игнорируя непечатаемые символы. + +**Пример:** поиск строки «password» во всех двоичных файлах: + +`grep -a "password" /usr/bin/* + +- **Пояснение**: опция `-a` обрабатывает двоичные файлы как текстовые файлы, позволяя искать понятные человеку строки внутри двоичных файлов. + +9. Фильтрация и подсчет уникальных вхождений + +Вы можете использовать `grep` совместно с утилитами`sort`и `uniq`для фильтрации и подсчета уникальных шаблонов, таких как IP-адреса, имена пользователей или ошибки. + +**Пример:** подсчет уникальных IP-адресов, обращающихся к веб-серверу: + +`grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/apache2/access.log | sort | uniq -c | sort -nr + +- **Пояснение**: эта команда извлекает IP-адреса из access-лога, сортирует их, подсчитывает уникальные вхождения, а затем сортирует их по частоте. + +**Пример:** найти наиболее частые типы ошибок в файле лога: + +`grep "ERROR" /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr + +- **Пояснение**: команда выше извлекает типы ошибок (предполагая, что 5-е поле — это тип ошибки), подсчитывает уникальные ошибки и сортирует их по частоте. + +### Повышение производительности: ускорьте поиск с помощью оптимизации grep + +10. Объедините grep с другими инструментами автоматизации + +**Пример:** отправка оповещения, если в журналах появляется определенная ошибка + +Вы можете создать автоматизированную систему оповещений на основе определенных шаблонов в логах, используя `grep`. + +`grep -i "critical error" /var/log/syslog | mail -s "Critical Error Found" admin@example.com + +- **Пояснение**: здесь выполняется поиск «critical error» в системном логе и, если она найдена, администратору отправляется электронное письмо с соответствующими строками. + +11. Извлечение определенных данных из диапазона строк + +Используя `grep`в сочетании с `sed`или `awk`, вы можете извлечь определенные данные из диапазона строк. + +**Пример:** извлечение линий между двумя шаблонами: + +`sed -n '/START_PATTERN/,/END_PATTERN/p' file.txt | grep "important_string" + +- **Пояснение** : в примере выше извлекаются строки между `START_PATTERN`и `END_PATTERN`и передаются в`grep`для поиска `important_string`. + +12. grep с удаленных серверов с использованием SSH + +Вы можете удаленно выполнять поиск в журналах или файлах на другом сервере, используя SSH и `grep`. + +**Пример:** Поиск «error» в удаленных журналах: + +`ssh user@remote_server 'grep "error" /var/log/syslog' + +- **Пояснение**: в примере выше выполняется команда `grep` на удаленном сервере через SSH. + +13. Найти выполненные команды в истории Bash + +Чтобы отследить конкретную команду, использовавшуюся пользователями в прошлом, вы можете выполнить поиск в файлах истории bash. + +**Пример:** поиск всех выполненных команд `mount` в истории всех пользователей: + +`grep "mount" /home/*/.bash_history + +- **Пояснение**: команда выше проверяет файлы истории bash всех пользователей на предмет выполнения ими команды `mount`. + +14. Расширенное сопоставление с образцом с отрицательным просмотром + +`grep`не поддерживает просмотр вперед напрямую, но вы можете добиться похожего поведения с помощью креативного регулярного выражения. + +**Пример:** сопоставьте строки, содержащие «error», но не содержащие «network error»: + +`grep -E "error" file.txt | grep -v "network error" + +- **Пояснение** : сначала команда находит все строки, содержащие «error», а затем исключают строки, содержащие «network error». + +Эти расширенные варианты использования демонстрируют универсальность `grep`, `egrep`, и `fgrep`при применении в сложных случаях. Независимо от того, анализируете ли вы логи, ищете в больших наборах данных или автоматизируете административные задачи, эти мощные инструменты помогут вам эффективно найти именно то, что вам нужно. \ No newline at end of file diff --git "a/LINUX/GRUB \320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\217\320\264\321\200\320\260 \320\262 Linux.md" "b/LINUX/GRUB \320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\217\320\264\321\200\320\260 \320\262 Linux.md" new file mode 100644 index 0000000..1b8ace7 --- /dev/null +++ "b/LINUX/GRUB \320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\217\320\264\321\200\320\260 \320\262 Linux.md" @@ -0,0 +1,147 @@ +GRUB нужен, если: +- Нужно загрузить систему с особыми параметрами. +- Нужно добавить поддержку нескольких ОС в меню загрузки. +- Надо включить/выключить режим отладки ядра. +- Любите жить опасно и копаетесь в экспериментальных функциях Linux. +### Структура конфигурации GRUB: + +**Основной конфиг:** `/etc/default/grub` +Этот файл — первая остановка при настройке GRUB. Открываем: +```sh +sudo nano /etc/default/grub +``` +Пример стандартного конфига: +``` +GRUB_DEFAULT=0GRUB_TIMEOUT=5GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"GRUB_CMDLINE_LINUX="" +``` + +Обозначение параметров: +- `GRUB_DEFAULT=0` — загружается первая запись в меню GRUB. +- `GRUB_TIMEOUT=5` — пауза в секундах перед автозагрузкой. +- `GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"` — параметры, которые передаются ядру (по умолчанию он загружается без лишнего вывода). +- `GRUB_CMDLINE_LINUX` — дополнительные параметры, которые работают во всех режимах. + +Это далеко не все параметры. Ниже будет спойлер со всеми параметрами. +Изменения в файле **не вступят в силу сами по себе**. После редактирования надо обновить конфиг: +```sh +sudo update-grub +``` +Бывает, что система не загружается, но есть время на спасение. В такие моменты жмём `e` в меню GRUB, находим строку вида: +``` +linux /boot/vmlinuz-5.15.0-52-generic root=UUID=xxxx-xxxx-xxxx-xxxx ro quiet splash +``` +И меняем параметры ядра прямо в загрузчике. Например, если система зависает из‑за ACPI, можно добавить: +``` +acpi=off +``` +После чего грузимся с помощью `Ctrl + X` или `F10`. Эти изменения действуют **только для текущей загрузки**. + +Все параметры GRUB: +Если уже загрузились и хотите узнать, какие параметры применились: +``` +cat /proc/cmdline +``` +### Применение + +Несколько вариантов применения: +Если провайдер не поддерживает IPv6, а система продолжает упрямо пытаться его использовать: +``` +GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1" +``` +Обновляем GRUB, перезагружаем систему. + +Если вам нужно больше информации при загрузке системы: +``` +GRUB_CMDLINE_LINUX_DEFAULT="debug ignore_loglevel" +``` + +После этого получите максимально подробный лог загрузки. +Если у вас простая система, можно попробовать грузиться без `initrd`: +1. В `/etc/default/grub` добавляем: + ``` + GRUB_CMDLINE_LINUX_DEFAULT="noinitrd" + ``` +2. Пересобираем загрузочный образ: + ``` + sudo update-initramfs -u + ``` +3. Обновляем GRUB и перезагружаемся. +### Безопасность GRUB + +Если не хотите, чтобы кто‑то случайно (или специально) изменил параметры ядра: +1. Создаём хеш пароля: + ``` + sudo grub-mkpasswd-pbkdf2 + ``` +2. Открываем файл `/etc/grub.d/40_custom`: + ``` + sudo nano /etc/grub.d/40_custom + ``` +3. Добавляем: + ``` + set superusers="admin"password_pbkdf2 admin grub.pbkdf2.sha512.10000.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + ``` +4. Обновляем GRUB: + ``` + sudo update-grub + ``` +Теперь при попытке редактирования параметров загрузки GRUB попросит пароль. +### GRUB Modules + +GRUB умеет очень многое, но многие даже не подозревают, что можно подгружать **модули** прямо в загрузчике. + +Загрузка по сети через PXE: +``` +insmod pxeinsmod netinsmod tftpset net_pxe_ifname=eth0set net_pxe_ip=192.168.1.100set net_pxe_server=192.168.1.1set net_pxe_gateway=192.168.1.1set root=(tftp,192.168.1.1)/ +``` +Можно добавить другие полезные модули: +- `lvm` — для работы с логическими томами. +- `cryptodisk` — для расшифровки зашифрованных дисков перед загрузкой. +- `usb` — если грузимся с USB‑диска. +### Кастомизация экрана загрузки GRUB + +Стандартное меню GRUB скучное? +1. Кладём красивую картинку в `/boot/grub/` (лучше PNG 1024×768). +2. Открываем `/etc/default/grub` и добавляем: + ``` + GRUB_BACKGROUND="/boot/grub/background.png" + ``` +3. Обновляем конфиг: + ``` + sudo update-grub + ``` + +Теперь при загрузке будет фон вместо унылого чёрного экрана. +Можно поменять цвета текста в файле `/etc/grub.d/05_debian_theme`: +``` +set menu_color_normal=white/blackset menu_color_highlight=yellow/blue +``` +(меняем белый текст на чёрном фоне на жёлтый текст на синем фоне) +### Если что-то пошло не так + +Сломали GRUB? +1. Загружаемся с LiveCD или флешки с Linux. +2. Открываем терминал и монтируем системный раздел: + ``` + sudo mount /dev/sdXn /mntsudo mount --bind /dev /mnt/devsudo mount --bind /proc /mnt/procsudo mount --bind /sys /mnt/sys + ``` +3. Заходим в chroot‑окружение: + ``` + sudo chroot /mnt + ``` +4. Переустанавливаем GRUB: + ``` + grub-install /dev/sdXupdate-grub + ``` +5. Перезагружаемся. Система снова жива. + +Если GRUB сломался окончательно, можно загрузить ядро вручную из UEFI: +1. Загружаемся в UEFI Shell или LiveCD. +2. Выполняем: + ``` + linux /boot/vmlinuz-5.15.0-52-generic root=/dev/sda2 roinitrd /boot/initrd.img-5.15.0-52-genericboot + ``` +3. Если сработало — переустанавливаем GRUB: + ``` + sudo grub-install /dev/sdasudo update-grub + ``` diff --git "a/LINUX/HOME_SERVER/5 \320\274\320\260\320\273\320\276\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\321\205 \320\272\320\276\320\274\320\260\320\275\320\264 \320\264\320\273\321\217 Linux.md" "b/LINUX/HOME_SERVER/5 \320\274\320\260\320\273\320\276\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\321\205 \320\272\320\276\320\274\320\260\320\275\320\264 \320\264\320\273\321\217 Linux.md" new file mode 100644 index 0000000..36ec72f --- /dev/null +++ "b/LINUX/HOME_SERVER/5 \320\274\320\260\320\273\320\276\320\270\320\267\320\262\320\265\321\201\321\202\320\275\321\213\321\205 \320\272\320\276\320\274\320\260\320\275\320\264 \320\264\320\273\321\217 Linux.md" @@ -0,0 +1,48 @@ +### tldr + +Если набрать, например, man tar, вы получите труднопонятную простыню текста. В отличие, от man, результат вывода команды ниже более понятен. + +tldr [command] + +Например: +tldr tar +Create a .tar archive +tar cf archive.tar file1 file2 + +Extract a .tar.gz archive +tar xzf archive.tar.gz + +List contents of a tar file +tar tf archive.tar + +### timeout + +Команда timeout позволяет выполнять команду в течение определенного времени. Если время истечет, тайм-аут убьет процесс, так что скрипт не будет выполняться вечно. Пара примеров: +timeout 5s ping google.com +timeout 30s ./myscript.sh + +### ncdu + +Инструмент ncdu похож на du, но с текстовым интерактивным интерфейсом, который позволяет проверять использование диска и удалять мусор на месте. +ncdu +--- /home/user ------------------------ +. 3.1 GiB [##########] Downloads + 1.2 GiB [###.......] Videos + 800.0 MiB [##........] Projects + 450.0 MiB [#.........] Documents + +### fd + +Это удобная альтернатива find с простым синтаксисом (больше никаких длинных флагов или странных шаблонов). Несколько примеров: +fd notes.txt +fd -e py +fd config /etc + +### trash + +Если вы быстро набирали rm и удаляли не тот файл (или, что еще хуже, целую папку), вы знаете, как жесток Linux в отношении удаления файлов. Кнопки «отменить» нет. Если что-то исчезло, значит, оно действительно исчезло. + +Вот тут-то и пригодится команда trash. Она работает так же, как rm, но вместо того, чтобы навсегда удалять файлы, она отправляет их в корзину, откуда их можно легко восстановить позже. Несколько примеров: +trash filename.txt +trash file1.txt file2.txt folder/ +trash-restore \ No newline at end of file diff --git "a/LINUX/HOME_SERVER/Caddy - \320\267\320\260\320\274\320\265\320\275\320\260 Nginx.md" "b/LINUX/HOME_SERVER/Caddy - \320\267\320\260\320\274\320\265\320\275\320\260 Nginx.md" new file mode 100644 index 0000000..3b4cfd6 --- /dev/null +++ "b/LINUX/HOME_SERVER/Caddy - \320\267\320\260\320\274\320\265\320\275\320\260 Nginx.md" @@ -0,0 +1,54 @@ +Caddy - замена Nginx с авто-TLS и минимальной настройкой + +Ты наверняка используешь Nginx как прокси-сервер или для выдачи статики. Но есть более свежий и удивительно простой веб-сервер - Caddy. Он сам получит HTTPS, сам перезапустится при изменении конфига и вообще просит к себе минимум внимания. Разбираемся, чем он крут. + +Caddy — это современный веб-сервер, написанный на Go. Его главная фишка — всё работает из коробки: + +1) Автоматический HTTPS от Let's Encrypt +2) Перезапуск при изменении конфига +3) Встроенный reverse proxy +4) Простая конфигурация (Caddyfile) + +Установка: + + +sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https + +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy.gpg + +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list + +sudo apt update +sudo apt install caddy + + +Минимальный пример Caddyfile: + + +example.com { + reverse_proxy localhost:3000 +} + +- Заменяешь "example.com" на свой домен +- localhost:3000 (твой сервис); + +Запуск сервера + +Caddy работает как systemd-сервис. Чтобы запустить или перезапустить: + + +sudo systemctl restart caddy + +После этого caddy сам проверит домен, получит HTTPS-сертификат от Let's Encrypt, настроит прокси и всё заработает) + +Почему это удобно + +- Не нужно возиться с SSL — HTTPS работает из коробки +- Конфигурация проще, чем у Nginx +- Отлично подходит для pet-проектов, демо, VPS-серверов + +Когда лучше остаться с Nginx + +1) Если у тебя уже сложная конфигурация с множеством rewrite, map, ssl_params +2) Если нужна кастомная сборка модулей +3) Если используешь stream (TCP/UDP proxy) \ No newline at end of file diff --git a/LINUX/HOME_SERVER/watch.md b/LINUX/HOME_SERVER/watch.md new file mode 100644 index 0000000..8c9409a --- /dev/null +++ b/LINUX/HOME_SERVER/watch.md @@ -0,0 +1,48 @@ +Команда watch: живой взгляд на процессы и метрики + +watch - утилита, которая повторно запускает любую команду через заданный интервал (по‑умолчанию 2 сек) и отображает её вывод полноэкранно. Подходит, когда: + +1) нужно увидеть изменение метрики прямо сейчас; +2) нет времени поднимать полноценный мониторинг; +3) требуется «подкараулить» событие и выйти, как только оно случится; +4) работает везде: на Debian, BusyBox в Alpine, внутри Docker‑контейнера; + +Базовый синтаксис + + +watch [-n <сек>] [-d] [-g] [-t] [-p] [-e] [-x] <команда> + +Ключевые опции + +"-n 5” — устанавливает интервал в 5 с. Хорош для медленных команд и экономии CPU; +-d — подсвечивает изменения относительно предыдущего вывода. Удобно отслеживать «скачки»; +-g — автоматически выходит, как только вывод изменится; полезно, когда ждёте окончания бэкапа; +-e — завершает работу при ненулевом exit‑коде команды. Превращает watch в health‑check; +-t — убирает заголовок watch. Идеален для чистых скриншотов; +-p — синхронизирует запуск с системными секундами. Это важно при очень частых опросах, например "-n 0.2"; +-x — запускает команду без обёртки в shell. Это помогает, если команда содержит символы вроде $ или *, которые интерпретируются bash'ем; + +Практические примеры + +Топ прожорливых процессов + + +watch -n 1 -d 'ps -eo pid,cmd,%cpu --sort=-%cpu | head' + +Ждём появления строки ERROR в логе и выходим + + +watch -g "grep -q ERROR /var/log/app.log" +echo 'Нашли ERROR!' + +Мини‑график latency + + +watch -n 0.2 -p 'ping -c1 1.1.1.1 | awk -F"=" "/time=/{print $4}"' + +Лайфхаки + +"-d" подсвечивает изменения — удобно, когда хочешь быстро понять, что именно изменилось. Добавь "--differences=permanent", чтобы подсветка не исчезала между обновлениями. +"-t" убирает заголовок watch — идеально для чистых логов или скриншотов. +"-p" даёт ровный ритм (1 Hz и выше), полезно для прецизионного мониторинга. +"-g" или "-e" + немного shell'а — и у тебя мини-скрипт, который реагирует на событие. \ No newline at end of file diff --git "a/LINUX/HOME_SERVER/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" "b/LINUX/HOME_SERVER/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" new file mode 100644 index 0000000..82c3ed6 --- /dev/null +++ "b/LINUX/HOME_SERVER/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" @@ -0,0 +1,36 @@ +```sh +# удалить старые версии установленных пакетов и очистить кэш пакетов от ненужных файлов: +sudo apt autoclean +# очистить кэш пакетов от ненужных файлов: +sudo apt clean + +sudo dpkg --remove +sudo dpkg --purge + +# удалить старое и неиспользуемое ядро: +sudo apt --purge remove linux-image- +# текущее работающее ядро: +uname -r + +snap list +sudo snap remove + +# удалить файлы журнала сталше 7 дней: +sudo journalctl --vacuum-time=7d +# удалить файлы пока общий размер журналов не станет меньше 100Мб: +sudo journalctl --vacuum-size=100M + +# увидеть использование диска домашним каталогом (для дальнейшей очистки): +du -h --max-depth=1 ~ + +# очистка кэшированных миниатюр в системе (графической): +rm -rf ~/.cache/thumbnails/* +``` +## Очистка кэша миниатюр + +Ubuntu создает миниатюры для предварительного просмотра изображений, видео и документов для быстрого доступа. Со временем эти миниатюры могут накапливаться и занимать место. +Чтобы удалить их, используйте следующую команду: + +==`rm -rf ~/.cache/thumbnails/* + +Это удалит все кэшированные миниатюры в вашей системе. \ No newline at end of file diff --git "a/LINUX/HOME_SERVER/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265 \320\262 SYSTEMD.md" "b/LINUX/HOME_SERVER/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265 \320\262 SYSTEMD.md" new file mode 100644 index 0000000..d0c989c --- /dev/null +++ "b/LINUX/HOME_SERVER/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265 \320\262 SYSTEMD.md" @@ -0,0 +1,141 @@ +```sh +sudo systemctl edit --force --full mqtt_log.service +# vim /etc/systemd/system/mqtt_log.service + +#================================== +[Unit] +Description=mqtt_log +After=network.target + +[Service] +WorkingDirectory=/home/vlapa/mqtt_log +StandardError=append:/var/log/myapp/mqtt_log_error.log +User=vlapa +Group=vlapa +Type=simple +Restart=always +RestartSec=5 +ExecStart=/home/vlapa/mqtt/.venv/bin/python3 mqtt_log.py +Environment="PATH=/home/vlapa/mqtt/.venv/bin:/usr/bin:/bin" + + +[Install] +WantedBy=multi-user.target + +#================================== +# Создаем папку и файл +mkdir /var/log/myapp +touch /var/log/myapp/mqtt_log_error.log + +#================================== +sudo systemctl daemon-reload +sudo systemctl enable myapp +sudo systemctl start myapp +sudo systemctl status myapp + +# Логи сервиса с последнего запуска +journalctl -u mqtt_log.service -b + +``` +============ +sudo nano /etc/systemd/system/myapp.service +``` +# Пример конфигурации unit-файла + +[Unit] +Description=My Python Application +After=network.target + +[Service] +Type=simple +# Если используете виртуальное окружение: +ExecStart=/path/to/venv/bin/python /path/to/your/app.py +# Или без виртуального окружения: +# ExecStart=/usr/bin/python3 /path/to/your/app.py + +# Рабочая директория +WorkingDirectory=/path/to/your/app/directory + +# Пользователь для запуска (опционально) +User=username +Group=groupname + +# Перезапуск при ошибке +Restart=always +RestartSec=5 + +# Переменные окружения +Environment="PYTHONPATH=/path/to/your/app" +Environment="DATABASE_URL=mysql://user:pass@localhost/db" + +[Install] +WantedBy=multi-user.target + + +# Для приложений с зависимостями (виртуальное окружение) + +[Service] +Type=simple +ExecStart=/home/user/myapp/venv/bin/python /home/user/myapp/main.py +WorkingDirectory=/home/user/myapp +Environment="PATH=/home/user/myapp/venv/bin" + + +# Основные команды для управления + + +# Загрузить изменения конфигурации +sudo systemctl daemon-reload + +# Запустить сервис +sudo systemctl start myapp + +# Остановить сервис +sudo systemctl stop myapp + +# Включить автозапуск при загрузке +sudo systemctl enable myapp + +# Проверить статус +sudo systemctl status myapp + +# Просмотреть логи +sudo journalctl -u myapp -f + + +# Полезные опции для Python-приложений + +- **`Restart`** - политика перезапуска: + + - `no` - не перезапускать + + - `on-success` - только при успешном завершении + + - `on-failure` - при ошибке (рекомендуется) + + - `always` - всегда перезапускать + +- **`StandardOutput`/`StandardError`** - куда перенаправлять вывод: + + ini + + StandardOutput=journal + StandardError=journal + # Или в файл: + StandardOutput=file:/var/log/myapp.log + + +# Проверка и отладка + +bash + +# Проверить синтаксис конфигурации +sudo systemd-analyze verify /etc/systemd/system/myapp.service + +# Тестовый запуск без systemd +sudo -u username /path/to/python /path/to/app.py + +# Подробные логи +sudo journalctl -u myapp -n 100 -f + +``` \ No newline at end of file diff --git "a/LINUX/HOME_SERVER/\320\243\321\201\320\270\320\273\320\265\320\275\320\270\320\265 \320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\320\270 Linux.md" "b/LINUX/HOME_SERVER/\320\243\321\201\320\270\320\273\320\265\320\275\320\270\320\265 \320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\320\270 Linux.md" new file mode 100644 index 0000000..5d4ada7 --- /dev/null +++ "b/LINUX/HOME_SERVER/\320\243\321\201\320\270\320\273\320\265\320\275\320\270\320\265 \320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\320\270 Linux.md" @@ -0,0 +1,178 @@ +### 10 bash-скриптов + +## 1. Включение автоматических обновлений безопасности + +Одной из важнейших практик поддержания безопасности систем является поддержание программного обеспечения в актуальном состоянии. Этот скрипт включит автоматические обновления безопасности в системе Linux, гарантируя, что система всегда будет защищена от уязвимостей. +```sh +#!/bin/bash +# Автоматическое обновление и установка исправлений безопасности +sudo apt-get update -y +sudo apt-get upgrade -y +sudo apt-get dist-upgrade -y +# Установка unattended-upgrades, если они не установлены +sudo apt-get install unattended-upgrades -y +# Включение автоматических обновлений +sudo dpkg-reconfigure --priority=low unattended-upgrades +``` +- `apt-get update -y` обновляет, а `apt-get upgrade -y`модернизирует все системные пакеты. +- `unattended-upgrades`обеспечивает применение автоматических обновлений безопасности. +- `dpkg-reconfigure`используется для настройки автоматических обновлений в системе. + +## 2. Отключение ненужных служб + +Во многих системах ненужные службы запущены по умолчанию. Отключение этих служб уменьшает количество целей для атаки сервера. Этот скрипт выведет список и отключит ненужные службы. +```sh +#!/bin/bash +# Список всех активных служб +echo "Список активных служб:" +sudo systemctl list-units --type=service --state=active +# Отключение ненужных служб +echo "Отключение ненужных служб..." +sudo systemctl stop apache2 +sudo systemctl disable apache2 +sudo systemctl stop mysql +sudo systemctl disable mysql +``` +- `systemctl list-units`показывает все запущенные службы. +- `systemctl stop`останавливает службу и `systemctl disable`отключает ее запуск при загрузке. +- Этот скрипт отключает Apache2 и MySQL в качестве примера. + +## 3. Внедрение политики надежных паролей + +Обеспечение соблюдения пользователями политики надежных паролей необходимо для безопасности системы. Этот скрипт настроит политику паролей системы для обеспечения надежных паролей. +```sh +#!/bin/bash +# Установите пакет libpam-pwquality для настройки политик паролей +sudo apt-get install libpam-pwquality -y +# Установите требования к сложности пароля +sudo sed -i 's/# minlen = 8/minlen = 12/' /etc/security/pwquality.conf +sudo sed -i 's/# minclass = 1/minclass = 4/' /etc/security/pwquality.conf +# Включите политику паролей в конфигурации PAM +sudo echo "password tribute pam_pwquality.so retry=3" >> /etc/pam.d/common-password +``` +- пакет `libpam-pwqualityп` предоставляет инструменты для соблюдения политики надежных паролей. +- параметр`minlen` устанавливает минимальную длину пароля, `minclass`задает количество требуемых классов символов (заглавные, строчные, цифры, специальные символы). + +## 4. Отключение входа root по SSH + +Разрешение входа root через SSH представляет собой существенный риск безопасности. Этот скрипт отключает вход root SSH путем редактирования конфигурации SSH. +```sh +#!/bin/bash +# Отключение вход root через SSH +sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config +# Перезапуск службу SSH, чтобы применить изменения +sudo systemctl restart sshd +``` +- директива `PermitRootLogin` в конфигурации SSH контролирует, разрешен ли вход root. Установка значения «no» отключает его. +- `systemctl restart sshd`перезапускает службу SSH для применения изменений. + +## 5. Обеспечение прав доступа к конфиденциальным файлам + +Обеспечение правильных разрешений для конфиденциальных файлов важно для безопасности системы. Этот скрипт проверяет и корректирует разрешения для важных файлов, таких как `/etc/passwd`и `/etc/shadow`. +```sh +#!/bin/bash +# Убедитесь, что у /etc/passwd и /etc/shadow правильные права доступа +sudo chmod 644 /etc/passwd +sudo chmod 000 /etc/shadow +# Проверьте права доступа +echo "Права доступа для /etc/passwd:" +ls -l /etc/passwd +echo "Права доступа для /etc/shadow:" +ls -l /etc/shadow +``` +- `chmod 644`устанавливает разрешения на чтение и запись для владельца файла и только на чтение для остальных. +- `chmod 000`гарантирует, что никто не сможет читать или записывать в файл`/etc/shadow`, содержащий информацию о пароле пользователя. + +## 6. Настройка брандмауэра (UFW) + +Использование брандмауэра — важный шаг в защите сервера. Этот скрипт настраивает простой брандмауэр (UFW) для блокировки ненужных портов и разрешения только необходимых служб. +```sh +##!/bin/bash +# Включить UFW +sudo ufw enable +# Разрешить SSH (порт 22) и HTTP (порт 80) +sudo ufw allow 22 +sudo ufw allow 80 +# Запретить все остальные входящие соединения +sudo ufw default deny incoming +sudo ufw default allow outgoing +# Показать статус UFW +sudo ufw status +``` +- `ufw enable`включает несложный брандмауэр (UFW). +- команды «allow» разрешают соединения SSH и HTTP. +- «default deny incoming» и «default allow outgoing» устанавливают правила по умолчанию для блокировки входящего трафика и разрешения исходящего трафика. + +## 7. Регулярная ротация логов + +Чтобы избежать заполнения диска логами, следует настроить регулярную ротацию логов. Этот скрипт настраивает ротацию логов на ежедневной основе. +```sh +#!/bin/bash +# Установить logrotate, если он не установлен +sudo apt-get install logrotate -y +# Создать пользовательский файл конфигурации logrotate +echo "/var/log/*.log { + daily + rotate 7 + compress + delaycompress + missingok + notifempty + create 0640 root root +}" | sudo tee /etc/logrotate.d/custom_logs +# Проверить конфигурацию logrotate +sudo logrotate --debug /etc/logrotate.conf +``` +- `logrotate`управляет ротацией файлов журналов. +- файл конфигурации указывает, что журналы должны ротироваться ежедневно, сохранять 7 старых журналов и сжимать старые журналы для экономии места. +- флаг `--debug` проверяет правильность конфигурации logrotate. + +## 8. Блокировка учетных записей пользователей после неудачных попыток входа в систему + +Блокировка учетных записей пользователей после определенного количества неудачных попыток входа в систему является распространенной и важной функцией безопасности. Этот скрипт настраивает блокировку учетных записей пользователей после 5 неудачных попыток входа в систему. +```sh +#!/bin/bash +# Установить pam_tally2, если он не установлен +sudo apt-get install libpam-modules -y +# Установить политику блокировки для блокировки учетных записей пользователей после 5 неудачных попыток +echo "auth required pam_tally2.so onerr=fail deny=5" | sudo tee -a /etc/pam.d/common-auth +# Сбросить счетчик неудачных попыток входа для всех пользователей +sudo pam_tally2 --user * --reset +``` +- модуль`pam_tally2` отслеживает попытки входа в систему и блокирует учетную запись после указанного количества неудачных попыток ( `deny=5`). +- флаг `--reset` сбрасывает счетчик неудачных попыток входа для всех пользователей. + +## 9. Обнаружение и удаление файлов SUID/SGID + +Файлы SUID и SGID предоставляют пользователям повышенные привилегии и могут представлять угрозу безопасности. Этот скрипт проверяет и удаляет файлы SUID/SGID из системы. +```sh +#!/bin/bash +# Поиск файлов SUID и SGID +echo "Поиск файлов SUID и SGID..." +find / - type f -executable -perm /4000 -o -perm /2000 +# При желании удалите их (закомментируйте эту строку, если не хотите удалять файлы) +# find / -type f -executable -perm /4000 -o -perm /2000 -exec rm -f {} \; +``` +- `find / -type f -executable -perm /4000`ищет файлы с установленным битом SUID (Set User ID). +- `find / -type f -executable -perm /2000`ищет файлы с установленным битом SGID (Set Group ID). +- Скрипт выводит список файлов, вы можете удалить их, раскомментировав последнюю строку. + +## 10. Обеспечение надлежащих прав доступа пользователей к критически важным файлам + +Этот скрипт проверяет и гарантирует, что конфиденциальные файлы принадлежат пользователю root и доступны только ему. +```sh +#!/bin/bash +# Установка владельца и разрешений для критических системных файлов +sudo chown root:root /etc/passwd +sudo chmod 644 /etc/passwd +sudo chown root:root /etc/shadow +sudo chmod 600 /etc/shadow +# Проверка изменений +ls -l /etc/passwd /etc/shadow +``` +- `chown root:root`гарантирует, что файлами владеет пользователь root. +- «chmod 644» гарантирует, что файл `/etc/passwd`доступен для чтения другим пользователям, но доступен для записи только пользователю root. +- «chmod 600» ограничивает доступ `/etc/shadow`только пользователю root. + + +На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал [usr_bin](https://t.me/usr_bin_linux), где будет еще больше полезной информации. \ No newline at end of file diff --git a/LINUX/HTOP.md b/LINUX/HTOP.md new file mode 100644 index 0000000..b16c7fe --- /dev/null +++ b/LINUX/HTOP.md @@ -0,0 +1,13 @@ +`F5` `t` - дерево каталогов +`N P M T` - сортировка по: PID, CPU%, MEM%, TIME +`F3 / +name` - поиск процесса +`F4 \ +name` - фильтр по имени +`\ ESC` - сброс фильтра +`u + выбор пользователя` - процессы 1 пользователя +`F9 k + выбор` - убить процесс +`l` - какие файлы открыты процессом +отображение всех переменных процесса: +выбираем процесс + е +`пробел` - выделение +`U` - отмена +`F2` - настройки diff --git a/LINUX/IPTABLES, NFTABLES.md b/LINUX/IPTABLES, NFTABLES.md new file mode 100644 index 0000000..2ab407c --- /dev/null +++ b/LINUX/IPTABLES, NFTABLES.md @@ -0,0 +1,101 @@ +**iptables** — это утилита командной строки для межсетевого экрана, которая позволяет настраивать правила управления трафиком в Linux. + +## Установка iptables + +Большинство дистрибутивов Linux включают iptables по умолчанию. Чтобы установить или обновить его: + +- **Debian/Ubuntu**: + +`sudo apt update sudo apt install iptables + +## Основные команды iptables + +- **Просмотреть текущие правила**: +`sudo iptables -L -v -n + +- **Разрешить входящий трафик SSH**: +`sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT + +- **Заблокировать IP-адрес**: +`sudo iptables -A INPUT -s [IP-адрес] -j DROP + +## **Сохранить правила**: + +- **Debian/Ubuntu:** +`sudo iptables-save > /etc/iptables/rules.v4 + +## Пример конфигурации: основные правила брандмауэра + +Чтобы настроить простой брандмауэр с помощью iptables, вы можете определить правила, разрешающие трафик SSH и HTTP, блокируя весь остальной входящий трафик: + +```sh +sudo iptables -P INPUT DROP +sudo iptables -P FORWARD DROP +sudo iptables -P OUTPUT ACCEPT +sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT +sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT +sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT +``` + +### Практические советы по настройке брандмауэра Linux + +1. **Всегда используйте политику сброса по умолчанию**: установите политику по умолчанию для сброса всего входящего трафика, разрешая только доверенные соединения. +2. **Разрешайте только определенные службы**: избегайте широких разрешений и указывайте только необходимые службы (например, SSH, HTTP). +3. **Ограничьте доступ по SSH**: ограничьте доступ по SSH, разрешив только доверенные IP-адреса и отключив вход с правами root. +4. **Используйте ведение журнала с осторожностью**: включите ведение журнала для отклоненных подключений, но ограничьте частоту, чтобы избежать переполнения журналов. + + +# nftables: будущее межсетевых экранов Linux + +**nftables** — это современная замена **iptables** , которая обеспечивает повышение производительности, более простой синтаксис и большую гибкость. Она работает с **netfilter** и предназначена для объединения функций брандмауэра, NAT и искажения пакетов. + +## Установка nftables + +В большинстве последних дистрибутивов Linux nftables предустановлен. Вы можете установить или обновить его с помощью: + +- **Debian/Ubuntu:** +`sudo apt install nftables + +## Базовые команды nftables + +- **Запуск и включение nftables**: +`sudo systemctl start nftables +`sudo systemctl enable nftables + +- **Просмотр активных правил:** +`sudo nft list ruleset + +- **Сброс всех правил**: +`sudo nft flush ruleset + +## Пример конфигурации nftables + +Вот как можно настроить nftables для разрешения трафика SSH, HTTP и HTTPS: + +1. **Откройте файл конфигурации nftables**: +`sudo nano /etc/nftables.conf + +**2. Добавьте набор правил**: + +```sh +table inet filter { + chain input { + type filter hook input priority 0; policy drop; + ct state established,related accept + tcp dport { 22, 80, 443 } accept + } + chain forward { + type filter hook forward priority 0; policy drop; + } + chain output { + type filter hook output priority 0; policy accept; + } +} +``` + +**3. Загрузите наборы правил**: + +`sudo nft -f /etc/nftables.conf + +Эта конфигурация по умолчанию сбрасывает все входящие соединения, но разрешает установленные соединения и новые соединения через порты SSH, HTTP и HTTPS. \ No newline at end of file diff --git a/LINUX/JOURNALCTL.md b/LINUX/JOURNALCTL.md new file mode 100644 index 0000000..f3ba698 --- /dev/null +++ b/LINUX/JOURNALCTL.md @@ -0,0 +1,160 @@ +## Синтаксис и опции journalctl + +Если утилита не выводит ничего, выполните её от имени суперпользователя: + +**journalctl опции** + +- **--full, -l** - отображать все доступные поля; +- **--all, -a** - отображать все поля в выводе full, даже если они содержат непечатаемые символы или слишком длинные; +- **--pager-end, -e** - отобразить только последние сообщения из журнала; +- **--lines, -n** - количество строк, которые нужно отображать на одном экране, по умолчанию 10; +- **--no-tail** - отображать все строки доступные строки; +- **--reverse, -r** - отображать новые события в начале списка; +- **--output, -o** - настраивает формат вывода лога; +- **--output-fields** - поля, которые нужно выводить; +- **--catalog, -x** - добавить к информации об ошибках пояснения, ссылки на документацию или форумы там, где это возможно; +- **--quiet, -q** - не показывать все информационные сообщения; +- **--merge, -m** - показывать сообщения из всех доступных журналов; +- **--boot, -b** - показать сообщения с момента определенной загрузки системы. По умолчанию используется последняя загрузка; +- **--list-boots** - показать список сохраненных загрузок системы; +- **--dmesg, -k** - показывает сообщения только от ядра. Аналог вызова команды dmesg; +- **--identifier, -t** - показать сообщения с выбранным идентификатором; +- **--unit, -u** - показать сообщения от выбранного сервиса; +- **--user-unit** - фильтровать сообщения от выбранной сессии; +- **--priority, -p** - фильтровать сообщения по их приоритету. Есть восемь уровней приоритета, от 0 до 7; +- **--grep, -g** - фильтрация по тексту сообщения; +- **--cursor, -c** - начать просмотр сообщений с указанного места; +- **--since, -S, --until, -U** - фильтрация по дате и времени; +- **--field, -F** - вывести все данные из выбранного поля; +- **--fields, -N** - вывести все доступные поля; +- **--system** - выводить только системные сообщения; +- **--user** - выводить только сообщения пользователя; +- **--machine, -M** - выводить сообщения от определенного контейнера; +- **--header** - выводить заголовки полей при выводе журнала; +- **--disk-usage** - вывести общий размер лог файлов на диске; +- **--list-catalog** - вывести все доступные подсказки для ошибок; +- **--sync** - синхронизировать все не сохраненные журналы с файловой системой; +- **--flush** - перенести все данные из каталога /run/log/journal в /var/log/journal; +- **--rotate** - запустить ротацию логов; +- **--no-pager** - выводить информацию из журнала без возможности листать страницы; +- **-f** - выводить новые сообщения в реальном времени, как в команде tail; +- **--vacuum-time** - очистить логи, давностью больше указанного периода; +- **--vacuum-size** - очистить логи, чтобы размер хранилища соответствовал указанному. + +## Горячие клавиши journalctl + +По умолчанию информация лога выводится в формате, в котором её можно листать. Давайте разберем горячие клавиши, которые вы можете для этого использовать: + +- **Стрелка вниз, Enter, e** или **j** - переместиться вниз на одну строку; +- **Стрелка вверх, y** или **k** - переместиться на одну строку вверх; +- **Пробел** - переместиться на одну страницу вниз; +- **b** - переместиться на одну страницу вверх; +- **Стрелка вправо, стрелка влево** - горизонтальна прокрутка; +- **g** - перейти на первую строку; +- **G** - перейти на последнюю строку; +- **p** - перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода; +- **/** - поиск по журналу; +- **n** - найти следующее вхождение; +- **N** - предыдущее вхождение; +- **q** - выйти. + +## Шпаргалка по journalctl + +Чтобы найти именно то, что вам нужно, необходимо научится перемещаться по этому списку. Формат вывода лога довольно простой: + +**янв 13 20:55:55 sergiy-pc kernel: Linux version 4.15.0-43-generic** + +- **янв 13 20:55:55** - дата и время события; +- **sergiy-pc** - хост, на котором произошло событие; +- **kernel** - источник события, обычно это программа или сервис. В данном случае ядро; +- **Linux version 4.15.0-43-generic** - само сообщение. + +### 1. Просмотр логов сервисов + +Самый частый случай использования journalctl - это когда вы пытаетесь запустить какой-либо сервис с помощью systemd, он не запускается и systemd выдает вам такое сообщение подобного содержания: Failed to start service use journalctl -xe for details. Система сама предлагает вам какую команду надо выполнить: + +`sudo journalctl -xe` + +Как вы помните из опций, эта команда отображает последние сообщения в журнале и добавляет к ним дополнительную информацию, если она есть. Учитывая, что последнее, что мы делали - был наш сервис, то здесь будут сообщения от него и вы быстро сможете понять почему он не запускается. + +Чтобы отфильтровать сообщения только от определенного сервиса можно использовать опцию -u. Например: + +`sudo journalctl -eu apache2.service` + +### 2. Просмотр логов в режиме tail + +С помощью опции -f можно указать утилите, что необходимо выводить новые сообщения в реальном времени: + +`sudo journalctl -f` + +В этом режиме less не поддерживается, поэтому для выхода нажмите сочетание клавиш **Ctrl+C**. + +### 3. Просмотр логов загрузки + +В логе journalctl содержатся все логи, в том числе и логи загрузки. Для того чтобы открыть лог последней загрузки используйте опцию -b: + +`sudo journalctl -b` + +Посмотреть список всех сохраненных загрузок можно командой: + +`sudo journalctl -list-boots` + +Теперь, чтобы посмотреть сообщения для нужной загрузки используйте её идентификатор: + +`sudo journalctl -b 37d5c906c9c6404682f029b2c34ec9dc` + +### 4. Фильтрация по дате + +С помощью опции **--since** вы можете указать дату и время, начиная с которой нужно отображать логи: + +`sudo journalctl --since "2019-01-20 15:10:10"` + +Опция **--until** помогает указать по какую дату вы хотите получить информацию: + +`sudo journalctl -e --until "2019-01-20 15:05:50"` + +Или сразу скомбинируем две эти опции чтобы получить логи за нужный период: + +`sudo journalctl --since "2019-01-20 15:10:10" --until "2019-01-20 15:05:50"` + +Кроме даты в формате YYYY-MM-DD в этих опциях можно использовать такие слова, как yesterday, today, и tomorrow. Также допустимы конструкции **1 day ago** (один день назад) или **3 hours ago** (три часа назад). Ещё можно использовать знаки + и -. Например **-1h30min** будет означать полтора часа назад. + +### 5. Журнал ядра + +Если вы хотите посмотреть только сообщения ядра используйте опцию -k: + +`sudo journalctl -ek` + +### 6. Настройка формата вывода + +По умолчанию journalctl выводит информацию с помощью утилиты less, в которой вы можете её удобно листать и просматривать. Но формат вывода можно изменить: + +- **short** - используется по умолчанию; +- **verbose** - также, как и short, только выводится намного больше информации; +- **json** - вывод в формате json, одна строка лога в одной строке вывода; +- **json-pretty** - форматированный вывод json для более удобного восприятия; +- **cat** - отображать только сообщения, без метаданных. + +Чтобы указать нужный формат используйте опцию -o. Например: + +`sudo journalctl -o json-pretty` + +Или: + +`sudo journalctl -eo json-pretty` + +### 7. Очистка логов + +Сначала нужно посмотреть сколько ваши логи занимают на диске. Для этого используйте такую команду: + +`sudo journalctl --disk-usage` + +Чтобы уменьшить размер лога можно использовать опцию --vacuum-size. Например, если вы хотите, чтобы ваши файлы журналов занимали на диске не более 2 Гб, выполните команду: + +`sudo journalctl --vacuum-size=2G` + +Теперь старые логи будут удалены, пока общий объем хранилища не будет составлять 2 гигабайта. + +Также можно удалять логи по времени. Для этого используется опция --vacuum-time. Например, оставим только логи за последний год: + +`journalctl --vacuum-time=1years` \ No newline at end of file diff --git a/LINUX/KILL, PKILL.md b/LINUX/KILL, PKILL.md new file mode 100644 index 0000000..41443b2 --- /dev/null +++ b/LINUX/KILL, PKILL.md @@ -0,0 +1,16 @@ +Иногда процессы зависают или потребляют слишком много ресурсов. В Linux есть несколько удобных инструментов для их управления. + +📌 Основные команды: + +🟢 kill – завершение процесса по PID: + +ps aux | grep firefox # Найти PID процесса +kill 12345 # Завершить процесс + +🟢 pkill – завершение по имени процесса: + +pkill -9 firefox # Принудительно завершить Firefox + +🟢 htop – интерактивный мониторинг: + +htop # Открыть интерфейс для управления процессами \ No newline at end of file diff --git a/LINUX/LEMP.md b/LINUX/LEMP.md new file mode 100644 index 0000000..ed55edc --- /dev/null +++ b/LINUX/LEMP.md @@ -0,0 +1,119 @@ +`Sudo apt update && sudo` +`apt install nginx` +`sudo ufw app list` +`sudo ufw allow 'Nginx HTTP'` +`sudo ufw status` +`ip addr show` +`hostname -I` +`curl -4 icanhazip.com` + +## MySQL : + +`sudo apt install mysql-server` +`sudo mysql_secure_installation` + +Вам будет задан вопрос, хотите ли вы настроить `**VALIDATE PASSWORD PLUGIN**`**.** +Ответьте `Y`«да» или что-нибудь еще, чтобы продолжить без включения, + +Если вы ответите «да», вам будет предложено выбрать уровень проверки пароля. Имейте в виду, что если вы войдете `2`на самый сильный уровень, вы получите ошибки при попытке установить любой пароль, не содержащий цифр, прописных и строчных букв и специальных символов: + +Независимо от того, решили ли вы настроить `**VALIDATE PASSWORD PLUGIN**`, ваш сервер попросит вас выбрать и подтвердить пароль для пользователя **root** MySQL . Его не следует путать с **корнем системы**. Пользователь **root базы данных** — это пользователь-администратор с полными привилегиями в системе базы данных. Несмотря на то, что метод аутентификации по умолчанию для пользователя root MySQL не требует использования пароля, **даже если он установлен**, вам следует определить здесь надежный пароль в качестве дополнительной меры безопасности. + +Чтобы ответить на остальные вопросы, нажмите `Y`и ударьте `ENTER`клавишу при каждом подсказке. Это приведет к удалению некоторых анонимных пользователей и тестовой базы данных, отключению удаленного входа в систему с правами root и загрузке этих новых правил, чтобы MySQL немедленно принял внесенные вами изменения. + +Когда вы закончите, проверьте, можете ли вы войти в консоль MySQL: + +`sudo mysql` +`sudo mysql -**_``_**u root -p**_` + + +## PHP : + + +'sudo apt install php8.1-fpm php-mysql' +'sudo mkdir /var/www/your_domain' +`sudo chown -R $USER:$USER /var/www/` +`sudo vim /etc/nginx/sites-available/` + +`_server {_` + `_listen 80;_` + `_server_name your_domain www.your_domain;_` + `_root /var/www/your_domain;_` + + `_index index.html index.htm index.php;_` + + + +`_location / {_` +`_try_files $uri $uri/ =404;_` +`_}_` + +`_location ~ \.php$ {_` +`_include snippets/fastcgi-php.conf;_` +`_fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;_` +`_}_` + +`_location ~ /\.ht {_` +`_deny all;_` +`_}_` + +`_}_` + + +`listen` — Определяет, какой порт будет прослушивать Nginx. + +`root` — Корень документа, в котором хранятся файлы, обслуживаемые этим веб-сайтом. + +`Index` — Определяет, в каком порядке Nginx будет отдавать приоритет индексным файлам для этого веб-сайта. Обычной практикой является перечисление `index.html` файлов с более высоким приоритетом, чем `index.php` у файлов, чтобы можно было быстро настроить целевую страницу обслуживания в приложениях PHP. Вы можете настроить эти параметры, чтобы они лучше соответствовали потребностям вашего приложения. + +`server_name` — Определяет, за какие доменные имена и/или IP-адреса должен отвечать этот блок серверов. +**Укажите в этой директиве доменное имя или общедоступный IP-адрес вашего сервера.** + +`Location /` — Первый блок местоположения включает `try_files` директиву, которая проверяет наличие файлов или каталогов, соответствующих запросу URL. Если Nginx не сможет найти подходящий ресурс, он вернет ошибку 404. + +`location ~ \.php$` — Этот блок местоположения управляет фактической обработкой PHP, указывая Nginx на `fastcgi-php.conf` файл конфигурации и `php8.1-fpm.sock` файл, который объявляет, какой сокет связан с `php8.1-fpm`. + +`location ~ /\.ht` — Последний блок _**location**_ касается `.htaccess` файлов, которые Nginx не обрабатывает. Благодаря добавлению `deny all` директивы, если какие-либо `.htaccess` файлы попадут в корень документа, они не будут доставлены посетителям. + + +Активируйте свою конфигурацию, связавшись с файлом конфигурации из `sites-enabled` каталога Nginx: + +`sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/` + +Затем отсоедините файл конфигурации по умолчанию от `/sites-enabled/` каталога: + +`sudo unlink /etc/nginx/sites-enabled/default` + +`sudo nginx -t` +- проверить конфигурацию` + +`sudo systemctl reload nginx` + +`nano /var/www//index.html` + +`` +`` +`your_domain website` +`` +`` +`

Hello World!

` + +`

This is the landing page of your_domain.

` +`` +`` + +***/etc/_nginx/nginx.conf*** +***nginx -s*** - сигнал + +_Где сигнал может быть одним из нижеследующих:_ + +_**stop** — быстрое завершение_ +_**quit** — плавное завершение_ +_**reload** — перезагрузка конфигурационного файла_ +_**reopen** — переоткрытие лог-файлов_ + + +_Директивы, помещённые в конфигурационном файле вне любого контекста, считаются находящимися в контексте main. Директивы events и http располагаются в контексте main, server — в http, а location — в server._ + + +_В случае если что-то работает не как ожидалось, можно попытаться выяснить причину с помощью файлов access.log и error.log из каталога ==/var/log/nginx ( /usr/local/nginx/logs )== \ No newline at end of file diff --git "a/LINUX/LESS \320\270 SPLIT.md" "b/LINUX/LESS \320\270 SPLIT.md" new file mode 100644 index 0000000..0b0704f --- /dev/null +++ "b/LINUX/LESS \320\270 SPLIT.md" @@ -0,0 +1,39 @@ +**Работа с большими файлами в терминале: + +Работа с объемными файлами может быть затруднительна, однако есть два инструмента, которые несколько облегчают процесс. В этом посте кратко рассмотрим их. + +**less: Просмотр больших файлов** + +less — это инструмент для постраничного просмотра больших файлов без их полной загрузки в память. + +💬 **Открытие файла:** +`less bigfile.log + +Используйте клавиши Space для перехода вниз и b для возврата вверх. + +💬  **Поиск текста:** +Нажмите / и введите текст для поиска: +`/ошибка + +Используйте n для перехода к следующему совпадению. + +💬 **Вывод с подсветкой:** +Для удобства можно использовать less с подсветкой: + +`grep "ошибка" bigfile.log | less -R + +2️⃣ **split: Разделение больших файлов** + +Когда файл слишком большой для обработки, split поможет разбить его на части. + +💬 **Разделение файла по строкам:** +`split -l 1000 bigfile.log part_ + +**Результат:** файлы part_aa, part_ab, part_ac и т. д. + +💬 **Разделение по размеру:** +Например, каждая часть по 50 МБ: +`split -b 50M bigfile.log part_ + +💬 **Собрать файл обратно:** +`cat part_* > mergedfile.log \ No newline at end of file diff --git a/LINUX/LN.md b/LINUX/LN.md new file mode 100644 index 0000000..6273b79 --- /dev/null +++ b/LINUX/LN.md @@ -0,0 +1,15 @@ +ln -s <на какой существующий объект будет вести> <создаваемый симлинк> + +В системах на базе Linux (например, Ubuntu или [CentOS](https://www.dmosk.ru/terminus.php?object=centos)) и [FreeBSD](https://www.dmosk.ru/terminus.php?object=freebsd) симлинк для каталога и файла создаются одинаково: + +ln -s /usr/share/nginx/html/index.php /home/dmosk/ + +ln -s /usr/share/nginx/html /home/dmosk/ + +* в первом примере создана символьная ссылка в домашней директории пользователя **dmosk** на файл **index.php**; во втором — на каталог **/usr/share/nginx/html**. + +### Удаление + +Также используется одна команда: + +rm /home/dmosk/index.php \ No newline at end of file diff --git a/LINUX/LSOF.md b/LINUX/LSOF.md new file mode 100644 index 0000000..34ca676 --- /dev/null +++ b/LINUX/LSOF.md @@ -0,0 +1,87 @@ +👩‍💻 **Как использовать lsof для поиска процессов, блокирующих файлы** + +`lsof` — позволяет просматривать информацию об открытых файлах и связанных с ними процессах. Особенно полезно, если вы сталкиваетесь с ошибками доступа к файлам, например, при монтировании, удалении или использовании разделов. + +⚙️ **Примеры использования** +🟢 К примеру, если мы не можем удалить файл или получить к нему доступ, выполним: + +`lsof /путь/к/файлу + +В результате получим список процессов, которые используют файл, с подробной информацией: PID, пользователь, команда и доступ. + +🟢 Чтобы просмотреть все файлы, которые были открыты в определенном каталоге, используйте следующую команду: + +`lsof +D /директория + +➕ **Дополнительно:** + +➡️ `lsof -u username` — покажет файлы, открытые процессами указанного пользователя. + +➡️ `lsof -p PID` — отображает все файлы, которые использует процесс с заданным PID. + +➡️ `lsof -i :PORT` — покажет процессы, использующие определённый сетевой порт. + +=================================== +⚙️ **Проверка использования порта в Linux** + +Иногда нужно узнать, какой процесс использует определённый порт. В Linux это можно сделать несколькими способами. + +**📌 Просмотр процессов, занявших порт** + +**🟢 Определение процесса по порту:** +`sudo lsof -i :80` +Покажет процесс, использующий порт 80. + +**🟢 Вывести PID процесса:** +`sudo netstat -tulnp | grep :80` + +Альтернативный способ проверки. + +**🟢 Завершение процесса по PID:** +`sudo kill -9 ` +Останавливает процесс, если он мешает запуску сервиса. + +**Полезно при отладке серверов, проверки конфликтов между сервисами и устранения проблем с сетью.** + + +======================= + +**Как исправить "rm: cannot remove ‘file’: Device or Resource Busy"? + +Бывало же у вас такое - заканчиваешь работать с каким-то ресурсом (файлом/каталогом/устройством), хочешь его удалить и видишь ошибку о том, что он чем-то занят (используется системой либо каким-то процессом). + +`rm: cannot remove 'file-or-directory': Device or resource busy + +Тут нужно понять, в чем конкретная причина и чем он задействован: то ли процессом, то ли это, быть может, точка монтирования для какой-то FS…  + +Распространенных решения вижу 2:  +1. Использование команд "**lsof + fuser**" для определения занятых ресурсов и завершения процессов. Если вы не знаете, какая программа мешает выполнить операцию, используйте **lsof**: + +`$ lsof +D Sources/App/ + +COMMAND   PID    USER   FD   NAME +server  22331 xoadmin  txt    Sources/App/server +client  22332 xoadmin  txt    Sources/App/client + +Если у нас ресурс занимают 2 процесса, можно и через **kill** все грохнуть. Если их много, можно более автоматизированно - через **fuser**. Эта команда завершит все процессы, которые что-то используют в целевом каталоге: + +`$ fuser -k Sources/App/ + +После выполнение мы вырубим сразу оба процесса **22331** и **22332**. +2. Определение точки монтирования. Это полезно, когда какая-нибудь флешка или внешний диск монтирован в целевой каталог. Узнать, так ли это, можно через команду **mount**. Допустим, у меня не получается удалить **test**: + +`$ rm -rf test + +`rm: cannot remove 'test/tmpfsdir': Device or resource busy + +Проверяем, является ли **tmpfsdir** точкой монтирования: + +`$ mount | grep test/tmpfsdir + +`none on /home/u/test/tmpfsdir type tmpfs (rw,relatime,inode64) + +Вывод говорит о том, что в каталог **tmpfsdir** примонтирована FS **tmpfs**. Для успешного выполнения операции нужно размонтировать каталог: + +`$ sudo umount test/tmpfsdir + +`$ rm -rf test \ No newline at end of file diff --git a/LINUX/Let's Encrypt.md b/LINUX/Let's Encrypt.md new file mode 100644 index 0000000..43e6f4f --- /dev/null +++ b/LINUX/Let's Encrypt.md @@ -0,0 +1,33 @@ +**Установка и автоматизация SSL-сертификатов с Let's Encrypt** + +**Let's Encrypt** — это бесплатный сервис для генерации SSL/TLS-сертификатов. С его помощью можно легко защитить свои сайты HTTPS-соединением. Для автоматизации работы используется инструмент Certbot. + +1️⃣ **Установка Let's Encrypt (Certbot)** +Пример для дистрибутивов на базе Ubuntu/Debian: +`sudo apt update   +`sudo apt install certbot python3-certbot-nginx + +Если используется другой веб-сервер (например, Apache), замените nginx на apache2. + +2️⃣ **Получение сертификата** +Выполните команду для автоматического выпуска и настройки сертификата для Nginx: +`sudo certbot --nginx  + +Certbot автоматически обнаружит конфигурацию вашего веб-сервера и предложит выбрать домен. Далее сертификат будет установлен и активирован. + +3️⃣ **Автоматическое продление сертификатов** +Let's Encrypt выдает сертификаты сроком на 90 дней. Для их автоматического обновления настройте cron-задание: + +— Откройте редактор Cron: +`crontab -e   + +— Добавьте следующую строку для проверки и продления сертификатов каждые 12 часов: +`0 */12 * * * certbot renew --quiet   + +Certbot автоматически перезапустит веб-сервер, если сертификат обновится. +4️⃣ **Проверка работы** + +Убедитесь, что сертификат активен, открыв сайт через HTTPS. Также проверьте успешность автоматизации: +`sudo certbot renew --dry-run   + +Теперь ваш сайт защищен, а обслуживание сертификатов полностью автоматизировано 👍 \ No newline at end of file diff --git a/LINUX/MAILutils.md b/LINUX/MAILutils.md new file mode 100644 index 0000000..029fd6c --- /dev/null +++ b/LINUX/MAILutils.md @@ -0,0 +1,104 @@ +```sh +sudo apt update && sudo apt upgrade -y +sudo apt install postfix mailutils +``` +### Настройка Postfix + +Данный раздел покажет, как настроить Postfix для отправки сообщений с сервера, на котором он установлен (то есть, с локального хоста). + +Для этого Postfix должен быть настроен на прослушивание только интерфейса внутренней петли (loopback interface) – это виртуальный сетевой интерфейс, который используется сервером для внутреннего взаимодействия. Откройте конфигурационный файл Postfix с помощью редактора nano: + +`sudo nano /etc/postfix/main.cf` + +Найдите в нем следующий блок кода: + +`mailbox_size_limit = 0 +`recipient_delimiter = + +`inet_interfaces = all` + +Замените строку +`inet_interfaces = all +строкой +`inet_interfaces = loopback-only +Теперь этот блок выглядит так: + +`mailbox_size_limit = 0 +`recipient_delimiter = + +`inet_interfaces = loopback-only` + +Вместо loopback-only можно также использовать localhost: + +`mailbox_size_limit = 0 +`recipient_delimiter = + +`inet_interfaces = localhost` + +Завершив редактирование файла, сохраните изменения и закройте его (CTRL+X, затем Y и ENTER). После этого перезапустите Postfix: + +`sudo service postfix restart` +`sudo systemctl restart postfix` + +### 1. Синтаксис + +(В ТЕМЕ И ТЕКСТЕ СООБЩЕНИЯ ИСПОЛЬЗОВАТЬ ТОЛЬКО ENG !!!) +Можно отправить сообщение следующей командой: + +`echo "Test text" | mail -s "Test title" master@dmosk.ru + +_* в данном примере будет отправлено письмо на электронный адрес **master@dmosk.ru** с темой **Test title** и телом письма — **Test text**._ + +Если при отправке возникли проблемы, можно проверить логи следующей командой: + +`tail /var/log/mail.log + +### 2. Отправка письма с вложением +`echo 'Attachment' | mail -s 'Subject attachment message' -a /var/log/maillog -a /var/log/maillog2 master@dmosk.ru + +... или: + +`echo 'Attachment' | mail -s 'Subject attachment message' -A /var/log/maillog -A /var/log/maillog2 master@dmosk.ru + +_* где **/var/log/maillog** и **/var/log/maillog2** — файлы, которые будут прикреплены к письму. Обратите внимание, что обе команды отличаются по регистру опции **a** и **A** — все зависит от версии и сборки Linux (в каких-то нужно использовать маленькую, в каких-то — большую). Также обратите внимание, что в примере для Ubuntu мы отправим 2 файла — для этого просто добавляем к команде еще одну опцию прикрепления файла._ + +### 3. Несколько получателей + +Для отправки письма нескольким получателям, просто перечисляем их через запятую: + +`echo "Test text" | mail -s "Test title" master@dmosk.ru,shmaster@dmosk.ru + +_* в данном примере мы отправил письмо на ящики **master@dmosk.ru** и **shmaster@dmosk.ru**._ + +### 4. Отправка с копией + +Отправить копию на адрес master2@dmosk.ru: + +`echo "Test copy" | mail -s "Test copy title" master@dmosk.ru -c master2@dmosk.ru + +Отправить скрытую копию на адрес master3@dmosk.ru: + +`echo "Test hidden copy" | mail -s "Test hidden copy title" master@dmosk.ru -b master3@dmosk.ru + +### 5. Указать отправителя + +`echo "Test text" | mail -s "Test title" master@dmosk.ru -aFrom:postmaster@dmosk.ru + +### 6. Отправка через внешний SMTP сервер + +**а) Для Ubuntu / Debian:** + +`echo "Test text" | mail -s "Test title" -a "Smtp: smtp.mail.ru:25" -a "From: postmaster@dmosk.ru" -a "Return-path: postmaster@dmosk.ru" master@dmosk.ru + +Однако, если сторонний почтовый сервер работает по шифрованному каналу и требует аутентификацию, необходимо ввести следующее: + +`echo "Test text" | mail -v -s "Test title" -S smtp="smtp.dmosk.ru:587" -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user="master@dmosk.ru" -S smtp-auth-password="password" -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from=postmaster@dmosk.ru master@dmosk.ru + +* где: + +- **smtp.dmosk.ru** — сервер smtp;  +- **587** — порт для подключения к серверу отправки;  +- **smtp-use-starttls** указывает на использование шифрования через TLS;  +- **smtp-auth=login** задает аутентификацию с использованием логина и пароля;  +- **smtp-auth-user** и **smtp-auth-password** — соответственно логин и пароль;  +- **ssl-verify=ignore** отключает проверку подлинности сертификата безопасности;  +- **nss-config-dir** указывает на каталог с базами nss;  +- **from** задает поле FROM + diff --git a/LINUX/MC.md b/LINUX/MC.md new file mode 100644 index 0000000..a1b6351 --- /dev/null +++ b/LINUX/MC.md @@ -0,0 +1,124 @@ +Чтобы открывать по f4 свой редактор, снимаем в настройках (в верхнем меню Настройки-Конфигурация) крестик с пункта Встроенный редактор. +Далее в .bashrc добавляем: + +`alias ss='subl'` +`alias mc='EDITOR=subl mc'` + +**Общее** +Ctrl+x,j — Показ фоновых задач +Сtrl-X+A — текущие VFS (ftp и пр.) +ESC+цифра — тоже что и F{цифра} (ESC+5 = F5) + +**F1-F12** +F1 — Помощь +F2 — Сохранить изменения в файл при редактировании +F3 — Просмотр файла +F3 — (Во время редактирования) Начать выделение текста. Повторное нажатие F3 закончит выделение +F4 — Редактирование файла +F5 — Скопировать выделенное +F6 — Переместить выделенное +F8 — Удалить выделенное   +Shift+F1 — вызывается меню быстрого перехода между точками монтирования на левой панели +Shift+F2 — вызывается меню быстрого перехода между точками монтирования на правой панели +Shift+F5 — скопировать файл в этот же каталог +Shift+F6 — переместить/переименовать файл в этот же каталог + +**Поиск** +ctrl-s — Быстрый поиск файла или каталога +alt-shift-? — Вызывается меню расширенного поиска файлов + +**Командная строка** +ctrl-a — курсор в начало +ctrl-e — курсор в конец +esc-! — выполнить команду с параметрами +ctrl-x, p или alt+a — вставить имя каталога +esc, enter; ctrl-enter — послать текущий объект в командную строку +ctrl-x,t — Вставка всех выделенных объектов в командную строку +esc, tab — дополнение команды +alt-a — вставить текущий каталог в командную строку +Alt-TAB (ESC+TAB) — Крутейшая комбинация для поиска загружаемых файлов (например, вы забыли как правильно пишется: netcfg или netconfig. Достаточно набрать в командной строке net и нажать Alt-TAB — вам сразу покажут что можно запустить, которое начинается со слова net) нажимать два раза! +alt-shift-! — вывод результата команды +ctrl-shift-v — вставка из буфера обмена + +**Операции над файлами** +Shift+F4 — Создает новый файл +shift-f6 — переименовать файл +Ctrl+x,i — Быстрый просмотр информации о текущем объекте на второй панели +Ctrl+x,q — Быстрый просмотр содержимого файла на второй панели +alt-. — показать скрытые файлы +ctrl-x, c — права на файл +ctrl-x, o — владелец файла +Shift-F3 — просмотр файла (raw/ без учета расширения) +Ctrl-X+L — создать ссылку на файл +Ctrl-X+S — создать символическую ссылку на файл +Ctrl + x v — создать относительную символическую ссылку   +trl+x,Ctrl+s — Редактировать символическую ссылку +F12 — Save as +ctrl-t — отметить файл либо снять отметку ++ — выбрать (отметить) группу файлов по регулярному выражению +\ — снять отметку с группы файлов +ctrl-x, ctrl-d — сравнить файлы +ctrl-t или Insert — Выделение текущего объекта + +**Работа с каталогами** +alt-o — открыть каталог под курсором в соседней панели +alt-i — открыть текущий каталог в соседней панели +сtrl-\ — показать «Справочник каталогов» +ctrl-x, h — добавить ссылку на текущий каталог в меню быстрого доступа +alt-shift-h — Отобразить историю каталогов +Ctrl+l — Перерисовать экран +Ctrl+r — перечитать содержимое каталога +Ctrl+Space — Показать размер текущего каталога +Ctrl-X+D — сравнить каталоги +ESC+C — быстро сменить каталог +alt-c -окно «Быстрая смена каталога» + +**Работа с панелями** +Ctrl-O — погасить панели и посмотреть что под ними (работает ТОЛЬКО в linux!) здесь же можно поработать в shell’e. +alt-, — Переключить режим отображения панелей (вертикально/горизонтально) +alt-t переключение подробного режима отображения панели +Meta+c — Вызывается меню быстрой смены текущего каталога на активной панели +ctrl-u — поменять панели местами +alt-g — отмечает первый файл или каталог в отображаемом списке на панели (по сути как клавиша Home, поднимает курсор вверх) +alt-e — поменять кодировку панели +Ctrl + x i — переводит пассивную панель в режим «Информация» +Ctrl + x q — переводит пассивную панель в режим быстрого просмотра +ctrl-x ! — меню → «Критерий панелизации» (git) + +**История** +alt+h; esc, h — история командной строки +alt-p, alt-n — вернуть предыдущую (следущую) командную строку (строки) +alt-y. Перемещение к предыдущему каталогу из истории перемещения по каталогам; эквивалентно нажатию мышкой на символ ‘<‘ в верхнем углу панели. +alt-u. Перемещение к следующему каталогу из истории перемещения по каталогам; эквивалентно нажатию мышкой на символ ‘>’. + +**Редактор** +F4 (в редакторе) — поиск с заменой +F6 (в редакторе) — поиск с помощью регулярного выражения +Shift-Del (в редакторе) — удалить блок (и положить его в clipboard) +Shift-Ins (в редакторе) — вставить блок из буфера (работает даже в другой консоли!!!) Можно редактировать два и более файлов на разных консолях и гонять блоки между ними. +Shift+F3 — Начать выделение блока текста. Повторное нажатие F3 закончит выделение +Shift+F5 — Вставка текста из внутреннего буфера обмена mc (прочитать внешний файл) +Meta+i — Переключение режима «Автовыравнивание возвратом каретки», удобно при вставке отформатированного текста из буфера обмена +Meta+l — Переход к строке по её номеру +Meta+q — Вставка литерала (непечатного символа).См. таблицу ниже +Meta+t — Сортировка строк выделенного текста +Meta+u — Выполнить внешнюю команду и вставить в позицию под курсором её вывод +Ctrl+f — Занести выделенный фрагмент во внутренний буфер обмена mc (записать во внешний файл) +Ctrl+k — Удалить часть строки до конца строки +Ctrl+n — Создать новый файл +Ctrl+s — Включить или выключить подсветку синтаксиса +Ctrl+t — Выбрать кодировку текста +Ctrl+u — Отменить действия +Ctrl+x — Перейти в конец следующего +Ctrl+y — Удалить строку +Ctrl+z — Перейти на начало предыдущего слова +Meta+Enter — Диалог перехода к определению функции +Meta+- — Возврат после перехода к определению функции +Meta++ — Переход вперед к определению функции +Meta+n — Включение/отключение отображения номеров строк +tab Отодвигает вправо выделенный текст, если выключена опция «Постоянные блоки» +Meta-tab Отодвигает влево выделенный текст, если выключена опция «Постоянные блоки» +Shift+Стрелки Выделение текста +Meta+Стрелки Выделение вертикального блока +Meta+Shift+- Переключение режима отображения табуляций и пробелов +Meta+Shift++ Переключение режима «Автовыравнивание возвратом каретки» \ No newline at end of file diff --git a/LINUX/MOSQUITTO.md b/LINUX/MOSQUITTO.md new file mode 100644 index 0000000..94efb8f --- /dev/null +++ b/LINUX/MOSQUITTO.md @@ -0,0 +1,121 @@ +```bash +sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa +sudo apt-get update +sudo apt install mosquitto mosquitto-clients + +sudo service mosquitto status +# mosquitto start/running, process 16614 + +sudo mosquitto_passwd -c /etc/mosquitto/mosquitto.pwd user_name +sudo mosquitto_passwd /etc/mosquitto/mosquitto.pwd user_name + +sudo vim /etc/mosquitto/mosquitto.conf + +# Добавляем в конец файла, чем говорим MQTT где искать наш файл с паролями: +allow_anonymous false +password_file /etc/mosquitto/mosquitto.pwd + +vim /etc/mosquitto/mosquitto.pwd +# добавляем клиента: +user_name-1:EXAMPLE_PASSWORD +user_name-2:STRONG_PASSWORD + +# Зашифруйте открытые пароли пользователей с помощью `mosquitto_passwd`утилиты: +sudo mosquitto_passwd -U /etc/mosquitto/mosquitto.pwd +# посмотрим: +sudo cat /etc/mosquitto/mosquitto.pwd + +sudo chmod 0644 /etc/mosquitto/mosquitto.pwd + +sudo service mosquitto restart + +``` + +Подпишитесь на `/home/sensor/temperature`тему, используя действительный логин и пароль. Например, `john_doe`и `EXAMPLE_PASSWORD`: +```sh +mosquitto_sub -u home -P 1234 -t test + +mosquitto_sub -u john_doe -P EXAMPLE_PASSWORD -t "/home/sensor/temperature" +``` + +Опубликуйте новое сообщение в `/home/sensor/temperature`теме: +```sh +mosquitto_pub -t "test" -m "hello world" -u home -P 1234 + +mosquitto_pub -u john_doe -P EXAMPLE_PASSWORD -t "home/sensor/temperature" -m "22.5" -q 1 -r +``` + +Вывод: +```sh +22.5 +``` + +Просмотрите все активные фоновые задания и запишите `mosquitto_sub`идентификатор задания: +```sh +jobs +``` + +Вывод: +```sh +[1] Running mosquitto_sub -u john_doe -P EXAMPLE_PASSWORD -t "home/lights/sitting_room" & +``` + +Остановите тему, указав идентификатор задания: +```sh +kill %1 +``` + +Вывод: +```sh +[1] Done mosquitto_sub -u john_doe -P EXAMPLE_PASSWORD -t "home/lights/sitting_room" & +``` + +Попробуйте подписаться на `/home/sensor/temperature`тему, используя неверные учетные данные +```sh +mosquitto_pub -u john_doe -P VERY_WRONG_PASSWORD -t "home/sensor/temperature" -m "22.5" -q 1 -r +``` + +Вывод: +```sh +Connection error: Connection Refused: not authorised. +Error: The connection was refused. +``` + +Вышеприведенный вывод показывает, что соединение не устанавливается, поскольку Mosquitto не может авторизовать пользователя. + + +**Настройка** + +После установки вы получите mqtt-брокера, слушающего только локальные интерфейсы. Причем, он об этом вам не скажет. У меня ушло довольно много времени, чтобы понять что не так, вы же получите эти знания сразу ) +Поправим конфигурационный файл: + +**/etc/mosquitto/mosquitto.conf** +```sh + +# пишем в логи всё (если не нужно, то потом можно отключить) +log_type error +log_type warning +log_type notice +log_type information + +# разрешаем подключаться без пароля (мне это было надо) +allow_anonymous true + +# те самые "слушатели", без них москит будет слушать только локальные интерфейсы +listener 1883 192.168.1.2 +listener 1883 192.168.3.2 + ``` + + В принципе, это все, по крайней мере, что было нужно мне. + Обратите внимание, что у **listener** вначале идет порт и только потом ip. Если ip не указывать, записать listener 1883, то будут доступны все интерфейсы, как внутренние, так и внешние. + + **Эксплуатация** + +Новые настройки сами себя не применят, поэтому сервис нужно перезагрузить: +`systemctl restart mosquitto + +Логи москит пишет в **/var/log/mosquitto/mosquitto.log** + +Помните, мы вместе с mosquitto поставили mosquitto-clients? При помощи клиента, например, можно смотреть сообщения в брокере: + + `mosquitto_sub -d -t '#' diff --git a/LINUX/NC.md b/LINUX/NC.md new file mode 100644 index 0000000..b51c5ae --- /dev/null +++ b/LINUX/NC.md @@ -0,0 +1,33 @@ +Эффективно копируем гигабайтные файлы по сети в Linux / Unix / Mac OS + +```sh +# Передатчик: +nc -lp 8888 -q 1 < file_name.ext + +# приемник: +nc vlapa@178.20.46.157 > file_name.ext + +watch "du -h file_name.ext" + +#=============================== +# Проверка <адрес порт> : +nc localhost 22 + +# Проверка портов: +nc -z -v localhost 1-30 + + +#=============================== +# Передача файлов через сеть (с ожиданием и не защищенно): + +# запускаем сервер: +nc -lp 8888 -q 1 > file.name + +# скачиваем удаленно: +nc 192.168.88.61 8888 < file.name + + +du -h file.name + +watch «du -h file.name» +``` \ No newline at end of file diff --git a/LINUX/NCDU, BAT, FD, EXA, HTTPIE.md b/LINUX/NCDU, BAT, FD, EXA, HTTPIE.md new file mode 100644 index 0000000..3d581b1 --- /dev/null +++ b/LINUX/NCDU, BAT, FD, EXA, HTTPIE.md @@ -0,0 +1,6 @@ +NCDU - замена размер в интерактивном режиме +BAT - замена с подсветкой синтаксиса +FD - замена поиск +EXA - замена с подсветкой +`exa --tree --level=2 --long` + diff --git a/LINUX/NCDU.md b/LINUX/NCDU.md new file mode 100644 index 0000000..eb81446 --- /dev/null +++ b/LINUX/NCDU.md @@ -0,0 +1,20 @@ +— лучший способ быстро очистить место на сервере + +Когда на сервере внезапно заканчивается место, первое, что хочется — понять, что его съело. Вместо того, чтобы долго ковыряться в du и find, просто поставь ncdu. + +Это интерактивная утилита для анализа диска в терминале. Работает быстро, показывает размеры папок/файлов и позволяет удалять ненужное прямо из интерфейса: + +`sudo apt install ncdu + +Для сканирования нужно просто ввести команду и передать целевой каталог. Чтобы промониторить корень: + +`sudo ncdu / + +Нужные кнопочки: + +Навигация - стрелками вверх/вниз. +Удаление - клавиша d. +Обновить - g. +Выйти - q. + +В отличие от "du -sh *", ncdu не только показывает вес директорий, но и позволяет разобраться в них быстрее. Особенно полезно, если забит логами /var/log, кто-то накатил 100500 .tar.gz или забыли почистить кэш в home. Утилита очень выручает, когда каждая секунда важна. Установил - посмотрел - удалил - освободил. \ No newline at end of file diff --git a/LINUX/NETWORK/DNS.md b/LINUX/NETWORK/DNS.md new file mode 100644 index 0000000..4931e61 --- /dev/null +++ b/LINUX/NETWORK/DNS.md @@ -0,0 +1,36 @@ +```sh +sudo vim /etc/resolv.conf +#======== +nameserver 8.8.8.8 +nameserver 8.8.4.4 + + +sudo resolvectl status + +# Через NETPLAN + +network: + version: 2 + renderer: networkd + ethernets: + enp0s3: + dhcp4: no + addresses: [192.168.157.140/24] + gateway4: 192.168.157.140 + nameservers: + addresses: [8.8.8.8,8.8.4.4] +``` + +В части сервера имен этого примера указано, что система должна разрешать имена хостов с помощью публичных DNS-серверов Google ( `8.8.8.8`и `8.8.4.4`). Кроме того, у машины есть IP-адрес `192.168.157.140`и маска подсети `24`. `192.168.157.140`— это шлюз, через который проходит трафик. + +После внесения изменений в файл конфигурации выполните следующую команду, чтобы изменения вступили в силу: + +```sh +sudo netplan --debug generate +sudo netplan try +sudo netplan apply +``` + +Сделав это, вы сможете использовать серверы имен, перечисленные в файле конфигурации, и обновлять настройки DNS системы. + +``` \ No newline at end of file diff --git a/LINUX/NETWORK/IPERF3.md b/LINUX/NETWORK/IPERF3.md new file mode 100644 index 0000000..869d8f6 --- /dev/null +++ b/LINUX/NETWORK/IPERF3.md @@ -0,0 +1,33 @@ +```bash +# Проверка скорости подключения + +sudo apt install iperf3 + +# Порт по умолчанию = 5201, открываем его: +sudo ufw allow 5201 + +# Запуск клиента: +iperf3 -c адрес_сервера -f m + +# Запуск сервера: +iperf3 -s -f m + +iperf3 -h # help +-p, --port - указать порт для сервера или к какому порту надо подключаться; +-f, --format - формат выводимых данных, доступны значения: k,m,g,t,K,M,G,T; +-i, --interval - интервал времени между выводами результата тестирования; +-F, --file - использовать данные из файла вместо генерации случайных данных; +-V, --verbose - вывод максимально подробной информации; +-J, --json - вывод в формате JSON; +--logfile - записывать информацию в лог файл; +--forceflush - очищать историю вывода перед выводом следующего результата тестирования; +-v, --version - версия программы. + +k - килобиты; +m - мегабиты; +g - гигабиты; +K - килобайты; +M - мегабайты; +G - гигабайты; +T - терабайты. +``` diff --git a/LINUX/NETWORK/NETPLAN.md b/LINUX/NETWORK/NETPLAN.md new file mode 100644 index 0000000..e556960 --- /dev/null +++ b/LINUX/NETWORK/NETPLAN.md @@ -0,0 +1,230 @@ +```bash +sudo systemctl --type=service | grep net +sudo netplan apply +networkctl status +journalctl -f -u systemd-networkd.service + +#=============================== +ip a +sudo vim /etc/netplan/file_name.yaml + +#=============================== + +network: + renderer: networkd + ethernets: + enp2s0: + dhcp4: no # true + addresses: + - 192.168.88.2/24 + routes: + - to: default + via: 192.168.88.1 + nameservers: + addresses: + - 192.168.88.1 + - 8.8.8.8 + - 8.8.4.4 + version: 2 + +#=============================== + +network: +  version: 2 +  renderer: networkd +  ethernets: +    enp2s0: +      dhcp4: no +      addresses: +        - 192.168.88.40/24 +      routes: +        - to: default +          via: 192.168.88.1 +      nameservers: +        addresses: +          - 192.168.88.1 +          - 77.88.8.8 +          - 77.88.8.1 +          - 8.8.8.8 +          - 8.8.4.4 +          +#=============================== +network: +  version: 2 +  renderer: networkd +  ethernets: +    enp6s0: +      dhcp4: no +      addresses: [192.168.88.2/24] +      nameservers: +        addresses: [192.168.88.1,77.88.8.8,77.88.8.1] +      routes: +       - to: default +         via: 192.168.88.1 +  wifis: +    wlp4s0: +      dhcp4: yes +    # addresses: [192.168.88.3/24] +      nameservers: +        addresses: [192.168.88.1,77.88.8.8,77.88.8.1] +      access-points: +        "link": +           password: "dkfgf#*12091997" +             #      routes: +             # - to: default  +             # via: 192.168.88.1 +#=============================== + +chmod 600 /etc/netplan/your_config_file.yaml + +sudo netplan --debug generate +sudo netplan try +sudo netplan -d apply +sudo netplan apply + +sudo systemctl restart network-manager +sudo systemctl restart system-networkd +``` + +Для каждого сетевого интерфейса добавляем блоки **routes** и **routing-policy**. Итоговая запись для 1 интерфейса будет выглядеть так: + +```sh +network: + version: 2 + ethernets: + enp0s5: + addresses: + - 78.89.90.12/24 + gateway4: 78.89.90.1 + match: + macaddress: 54:43:32:21:10:09 + mtu: 1500 + nameservers: + addresses: + - 8.8.8.8 + - 1.1.1.1 + - 8.8.4.4 + search: [] + set-name: enp0s5 + routes: + - to: 0.0.0.0/0 + via: 78.89.90.1 +          table: 700 +          routing-policy: +          - from: 78.89.90.12 +          table: 700 +          priority: 300 +``` + +Для других интерфейсов запись будет аналогична, начиная с имени интерфейса (**enp0s5**), но у других должен отсутствовать параметр **gateway4**, т.к. шлюз по умолчанию должен быть один. Настройки **routes** и **routing-policy**: + +- to – адрес назначения пакета. Для наших целей – любой (0.0.0.0/0) +- via – адрес шлюза для данного интерфейса +- table – имя таблицы маршрутизации. Должны быть указаны одинаковые значения в **routes** и **routing-policy** для одного интерфейса, но быть различными от интерфейса к интерфейсу. Данные таблицы мы создали в файле **rt_tables** +- from – адрес источника пакета. Для целей данного руководства – это IP адрес интерфейса +- priority – обязательное числовое значение + +После внесения настроек и сохранения файла проверим конфигурацию на ошибки: + +`netplan generate` + +============================================== +Пожалуйста, добавьте эту конфигурацию: + +``` +network: + renderer: networkd + ethernets: + ens18: + addresses: [1.2.3.4/24] + gateway4: 1.2.3.254 + dhcp4: no + dhcp6: no + nameservers: + search: [domain.tld] + addresses: [123.456.789.101] + routes: + - to: 1.2.3.254/32 + via: 0.0.0.0 + scope: link + ens19: + dhcp4: true + dhcp6: no + version: 2 +``` + +и нет необходимости перезагружать просто + +``` +sudo netplan --debug apply +``` + +```sh +Computer 1 +network: + version: 2 + renderer: networkd + ethernets: + enp1s0: + dhcp4: true + enp4s0: + addresses: + - xxx.xxx.xxx.xxx/24 + routes: + - to: default + via: 10.0.0.1 + tunnels: + wg0: + mode: wireguard + port: 51820 + key: XXX + addresses: + - 10.0.0.1/24 + peers: + - allowed-ips: [10.0.0.0/24] + endpoint: xxx.xxx.xxx.xxx:51820 + keys: + public: XXX + vxlan0: + mode: vxlan + id: 100 + local: 10.8.0.1 + remote: 10.8.0.2 + port: 4789 + link: enp4s0 + +Computer 2 + +network: + version: 2 + renderer: networkd + ethernets: + enp1s0: + dhcp4: true + enp4s0: + addresses: + - xxx.xxx.xxx.xxx/24 + routes: + - to: default + via: 10.0.0.2 + tunnels: + wg0: + mode: wireguard + port: 51820 + key: XXX + addresses: + - 10.0.0.1/24 + peers: + - allowed-ips: [10.0.0.0/24] + endpoint: xxx.xxx.xxx.xxx:51820 + keys: + public: XXXX + vxlan0: + mode: vxlan + id: 100 + local: 10.8.0.2 + remote: 10.8.0.1 + port: 4789 + link: enp4s0 + ``` + diff --git a/LINUX/NETWORK/NETWORK.md b/LINUX/NETWORK/NETWORK.md new file mode 100644 index 0000000..38dd456 --- /dev/null +++ b/LINUX/NETWORK/NETWORK.md @@ -0,0 +1,162 @@ +```sh +# Проверка нагрузки на сеть в Linux +# Иногда необходимо узнать, какие процессы активно используют сеть и сколько трафика они потребляют. + +# Просмотр сетевой активности. Вывести активные соединения:** +netstat -tunapl +# Отобразит все активные соединения и их состояние. + +# Проверить процессы, использующие сеть:** +sudo lsof -i -P -n +# Покажет, какие программы используют сетевые порты. + +# Мониторинг трафика в реальном времени:** +iftop +# Позволяет в реальном времени отслеживать трафик по интерфейсам. + +# Полезно для диагностики сетевых проблем, выявления утечек трафика и мониторинга серверов. + +#============================= +# +netstat -tlpn + +# кто слушает TCP порт? +sudo ss -tlpn + +# кто слушает UDP порт? +sudo ss -ulpn + +# Просмотр всех узлов в сети: +arp -n + +#============================= +# Сетевое соединение: +hostnamectl + +# отображение всех socket: +sudo ss -tlpn + +sudo apt-get install nload bmon nethogs + +ifconfig +ip a +ls /sys/class/net + +nc localhost 22 + +sudo lshw -C network + +sudo lspci | grep Network +lspci -knn | grep Net -A2 + +sudo ethtool enp2s0 + +ip link show +ip -br link show + +wg-quick up wg0 +wg-quick down wg0 + + +# получить IP: +curl ifconfig.me + + +sudo apt install networking-tool +sudo iwconfig +sudo iwlist wlan0 scan + + +# - поиск беспроводных pci-карт +lspci | grep -i wireless + +# - вывод этой команды будет содержать все сетевые интерфейсы +ip link list + +# раскрасить и отобразить все IP-адреса и интерфейсы в Linux в табличном формате для лучшей читаемости: +ip -br -c addr show +ip -br -c link show + +# - показать устройства wi-fi +iw dev + +# - включить устройство wlp2s0 +ip link set wlp2s0 up + +# !!! Если у вас возникнет ошибка: +# !!! RTNETLINK answers: Operation not possible due to RF-kill +# !!! Можно установить утилиту rfkill и с ее помощью решить эту проблему + +# - присвоить SSID "MyNet" +iwconfig wlan0 essid "MyNet" + +# - установит канал 3 +iwconfig wlan0 channel 3 + +# - сменить режим Managed на Ad-Hoc +iwconfig wlan0 mode Ad-Hoc + +# - использовать любую точку доступа +iwconfig wlan0 ap any + +# - установить чувствительность -50 +iwconfig wlan0 sens -50 + +# - установить значение 20 для повторной передачи MAC +iwconfig wlan0 retry 20 + +# - установить пароль 1234-pass-123 +ifconfig wlan0 key 1234-pass-123 + +# - подключение к незащищенной сети +iwconfig wlp4s0 essid ваш_essid + +# - подключение с задающим каналом сети +iwconfig wlp4s0 essid ваш_essid freq 2432M + +# -подключение к WEP зашифрованному каналу сети, ключа ASCII +iwconfig wlp4s0 essid ваш_essid key s:ваш_ключ + +# - включение режима экономии питания +iwconfig wlp4s0 power on + +# - показать статус соединения +iw dev wlp4s0 link iwconfig wlp4s0 + +# -сканирование сети на точки доступа +iw dev wlp4s0 scan iwlist wlp4s0 scan + +#  - настройка режима работы ad-hoc +iw dev wlp4s0 set type ibss + +# - подключение к незащищенной сети +iw dev wlp4s0 connect ваш_essid + +# - подключение с задающим каналом сети +iw dev wlp4s0 connect ваш_essid 2432 + +# -  -подключение к WEP зашифрованному каналу сети, ключа ASCII +iw dev wlp4s0 connect ваш_essid key 0:ваш_ключ + +# - включение режима экономии питания +iw dev wlp4s0 set power_save on + +# - сканируем сеть +iw dev wlp4s0 scan | less + +#================================== +# Изменить скорость сетевой карты + +sudo ethtool enp2s0 + +sudo ethtool -s eth0 duplex full speed 100 autoneg off + +sudo ethtool -s eth0 duplex full speed 1000 autoneg off + +# как то же самое сделать не имея ethtool? +mii-tool -F 100baseTx-FD eth0 + +# вариант совсем для гиков, на «чистом» линуксе :): +ifconfig eth0 media 100baseTX mediaopt full-duplex + +#================================== diff --git "a/LINUX/NETWORK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\270 \321\203\320\262\320\265\320\264\320\276\320\274\320\273\320\265\320\275\320\270\320\265 \320\276 \320\275\320\276\320\262\321\213\321\205 \321\203\321\201\321\202\321\200\320\276\320\271\321\201\321\202\320\262\320\260\321\205 \320\262 \321\201\320\265\321\202\320\270.md" "b/LINUX/NETWORK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\270 \321\203\320\262\320\265\320\264\320\276\320\274\320\273\320\265\320\275\320\270\320\265 \320\276 \320\275\320\276\320\262\321\213\321\205 \321\203\321\201\321\202\321\200\320\276\320\271\321\201\321\202\320\262\320\260\321\205 \320\262 \321\201\320\265\321\202\320\270.md" new file mode 100644 index 0000000..677a0b3 --- /dev/null +++ "b/LINUX/NETWORK/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\270 \321\203\320\262\320\265\320\264\320\276\320\274\320\273\320\265\320\275\320\270\320\265 \320\276 \320\275\320\276\320\262\321\213\321\205 \321\203\321\201\321\202\321\200\320\276\320\271\321\201\321\202\320\262\320\260\321\205 \320\262 \321\201\320\265\321\202\320\270.md" @@ -0,0 +1,49 @@ +```sh +#!/bin/bash + +# Укажите диапазон сети (пример: 192.168.1.0/24) +NETWORK="192.168.1.0/24" + +# Файл для хранения предыдущего списка устройств +KNOWN_DEVICES="$HOME/known_devices.txt" + +# Файл для временного списка +CURRENT_DEVICES="$HOME/current_devices.txt" + +# Сканируем сеть и сохраняем MAC-адреса активных устройств +arp-scan --localnet | awk '/:/{print $2}' | sort > "$CURRENT_DEVICES" + +# Если это первый запуск, просто сохраняем список +if [ ! -f "$KNOWN_DEVICES" ]; then + cp "$CURRENT_DEVICES" "$KNOWN_DEVICES" + echo "🔍 Список известных устройств сохранён." + exit 0 +fi + +# Поиск новых устройств +NEW_DEVICES=$(comm -13 "$KNOWN_DEVICES" "$CURRENT_DEVICES") + +if [ -n "$NEW_DEVICES" ]; then + echo "🚨 Обнаружены новые устройства в сети:" + echo "$NEW_DEVICES" + notify-send "Новые устройства в сети" "$NEW_DEVICES" + echo "$NEW_DEVICES" >> "$KNOWN_DEVICES" +else + echo "✅ Новых устройств не обнаружено." +fi + +# Обновляем список известных устройств +mv "$CURRENT_DEVICES" "$KNOWN_DEVICES" +``` + + Использует arp-scan для поиска активных устройств. + +🟢 Сохраняет список известных устройств и сравнивает его с новыми данными. + +🟢 Отправляет уведомление, если в сети появилось новое устройство. + +🟢 Можно добавить в crontab для автоматического мониторинга: + +`*/5 * * * * /path/to/script.sh` + +Этот скрипт поможет отслеживать неизвестные подключения и контролировать безопасность сети. \ No newline at end of file diff --git "a/LINUX/NETWORK/\320\222\320\275\320\265\321\210\320\275\320\270\320\271 IP \320\270\320\267 \320\272\320\276\320\275\321\201\320\276\320\273\320\270.md" "b/LINUX/NETWORK/\320\222\320\275\320\265\321\210\320\275\320\270\320\271 IP \320\270\320\267 \320\272\320\276\320\275\321\201\320\276\320\273\320\270.md" new file mode 100644 index 0000000..d1a5d4f --- /dev/null +++ "b/LINUX/NETWORK/\320\222\320\275\320\265\321\210\320\275\320\270\320\271 IP \320\270\320\267 \320\272\320\276\320\275\321\201\320\276\320\273\320\270.md" @@ -0,0 +1,17 @@ +```sh +# Сетевое соединение: +hostnamectl + +wget -qO- eth0.me + +wget -qO- ipecho.net/plain +curl ifconfig.me +wget -O - -q ifconfig.me/ip + + +curl https://icanhazip.com +curl https://ipinfo.io/ip +curl https://ifconfig.me + + +``` diff --git "a/LINUX/NETWORK/\320\241\320\232\320\236\320\240\320\236\320\241\320\242\320\254 \320\241\320\225\320\242\320\225\320\222\320\236\320\231 \320\232\320\220\320\240\320\242\320\253.md" "b/LINUX/NETWORK/\320\241\320\232\320\236\320\240\320\236\320\241\320\242\320\254 \320\241\320\225\320\242\320\225\320\222\320\236\320\231 \320\232\320\220\320\240\320\242\320\253.md" new file mode 100644 index 0000000..66ad165 --- /dev/null +++ "b/LINUX/NETWORK/\320\241\320\232\320\236\320\240\320\236\320\241\320\242\320\254 \320\241\320\225\320\242\320\225\320\222\320\236\320\231 \320\232\320\220\320\240\320\242\320\253.md" @@ -0,0 +1,10 @@ +```sh +# Сетевое соединение: +hostnamectl + +ip a + +cat /sys/class/net//speed + +sudo ethtool | grep Speed +``` diff --git a/LINUX/NGINX.md b/LINUX/NGINX.md new file mode 100644 index 0000000..21e9380 --- /dev/null +++ b/LINUX/NGINX.md @@ -0,0 +1,538 @@ +## Настройка перенаправлений + +Настройки необходимо вносить в файлах конфигураций виртуальных доменов. В [Linux](https://www.dmosk.ru/terminus.php?object=linux) на основе RPM (CentOS, Red Hat), как правило, они расположены в директории /etc/nginx/conf.d/. В Linux на основе Deb (Ubuntu, Debian) — в директории /etc/nginx/sites-enabled/. Во [FreeBSD](https://www.dmosk.ru/terminus.php?object=freebsd) все в одном файле — /usr/local/etc/nginx/nginx.conf. + +Саму настройку на перенаправление в NGINX можно прописать несколькими способами. + +1. Первый: + +rewrite ^ https://$host$request_uri? <флаг>; + +_* **$host** — имя хоста из запроса, если отсутствует — имя в поле «Host» заголовка, если тоже отсутствует — имя сервера; **$request_uri** — первоначальный запрос с аргументами (все, что идет после доменного имени). +** где флаги могут быть следующие:_ + +- _permanent — перенаправление с кодом 301._ +- _redirect — перенаправить с кодом 302._ +- _last — закончить обработку с переходом в новый location._ +- _break — закончить обработку и остаться в текущем location._ + +2. Второй:  + +return <код> https://$host$request_uri; + +_* где коды могут использоваться любые, но чаще всего — 301, 302, 404._ + +Есть различные мнения, какой из методов лучше и безопаснее, поэтому каким воспользоваться — решать по ситуации. В данных примерах используются оба варианта. + +После внесения изменений, необходимо проверить их корректность: + +nginx -t + +И для их применения перезапустить веб-сервер: + +systemctl restart nginx + +service nginx restart + +_* в первом примере перезапуск выполняется на новых системах Linux. Второй пример — на устаревших или FreeBSD._ + +Проверяя редиректы в [браузере](https://www.dmosk.ru/terminus.php?object=brouser), следует учесть, что настройки могут [кэшироваться](https://www.dmosk.ru/terminus.php?object=cache). Для обновления кэша используйте комбинацию Ctrl + F5. Если и это не помогает, закрывайте вкладку и открывайте новую. + +## С HTTP на HTTPS (другой порт) + +Пример конфигурации для перенаправления запросов на другой порт — с 80 (http) на 443 (https): + +server { +    listen 80; +    server_name domain.ru www.domain.ru; +    return 301 https://$host$request_uri; +} + +_* в данном примере для всех обращений к сайту domain.ru по 80 порту ([http](https://www.dmosk.ru/terminus.php?object=http)) будет работать редирект на 443 порт ([https](https://www.dmosk.ru/terminus.php?object=https)) с кодом 301 (для склеивания [доменов](https://www.dmosk.ru/terminus.php?object=domain))._ + +Также мы можем добавить условие, чтобы не перенаправлять на https для определенных ссылок, например: + +server { +    listen 80; +    server_name domain.ru www.domain.ru; +    if ($uri !~ /page.html){ +        return 301 https://$host$request_uri; +    } +} + +_* в данном примере запрос на страницу **/page.html** будет открыт по http._ + +Есть еще способ настройки директивы **server** сразу для http и https. При этом, если зайти по 80 порты, нас перекинет на 443: + +server { +    listen       80; +    listen       443 ssl; +    server_name  domain.ru www.domain.ru; + +    if ($scheme = 'http') { +        return 301 https://$host$request_uri; +    } + +    ssl_certificate     /etc/nginx/ssl/cert.pem; +    ssl_certificate_key /etc/nginx/ssl/cert.key; + +    ... +} + +_* данный способ удобен, чтобы не создавать несколько секций server со своими настройками._ + +## С одного домена на другой + +server { +        ... +        server_name domain1.ru; +        return 302 http://domain2.ru$request_uri; +} + +## C домена без www на домен с www + +server { +        ... +        server_name domain.ru; +        return 301 http://www.$host$request_uri; +} + +## С www на без www + +Конкретный домен: + +server { +        ... +        server_name www.domain.ru; +        return 301 $scheme://domain.ru$request_uri; +} + +Все домены, которые обслуживает nginx: + +server { +        ... +        server_name "~^www\.(.*)$"; +        return 301 $scheme://$1$request_uri; +} + +Или с использованием if: + +server { +        ... +        if ($host ~ "^www\.(.*)$") { +                return 301 $scheme://$1$request_uri; +        } +        ... +} + +## C index.php на / (корень) + +Данная настройка позволит перевести все запросы с /index.php на корневой адрес /: + +server { +        ... +        if ($request_uri ~ "^(.*)index\.(?:php|html)") { +                return 301 $1; +        } +} + +## Перенаправление запросов для отсутствующих доменов (перенаправление по умолчанию) + +Если обращение к веб-серверу идет по [IP-адресу](https://www.dmosk.ru/terminus.php?object=ipaddr) или домену, который не прописан в конфигурационном файле, можно перенаправить весь трафик на домен по умолчанию: + +server { +        listen 80 default_server; +        return 302 https://welcome.domain.ru$request_uri; +} + +или независимо от протокола: + +server { +        listen 80 default_server; +        return 302 $scheme://welcome.domain.ru$request_uri; +} + +server { +        listen 443 ssl default_server; +        return 302 $scheme://welcome.domain.ru$request_uri; + +        ssl_certificate /etc/nginx/ssl/cert.pem; +        ssl_certificate_key /etc/nginx/ssl/cert.key; +} + +_* **$scheme** позволяет перевести запрос на тот же протокол (http или https), по которому он был инициирован. +* если nginx должен слушать и обрабатывать запросы по https, необходимо указывать в настройках пути к сертификатам._ + +## С IP-адреса на домен + +В данном случае мы переводим все запросы по IP-адресу на конкретный домен: + +server { +        listen 80; +        server_name 192.168.1.15; +        return 301 http://site.ru$request_uri; +} + +_* при отправке http-запроса на сервер **192.168.1.15** по IP-адресу, он будет переведен на домен **site.ru**._ + +## Редирект домена и всех его поддоменов + +server { +        ... +        server_name  domain domain.*; +        return 301 https://$host$request_uri; +} + +## На другой файл + +Это скорее не перенаправление, а алиас или rewrite. Позволяет по запросу одного из файлов, отдать другой: + +server { +        ... +        location = /robots.txt { +            rewrite ^/robots.txt$ /robots2.txt; +        } +} + +_* в данном примере по запросу **robots.txt**, сервер отдаст содержимое **robots2.txt**._ + +## Часть url на другой сервер + +Перенаправить запрос на другой сервер при обращении по url page1: + +server { +        ... +        server_name  domain1.ru; +        location  ~ ^/page1/(.*)$ { +            return 301 $scheme://domain2.ru/$1; +        } +} + +_* в данном примере для всех запросов, начинающихся на **/page1/...** будет работать перенаправление на другой домен **domain2.ru**._ + +## Редирект со слешем + +**1. Убрать слеш в конце url** + +server { +    ... +    if (!-f $request_filename ) { +        rewrite ^/(.*)/$ /$1 permanent; +    } +} + +**2. Добавить слеш в конце url** + +server { +    ... +    if (!-f $request_filename ) { +        rewrite ^(.*[^/])$ $1/ permanent; +    } +} + +## Удаляем расширение + +Для перенаправления запроса, где в URL есть полное название файла скрипта (с расширением) используем конфигурацию: + +server { +    ... +    if ($request_uri ~ "^(.*)\.(?:php|html)") { +        return 301 $1; +    } +} + +_* в данном случае все запросы, которые заканчиваются на **.php** или **.html**, будут перенаправляться на страницы без данных расширений._ + +Для примера, запрос http://site-example.ru/page.php будет переведен на http://site-example.ru/page. + +## На другую страницу + +Нам может понадобиться перенаправлять запросы с одной страницы сайта на другую. Приведем примеры, как это сделать с помощью return и rewrite. + +а) с помощью rewrite: + +server { +        ... +        rewrite ^/page1$ /page2 permanent; +} + +б) с помощью return: + +server { +        ... +        location = /page1 { +            return 301 /page2; +        } +} + +## Удалить часть URL + +Иногда нужно удалять часть url. Это можно сделать следующими способами: + +server { +        ... +        rewrite /deleted-url/(.*) /$1 permanent; +} + +или: + +server { +        ... +        if ($request_uri ~ "/deleted-url/(.*)") { +                return 301 $1; +        } +} + +_* в данном примере из url мы удалим **deleted-url/**._ + +## Перенаправить запрос в случае обращения к несуществующим файлам + +Предположим, что нам нужно обращаться к скриптам на сервере, но без прописывания в URL .php на конце. Запрос будет выглядеть, примерно, http://url/. Чтобы nginx перекинул запрос на url.php вставляем следующее: + +server { +    ... +    location / { +       root /var/www; +       try_files $uri $uri/ $uri.php $uri.html /404.php =404; +    } +} + +_* в данном примере мы проверим наличие скрипта по пути **$uri**, затем **$uri/**. И уже после мы добавим к запросу **.php** и **.html**. Если ни одного скрипта не будет найдено, запрос будет перенаправлен на страницу **404.php**, которая вернет код 404._ + +Также можно решить задачу с помощью **if** и **rewrite**: + +server { +        ... +        if (!-e $request_filename){ +                rewrite ^(.*)$ /$1.php; +        } +} + +_* в данном примере мы проверяем наличие файла, к которому идет обращение. И если его нет, то происходит замена адреса на такое же имя файла с .php на конце._ + +## Перевод запросов, если файла не существует + +Данное действие не является редиректом, но близко по смыслу — NGINX проверяет наличие файла скрипта, к которому идет обращение, и если его нет, переводит запрос на другой файл. Как правило, это используется для того, чтобы перевести все обращения на файл index.php. + +server { +    ... +    location / { +        try_files $uri $uri/ /index.php?$query_string; +    } +    ... +} + +_* в данном примере мы скажем веб-серверу сначала проверить наличие скрипта по пути **$uri**, затем **$uri/** и если ответ будет 404, запросы будут обрабатываться с помощью файла **index.php** в корневой директории._ + +## Проксирование + +Проксирование, в отличие от редиректа, не передает инструкции браузеру перейти на другой url — NGINX сам выполняет http-запрос по другому адресу и возвращает готовый ответ. Эта возможность может применяться для внутреннего распределения серверных ресурсов. + +Хоть это и не совсем редирект, рассмотрим примеры его настройки, так как очень часто нужно не перенаправление, а, как раз, обратное проксирование. + +### 1. На другой сервер + +Пример внутреннего перенаправления http-запроса на другой веб-сервер: + +location / { +        proxy_pass          http://192.168.0.15:8080/; +        proxy_redirect      off; +        proxy_http_version  1.1; + +        proxy_set_header  Host               $host; +        proxy_set_header  Upgrade            $http_upgrade; +        proxy_set_header  Connection         "upgrade"; +        proxy_set_header  X-Real-IP          $remote_addr; +        proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for; +        proxy_set_header  X-Forwarded-Proto  http; +} + +* в данном случае, принимать запросы от браузера и отвечать на них будет NGINX, а сама обработка будет выполняться на сервере с IP-адресом 192.168.0.15 на порту 8080. Рассмотрим все директивы: + +- **proxy_pass —** схема, узел и порт. По сути, это как и куда будет перенаправлен запрос. +- **proxy_redirect —** позволяет отловить редиректы или определенные адреса и заменить их на другие. Пример работы с данной директивой [описан ниже](https://www.dmosk.ru/miniinstruktions.php?mini=nginx-redirects#proxypass-redirects). +- **proxy_http_version —** задает версию протокола http. По умолчанию имеет значение 1.0. +- **proxy_set_header —** добавляет http-заголовки: + - **Host —** сообщяет принимающей стороне, какой виртуальный хост использовать. Важный заголовок, если данная принимающая сторона обслуживает разные домены и требуется точная передача имени. + - **Upgrade —** действует только для http версии 1.1. Позволяет обновить протокол или его версию для уже созданного соединения. Например, с HTTP 1.1 до HTTP 2.0 или в WebSocket. + - **Connection —** определяет, останется ли сетевое соединение открытым после завершения текущей транзакции. + - **X-Real-IP —** позволяет передать принимающей стороне реальный IP-адрес посетителя. В противном случае, принимающая сторона получить адрес самого nginx. + - **X-Forwarded-For —** второй заголовок, с помощью которого передается реальный IP-адрес посетителя. + - **X-Forwarded-Proto —** определяет протокол, по которому клиент подключился к nginx. По возможности, стоит использовать https, но все зависит от принимающей стороны — она может отказаться принимать https или наоборот, требовать только его. + +Использование NGINX в качестве http-прокси: + +server { +        ... +        server_name site1.ru www.site1.ru; +        location / { +            proxy_pass http://192.168.1.21/; +            proxy_redirect     off; +            proxy_set_header   Host             $host; +            proxy_set_header   X-Real-IP        $remote_addr; +            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; +        } +} + +server { +        ... +        server_name site2.ru www.site2.ru; +        location / { +            proxy_pass http://192.168.1.22/; +            proxy_redirect     off; +            proxy_set_header   Host             $host; +            proxy_set_header   X-Real-IP        $remote_addr; +            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; +        } +} + +_* в данном примере запросы на **site1.ru** будут перекинуты на сервер **192.168.1.21**, а запросы на **site2.ru** — **192.168.1.22**._ + +HTTP proxy с авторизацией (если удаленный веб-сервер требует аутентификации): + +server { +    ... +    location / { +        proxy_pass http://10.10.10.10/page/; +        proxy_set_header Authorization "Basic dGVzdDp0ZXN0"; +        ... +    } +} + +_* где **10.10.10.10/page** — страница, на которую будут перекинуты запросы; **dGVzdDp0ZXN0** — логин:пароль test:test, закодированные в формате base64._ + +### 2. Часть url на другой сервер + +Выше мы рассмотрели пример перенаправления запроса по части веб-адреса. По схожему сценарию мы можем делать проксирование: + +server { +    ... +    location  ~ ^/page1/(.*)$ { +        proxy_pass   $scheme://10.10.10.10/$1$is_args$args; +    } +} + +_* и так, в данном примере при обращении по адресу **site.ru/page1/<что-то еще>**, nginx сделает внутренний запрос на сервер **10.10.10.10** по адресу **10.10.10.10/<что-то еще>** и вернет готовый ответ. +** обратите внимание, что мы добавили **$is_args$args —** если строка запроса имеет аргументы, то их также нужно передать._ + +### 3. На другой сайт + +Мы можем сделать так, что при переходе по одному адресу у нас будет открываться совершенно другой сайт: + +server { +    ... +    server_name dmosk.local; +    location / { +        proxy_pass https://www.dmosk.ru; +        proxy_set_header   Host             www.dmosk.ru; +        proxy_set_header   X-Real-IP        $remote_addr; +        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; +    } +} + +_* в данном случае мы при обращении к нашему серверу (до доменному имени **dmosk.local**) будем попадать на сайт **https://www.dmosk.ru**. Обратите внимание, что в **proxy_set_header** мы передаем хосту его имя — в противном случае, как правило, другой сервер вернет ошибку. Также мы не указываем **proxy_redirect**, иначе, nginx будет переводить запросы на реальный сайт (отправлять инструкции браузеру перейти на него), а не тот, что мы используем за http-прокси._ + +### 4. На другой сайт по части URL + +Если нам нужно настроить проксирование на другой сайт при обращении к определенной странице сайта, настраиваем NGINX так: + +server { +    ... +    server_name www.dmosk.ru; +    location /page { +        rewrite /page/(.*) /$1  break; +        proxy_pass https://www.site.ru; +        proxy_set_header   Host             www.site.ru; +        proxy_set_header   X-Real-IP        $remote_addr; +        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; +    } +} + +_* в данном примере, если мы перейдем на страницу **www.dmosk.ru/page**, то мы попадем на сайт **www.site.ru**._ + +### 5. Редиректы при проксировании + +Если при проксировании хост возвращает инструкцию браузеру для выполнения редиректа, обозреватель может сменить адрес сайта. Это особенно не удобно, когда проксирование мы выполняем на другой сайт. Чтобы отловить редиректы и заменить их своими значениями, мы должны воспользоваться опцией **proxy_redirect**. Рассмотрим ее применение для предыдущего примера, когда мы проксировали запрос на сайт www.dmosk.ru: + +server { +    listen 80; +    server_name dmosk.local www.dmosk.local; +    location / { +        proxy_pass https://www.dmosk.ru; +        proxy_set_header   Host             www.dmosk.ru; +        proxy_set_header   X-Real-IP        $remote_addr; +        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; + +        proxy_redirect https://www.dmosk.ru/url1 http://dmosk.local/url2; +        proxy_redirect https://www.dmosk.ru/ http://dmosk.local/; +    } +} + +_* в конкретном случае мы проксируем запросы **http://dmosk.local** на сайт **www.dmosk.ru**, но если он вернет инструкцию для редиректа **https://www.dmosk.ru/url1**, в браузере он должен быть заменен на **http://dmosk.local/url2**. А также любое перенаправление для **https://www.dmosk.ru/** будет заменено на **http://dmosk.local/**._ + +### 6. Таймауты + +Сервер может генерировать, довольно, долго ответ. Если за определенное время nginx не получит ответ, он вернет ошибку с кодом 504. Мы можем задать свои значения таймаутов, если приложение должно отвечать долго, например: + +    location / { +        ... +        proxy_connect_timeout  30; +        proxy_send_timeout     30; +        proxy_read_timeout     300; +        ... +    } + +* где: + +- **proxy_connect_timeout —** время соединения с удаленным сервером. +- **proxy_send_timeout —** время ожидания для отправки запроса на сервер. +- **proxy_read_timeout —** время ожидания ответа от сервера. + +** время указывается в секундах. + +## Работа с location + +Обратите внимание, что мы часто использовали в качестве условия запроса его URN (Unifrorm Resource Name или унифицированное имя ресурса). Поэтому важно понимать, как мы можем работать с ними при помощи nginx, когда будем обрабатывать запросы для редиректов или проксирований. + +### Типы location + +Выше мы применяли различные ваианты написания location. Рассмотрим их чуть подробнее: + +- **= —** явное указание на точное название адреса запроса. +- **^~ —** регулярное выражение. Требует совпадения в начале строки. +- **/ или /path —** строковое выражение. Требует совпадения в начале строки. Сильно напоминает **^~**, но не позволяет применять регулярные выражения. +- **~ —** регулярное выражение. С учётом регистра. +- **~* —** регулярное выражение. Без учёта регистра. + +### Приоритеты + +В конфигурации nginx мы можем создать много конструкций на подобие: + +location /api { +} + +location /news { +} + +location /newstest { +} + +Они начнут обрабатываться сверху вниз, пока не будет найден первый подходящий вариант. Таким образом, в нашем примере, содержимое страницы **newstest** не сможет загрузиться, так как будет загружено содержимое страницы **news** (ее location выше в конфигурации). + +Приоритеты при выборе, какой location будет грузиться раньше, работают не только по принципу "сверху вниз". Также учитывается тип обработки (выше мы уже их рассмотрели): + +**1. location = /path.** Точное совпадение. Самый высокий приоритет. Сначала будут обрабатываться все локейшены данного типа. + +**2. location ^~ /path.** Регулярное выражение с совпадением в начале строки. + +**3. location ~ /path/ , location ~* .(api|test).** Регулярные выражения. + +**4. location /path.** Строковое выражение. Самый низкий приоритет. + +## Немного о 301 и 302 + +В чем принципиальная разница между ответом с кодом 301 и 302? Для обычного посетителя сайта разницы нет. А вот для поискового робота разница огромная. + +301-й редирект говорит о склеивании страниц. Это означает для поисковика то, что старая и новая страницы — это одно и то же. Таким образом, результаты ранжирования необходимо сохранить для новой страницы. + +302-о перенаправление просто говорит о том, что нужно перейти по другому адресу. Поисковый робот не сохраняет результат выдачи для новой страницы, индексируя его с нуля. \ No newline at end of file diff --git a/LINUX/PLEX.md b/LINUX/PLEX.md new file mode 100644 index 0000000..5e178d8 --- /dev/null +++ b/LINUX/PLEX.md @@ -0,0 +1,33 @@ +Plex Media Server — это ключевое решение для энтузиастов потоковой передачи, которые стремятся организовать и получить доступ к своим медиабиблиотекам без проблем с различных устройств. Его способность перекодировать медиафайлы на лету обеспечивает совместимость на разных платформах, что делает его незаменимым для унифицированного потокового опыта. + +Ключевые особенности Plex Media Server включают в себя: + +- **Централизованная медиабиблиотека:** объединяет ваши видео, музыку и фотографии на одной простой в навигации платформе. +- **Транскодирование «на лету»:** преобразует медиаданные в оптимальный формат для каждого устройства, улучшая качество воспроизведения. +- **Удаленный доступ:** транслируйте свой контент из любой точки мира, на любое устройство с доступом в Интернет. +- **Удобный интерфейс:** обеспечивает визуально привлекательную и интуитивно понятную навигацию. +- **Настраиваемые плейлисты и библиотеки:** адаптируйте свои впечатления от просмотра и прослушивания, создавая персонализированные коллекции. +- **Расширенная поддержка устройств:** совместимость с различными устройствами, от смартфонов до смарт-телевизоров. +- **Безопасный обмен:** безопасно делитесь выбранным контентом с друзьями и семьей. +- **Регулярные обновления:** постоянно совершенствуется за счет новых функций и улучшений. + +```sh +sudo apt update && sudo apt upgrade -y +sudo apt install gpg ca-certificates software-properties-common apt-transport-https curl -y +curl -fsSL https://downloads.plex.tv/plex-keys/PlexSign.key | sudo gpg --dearmor -o /usr/share/keyrings/plex.gpg +echo "deb [signed-by=/usr/share/keyrings/plex.gpg] https://downloads.plex.tv/repo/deb public main" | sudo tee /etc/apt/sources.list.d/plexmediaserver.list + +sudo apt update +sudo apt install plexmediaserver + +systemctl status plexmediaserver + +sudo systemctl start plexmediaserver +sudo systemctl enable plexmediaserver +sudo systemctl restart plexmediaserver + + +sudo ufw enable +sudo ufw allow 32400 + +``` \ No newline at end of file diff --git a/LINUX/PROGRAMS_bash.md b/LINUX/PROGRAMS_bash.md new file mode 100644 index 0000000..e406fbe --- /dev/null +++ b/LINUX/PROGRAMS_bash.md @@ -0,0 +1,311 @@ +Волшебная строчка, которую нужно добавить после `#!/bin/bash`, чтоб скрипт можно было отлаживать по шагам +```bash +#!/bin/bash +trap 'echo "# $BASH_COMMAND";read' DEBUG + +echo line1 +echo line2 +echo line3 +``` + +**Процесс отладки** + +Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши ``. + +Если понимаем, что что-то пошло не так, нажимаем 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. + +================================= diff --git a/LINUX/PS.md b/LINUX/PS.md new file mode 100644 index 0000000..c333381 --- /dev/null +++ b/LINUX/PS.md @@ -0,0 +1,34 @@ +```sh +# отправить программу в фон и поставить на паузу: +ctrl + z (cmd + z) + +[1] + 68920 suspended vim . + +ps | grep vim +... +... + +# Посмотреть свернутые процессы: +jobs + +[1] + 68920 suspended vim . + +# Восстановить: +fg %2 (fg # если одна) + +# Запустить исполнение в фоне: +bg :2 (bg # если один) + +# Можно запускать программы уже в бекграунде используя амперсанд: +python app.py & + +kill -9 68920 + +# Запущенная в консоли программа: +ctrl + z (cmd + z) + +tail -f /tmp/log + + +``` + diff --git a/LINUX/PostgreSQL.md b/LINUX/PostgreSQL.md new file mode 100644 index 0000000..ce3ebf8 --- /dev/null +++ b/LINUX/PostgreSQL.md @@ -0,0 +1,165 @@ +# Как настроить сетевое подключение + + ![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 11.12.2024  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 11.10.2016 + +По умолчанию, сервер баз данных pgsql разрешает подключение только с локального компьютера. Данная инструкция показывает, как разрешить подключения с удаленных систем. + +Для настройки нам нужно будет внести изменения в два файла: +## Основной конфигурационный файл postgresql.conf + +Для начала посмотрим путь расположения конфигурационного файла **postgresql.conf**: + +su - postgres -c "psql -c 'SHOW config_file;'" + +Команда выдаст, примерно, следующее: + +----------------------------------------- + /var/lib/pgsql/data/postgresql.conf +(1 row) + +_* нас интересует строчка **/var/lib/pgsql/data/postgresql.conf** — это путь расположения нужного нам конфигурационного файла._ + +Теперь открываем на редактирование основной файл конфигурации PostgreSQL по найденному пути: + +vi /var/lib/pgsql/data/postgresql.conf + +Находим и редактируем следующее: + +listen_addresses = '*' + +_* по умолчанию, параметр закомментирован и настроен на прослушивание запросов только с локального сетевого интерфейса. В данном примере мы разрешили прослушивание запросов на всех IP-адресах **(*)**, но, если требуется более безопасная настройка, можно просто перечислить последние через пробел._ + +Чтобы изменения вступили в силу, перезапускаем службу postgresql: + +systemctl restart postgresql + +_* данное имя службы (**postgresql**) может сильно отличаться, в зависимости от системы. Иногда, необходимо добавить версию postgresql или использовать другое имя. Стоит обратиться к документации, чтобы выяснить точное название сервиса._ + +Проверим, что настройка применилась: + +ss -tunlp | grep 5432 + +_* где **5432 —** порт, на котором работает postgresql. Данный номер используется по умолчанию, но в вашей системе он может быть другим._ + +В ответ мы должны получить строку, содержащую что-то на подобие: + +... 0.0.0.0:5432 ... + +Первые **0.0.0.0** говорят о том, что PostgreSQL слушает сетевые запросы на всех сетевых интерфейсах. Если мы ограничили прослушивание, настраивая опцию **listen_addresses**, то вместо нулей мы увидим конкретный IP, на котором разрешили работать службе. + +## Файл host-based authentication (pg_hba.conf) + +Смотрим путь расположения конфигурационного файла **pg_hba.conf**: + +su - postgres -c "psql -c 'SHOW hba_file;'" + +Команда выдаст, примерно, следующее: + +--------------------------------- + /var/lib/pgsql/data/pg_hba.conf +(1 row) + +Открываем на редактирование файл, путь до которого вернула команда выше: + +vi /var/lib/pgsql/data/pg_hba.conf + +Находим: + +# IPv4 local connections: + +и сразу под ним добавляем строку на подобие: + +host     all     all     192.168.0.10/32     md5 + +* в данном примере мы: + +- разрешаем удаленные подключения к серверу с компьютера **192.168.0.10**. +- доступ предоставляется всем базам (первое **all**). +- доступ предоставляется всем учетным записям (второе **all**). +- обратите внимание на **md5** — способ хэширования пароля. В зависимости от версии postgresql может потребоваться использовать другой вариант. + +** При желании, вместо all можно указать конкретные данные для повышения безопасности. + +Чтобы изменения вступили в силу, перезапускаем службу postgresql: + +systemctl restart postgresql + +## Проверка подключения + +Проверить подключение можно с удаленного компьютера следующей командой: + +psql -h 192.168.0.15 -U usersql + +_* где  **192.168.0.15** — IP-адрес сервера баз данных; **usersql** — имя учетной записи, от которой идет подключение._ + +================================================== +```sh + +# Установка POSTGRES из исходников: +curl ............ + +sudo tar xzvf postgresql.tar.gz +cd postgresql + +./configure --prefix=/var/lib/postgresql +make world +sudo make install world +sudo chown -R vlapa:vlapa /var/lib/postgresql + +export PGDATA=/var/lib/postgresql + +./bin/pg_ctl initdb +./bin/pg_ctl -D /var/lib/postgresql/main/ start +./bin/psql -h localhost -U vlapa postgres + \d + create database some_temp_db; + \c some_temp_db + + +#============================= +sudo tar xzvf file_name*.tgz -C /opt/ +cd /opt/file_name + +./install + +tar -xvzf имя_файла + +# Для архивов сжатых с помощью BZIP (bz, bz2 и т.д.) выполняем: +tar -xvjf имя_файла + +#Команды Tar: + +-x — извлечь файлы из архива; +-v — подробный вывод информации на экран; +-f — Обязательная опция. Если не указать, Tar будет пытаться использовать магнитную ленту; +-z — обработать архив сжатый gzip’ом; +-j — обработать архив сжатый bzip’ом. + +vim `~/.local/share/applications/PyCharm.desktop +``` + +```bash +[Desktop Entry] +Version=1.1 +Type=Application +Name=nsnake +GenericName=Classic snake game on the terminal +NoDisplay=false//отображать в меню +Icon=nsnake +Exec=nsnake +Terminal=true//запускать в терминале +Actions= +Categories=ActionGame;Game; +Keywords=snake;ncurses;textual;terminal; +``` + +```bash +[Desktop Entry] //desktop-файл всегда начинается с этого +Encoding=UTF-8 //кодировка +Type=Application //тип +Name=Eclipse C/C++IDE //имя +Comment=Eclipse C/C++IDE //комментарий в лаунчере +Terminal=false +Exec=/home/kofed/eclipse/eclipse //путь к исполняемому файлу +Icon=/home/kofed/eclipse/icon.xpm //путь к иконке +``` diff --git a/LINUX/RANGER.md b/LINUX/RANGER.md new file mode 100644 index 0000000..4886c13 --- /dev/null +++ b/LINUX/RANGER.md @@ -0,0 +1,91 @@ +Откройте `ranger`, нажмите S, чтобы открыть `ranger`оболочку. +Затем введите `select-editor`, появится пронумерованный список доступных опций, и вам нужно будет ввести номер нужной опции. + +***Навигация:*** +``` +j/Down # - переместиться вниз +k/Up # - переместиться вверх +h # - перейти в родительский каталог +gg # - перейти в начало списка +G # - перейти в конец списка +-f # - листать вниз +-b # - листать вверх +J # - листать вниз на 1/2 страницы +K # - листать вверх на 1/2 страницы +H # - вернуться назад через историю навигации +L # - переместиться вперед по истории навигации +``` + +***Переключение директории:*** +``` +gh = cd ~ +ge = cd / etc +gu = cd / usr +gd = cd / dev +go = cd / opt +gv = cd / var +gm = cd / media +gM = cd / mnt +gs = cd / srv +gr = cd / +gR = cd для глобальной конфигурации +``` + +***Работа с файлами:*** +``` +i: показать файл (позволяет просто просмотреть текстовый файл в пейджере вместо редактирования) +l или E: открыть файл (открывает файл в файловом обработчике по умолчанию) +r: открыть файл с помощью… (позволяет выбрать программу, с помощью которой будет открыт файл) +z: изменить настройки (часто используемые тумблеры) +zh: просмотреть скрытые файлы +: выбрать текущий файл +t: отметить файл +cw: переименовать текущий файл +/: поиск файлов +n: перейти к следующему совпадению +N: вернуться к предыдущему совпадению +yy: скопировать файл +dd: отметить файл, чтобы вырезать +pp: вставить файл +: удалить выбранный файл. +``` + +***Вкладки:*** +``` +-n = Создать новую вкладку +-w = Закрыть текущую вкладку + = Следующая вкладка +  = Предыдущая вкладка +``` + +***Общие команды:*** +``` +?: просмотр мануала Ranger +1?: просмотреть комбинации клавиш +2?: справка по командам +3?: справка по настройкам +R: обновить текущий каталог +Q: выход. + +! – выполнить команду из оболочки (не-ranger команду) +: — выполнить команду ranger +du – измерить использование диска текущего каталога +chmod – изменить права на текущий файл. +``` + +Также есть множество флагов, которые можно использовать для изменения поведения команды. Их нужно использовать с тире после символа восклицательного знака (для команд оболочки) или двоеточия (для команд ranger). +``` +-s: # игнорировать вывод текущей команды +-d: # отключить процесс и работать в фоновом режиме +-p: # вернуть вывод в пейджер Ranger +-w: # Не возвращать сразу после выполнения команды. +-c: # выполнить команду на текущий файл (не на выбранные файлы). +``` + +Также Ranger позволяет объединять файлы в группы для выполнения замены. Это делается при помощи заполнителей: +``` +%f: # заменить выделенный файл +%d: # заменить текущий каталог +%s: # заменить выбранные файлы +%t: # заменить текущие отмеченные файлы. +``` diff --git "a/LINUX/REPOSITORIES \321\201\320\262\320\276\320\271 \321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271 \321\201 \320\277\320\260\320\272\320\265\321\202\320\260\320\274\320\270.md" "b/LINUX/REPOSITORIES \321\201\320\262\320\276\320\271 \321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271 \321\201 \320\277\320\260\320\272\320\265\321\202\320\260\320\274\320\270.md" new file mode 100644 index 0000000..172b126 --- /dev/null +++ "b/LINUX/REPOSITORIES \321\201\320\262\320\276\320\271 \321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271 \321\201 \320\277\320\260\320\272\320\265\321\202\320\260\320\274\320\270.md" @@ -0,0 +1,33 @@ +Если вам нужно централизованно управлять программным обеспечением в сети или хранить свои пакеты, можно создать локальный репозиторий. Это полезно для DevOps, админов и разработчиков. + +⚙️ **Настройка локального репозитория (Debian/Ubuntu)** +```sh +# Создаем каталог для пакетов:** + +mkdir -p /var/repo/{conf,incoming} + +# Генерируем конфигурацию репозитория** + +# В /var/repo/conf/distributions добавляем: +Origin: MyRepo   +Label: My Custom Repository   +Suite: stable   +Codename: custom   +Components: main   +Architectures: amd64   +Description: My private Debian repository + +# Добавляем пакеты в репозиторий:** +cp mypackage.deb /var/repo/incoming/ + +# Индексируем репозиторий: +cd /var/repo && dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz + +# Добавляем в систему (клиент) + +# Редактируем /etc/apt/sources.list: +deb [trusted=yes] file:///var/repo custom main + +sudo apt update + +``` diff --git a/LINUX/RM.md b/LINUX/RM.md new file mode 100644 index 0000000..78e1612 --- /dev/null +++ b/LINUX/RM.md @@ -0,0 +1,10 @@ +Как **удалить** непустую папку **Linux**? + +Если хотите **удалить** пустой каталог, задействуйте опцию - d +`rm -d dirname + +Если хотим **удалить** **непустой** каталог и все файлы, которые в нём находятся, поступаем следующим образом: +`rm -r dirname + +Опять же, в случае наличия защиты от записи, система **Linux** спросит пользователя, стоит ли выполнять **удаление**. Если мы хотим **удалить** файлы и **непустые** каталоги без лишних вопросов, делаем так: +`rm -rf dirname \ No newline at end of file diff --git a/LINUX/ROOT.md b/LINUX/ROOT.md new file mode 100644 index 0000000..47a70dd --- /dev/null +++ b/LINUX/ROOT.md @@ -0,0 +1 @@ +sudo passwd root diff --git a/LINUX/RSYNC.md b/LINUX/RSYNC.md new file mode 100644 index 0000000..8ced185 --- /dev/null +++ b/LINUX/RSYNC.md @@ -0,0 +1,373 @@ +```sh +sudo apt-get install rsync + +rsync_ _опции_ _источник_ _приемник_ + +rsync -avzhe ssh vlapa@178.20.46.157:~/git/ ~/1Tb_r1-a/Backup/_git/ +``` + +****-v**** - Выводить подробную информацию о процессе копирования;** +-****-q**** - Минимум информации; +****-c**** - Проверка контрольных сумм для файлов; +****-a**** - Режим архивирования, когда сохраняются все атрибуты оригинальных файлов; +****-R**** - Относительные пути; +****-b**** - Создание резервной копии; +****-u**** - Не перезаписывать более новые файлы; +****-l**** - Копировать символьные ссылки; +****-L**** - Копировать содержимое ссылок; +****-H**** - Копировать жесткие ссылки; +****-p**** - Сохранять права для файлов; +****-g**** - Сохранять группу; +****-t**** - Сохранять время модификации; +****-x**** - Работать только в этой файловой системе; +****-e**** - Использовать другой транспорт, например, ssh; +****-z**** - Сжимать файлы перед передачей; +****--delete**** - Удалять файлы которых нет в источнике; +****--exclude**** - Исключить файлы по шаблону; +****--recursive**** - Перебирать директории рекурсивно; +****--no-recursive**** - Отключить рекурсию; +****--progress**** - Выводить прогресс передачи файла; +****--stat**** - Показать статистику передачи; +****--********max-size**** ****—**** максимальный размер файла для передачи; +****--********bwlimit**** ****—**** ограничение скорости для передачи файлов; +****--version**** - Версия утилиты. + + +```sh +sudo vim /etc/rsyncd.conf` + +pid file = /var/run/rsyncd.pid +lock file = /var/run/rsync.lock` +log file = /var/log/rsync.log` +[share] path = /tmp/share/` +hosts allow = 192.168.56.1` +hosts deny = * list = true` +uid = root gid = root` +read only = false` +``` + +**Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.** + +Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку: + +```sh +sudo systemctl start rsync +sudo systemctl enable rsync + +sudo service cron reload +``` + +**Копирование и синхронизация файлов на локальном компьютере + +`rsync -zvh file /tmp/backups/` + +**Указав опцию** `--progress` **вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:** + +`rsync -zvh --progress file /tmp/backups/` + +**Синхронизация папок на локальной машине** + +`rsync -azvh /home/user/documents /tmp/backups/` + + +**Синхронизация с удаленным сервером** + +`rsync -avz /home/sergiy/tmp/ root@192.168.56.102:/home/` + + +**По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:** + +`rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share` + +Точно также можно синхронизировать файлы с rsync из удаленного сервера: + +`rsync -avz root@192.168.56.102:/home/ /home/sergiy/tmp/` + +Адрес удаленного сервера записывается в таком формате: + +`имя_пользователя@адрес_машины/папка/на/удаленной_машине` + +Синхронизация папок rsync будет выполняться на стандартном порту. + + +### _**Синхронизация файлов по SSH**_ + +Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить. Для использования SSH вам нужно знать пароль пользователя в системе. + +Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так: + +`rsync -avzhe ssh root@192.168.56.102:/root/install.log /tmp/` + +Если вы используете другой порт для ssh, то здесь его можно указать: + +`rsync -avzhe "ssh -p 22" root@192.168.56.102:/root/install.log /tmp/` + +А теперь передадим данные на тот же сервер: + +`rsync -avzhe ssh backup.tar root@192.168.0.101:/backups/` + +**Просмотр прогресса при синхронизации** + +Для просмотра прогресса копирования файла с одной машины на другую используется опция progress: + +`rsync -avzhe ssh --progress /home/user/documents root@192.168.56.102:/root/documents` + +**Синхронизация не всех файлов в rsync** + +Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями. + +Например, скопируем все файлы, начинающиеся на букву R: + +`rsync -avze ssh --include 'R*' --exclude '*'` +`root@192.168.56.102:/root/documents/ /root/documents` + +**Удаление при синхронизации** + +Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция --delete. + +Например: + +`rsync -avz --delete root@192.168.56.102:/documents/ /tmp/documents/` + +Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален. + +**Максимальный размер файлов** + +Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция --max-size. Например, будем синхронизировать только файлы меньше 200 килобайт: + +`rsync -avzhe ssh --max-size='200k' /user/documents/` +`root@192.168.56.102:/root/documents` + +**Удаление исходных файлов** + +Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером: + +`rsync --remove-source-files -zvh backup.tar /tmp/backups/` + +Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups. + +**Режим симуляции rsync** + +Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений: + +`rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/` + + +**Ограничить скорость передачи** + +Вы можете ограничить использование пропускной способности сети с помощью опции ==`--bwlimit`==: + +`rsync --bwlimit=100 -avzhe ssh /user/home/documents/ root@192.168.56.102:/root/documents/` + +Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию ==-W==: + +`rsync -zvhW backup.tar /tmp/backups/backup.tar backup.tar` + +**Автоматическая синхронизация папок rsync** + +Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля. + +Создаем ключ: + +`ssh-keygen -t rsa` + +Загружаем ключ на сервер к с которым собираемся синхронизироваться: + +`ssh-copy-id -i /home/sk/.ssh/id_rsa.pub sk@192.168.1.250` + +Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день: + +`crontab -e` + +`00 05 * * * rsync -azvre ssh /home/user/Downloads/ 192.168.56.102:/share` + +rsync синхронизация каталогов будет выполняться каждый день в пять утра. + +`@hourly rsync -avzhe ssh vlapa@178.20.46.157:/home/vlapa/git/ /home/vlapa/1Tb_r1-a/Backup/_git/` + +rsync синхронизация каталогов будет выполняться каждый час. + +============================== + +**Автоматическая синхронизация файлов с удалённым сервером** +```bash +#!/bin/bash + +# Локальная директория для синхронизации +LOCAL_DIR="/path/to/local/dir" + +# Удалённый сервер и директория +REMOTE_USER="user" +REMOTE_SERVER="server.com" +REMOTE_DIR="/path/to/remote/dir" + +# Синхронизация с удалённым сервером +rsync -avz $LOCAL_DIR $REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR + +# Вывод сообщения о завершении +echo "Синхронизация завершена!" +``` +✔️ **Скрипт синхронизирует файлы из локальной директории на удалённый сервер с помощью** rsync**.** + +======================================= +# Утилита rcync: синхронизация директорий и backup-ы + +15.12.2019 + +Теги: [CLI](https://tokmakov.msk.ru/blog/tags/15) • [Linux](https://tokmakov.msk.ru/blog/tags/1) • [Директория](https://tokmakov.msk.ru/blog/tags/37) • [Команда](https://tokmakov.msk.ru/blog/tags/2) • [Конфигурация](https://tokmakov.msk.ru/blog/tags/11) • [Настройка](https://tokmakov.msk.ru/blog/tags/266) • [Сервер](https://tokmakov.msk.ru/blog/tags/301) • [Файл](https://tokmakov.msk.ru/blog/tags/35) + +Утилита rsync — это программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и директорий с локального компьютера на удаленный и наоборот. Примечательная особенность rsync — возможность передавать файлы с шифрованием, используя ssh в качестве транспорта. + +Синтаксис команды + +$ rsync опции источник приемникКопировать + +## Примеры использования + +Перед тем, как копировать файлы, всегда стоит сделать пробный прогон (ключ `-n`) в режиме с показом подробностей (`-v`): + +`rsync -avn /path/to/src/ user@example.com:/path/to/dstКопировать + +В этом режиме `rsync` покажет список файлов, которые он скопирует. После этого можно запускать настоящее копирование: + +`rsync -av /path/to/src/ user@example.com:/path/to/dstКопировать + +В этой команде ключ `-a` подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты: владелец, группа, дата создания и изменения. Ключ `-v` даст подробный отчет о работе по мере выполнения и по окончании. + +Обратите внимание на слэш в конце первого аргумента — без него файлы источника `/path/to/src/файлы` будут размещены в `/path/to/dst/src/файлы`. А при наличии слэша в конце первого аргумента — файлы будут в `/path/to/dst/файлы`, что скорее всего и нужно. + +По умолчанию `rsync` попытается использовать транспорт ssh. При использовании другого порта для ssh, его нужно указать: + +`rsync -av -e "ssh -p 2222" /path/to/src/ user@example.com:/path/to/dstКопировать + +Точно также можно скопировать файлы из удаленного сервера на локальную машину: + +`rsync -av user@example.com:/remote/machine/path/ /local/machine/pathКопировать + +Обратите внимание, что источник всегда является первым аргументом, а приемник — вторым. + +Для автоматического копирования, например по `cron`, необходимо настроить авторизацию с использованием ключей. + +## Основные опции + +**Опция** `-a` или `--archive` — рекурсивно копирует файлы, включая разыменованные символьные ссылки, с сохранением связанных с файлами сведений об их владельцах, групповых и индивидуальных правах и времени последнего изменения. Использование этого ключа равносильно указанию ключей `--group`, `--links`, `--owner`, `--perms`, `--recursive` и `--times`. + +**Опция** `-b` или `--backup` — переименовывает файлы, которые в противном случае должны быть удалены или перезаписаны, добавляя к их существующим именам знак тильды (~). Эта опция обычно используется вместе с `--backup-dir` — вместо переименования `rsync` перемещает эти файлы в указанный каталог. + +**Опция** `--backup-dir=dir` — используется вместе с `--backup` и перемещает в директорию `dir` те файлы, которые в противном случае должны быть удалены или перезаписаны. После перемещения старой версии файла в каталог `dir` новая версия из источника копируется в приемник. + +Если `dir` указан с использованием относительного пути, то это путь относительно приемника. + +**Опция** `--copy-unsafe-links` — для каждого файла, являющегося символьной ссылкой на файл за пределами той иерархии, которой принадлежит источник, производится копирование файла, на который указывает ссылка, а не символьной ссылки на него. + +**Опция** `--delete` заставляет `rsync` удалять файлы в приемнике, которые отсутствуют в источнике. + +**Опция** `-n` или `--dry-run` — запуск утилиты без записи на диск. С опцией `--verbose` позволяет посмотреть, что будет сделано, если запустить rsync без `--dry-run`. Особенно полезно запускать перед использованием `--delete`. + +**Опция** `-g` или `--group` — сохранение групповых связей копируемых файлов. + +**Опция** `-l` или `--links` — для каждого файла, являющегося символьной ссылкой, копирование символьной ссылки, а не файла, на который указывает ссылка, даже если файл, на который указывает ссылка, не присутствует в источнике. + +**Опция** `--link-dest=dir` — если файл существует в источнике, но его нет в приемнике, rsync ищет в каталоге `dir` файл с точно таким же именем. Если точная копия файла будет найдена, rsync создает из файла в `dir` жесткую ссылку на него в приемнике. Если точная копия не будет найдена, rsync копирует файл в приемник. + +**Опция** `-o` или `--owner` — сохранение данных о владельце копируемых файлов (только для пользователей с root-правами). + +**Опция** `-p` или `--perms` — сохранение данных о правах доступа копируемых файлов. + +**Опция** `-r` или `--recursive` — рекурсивный спуск по каталогу-источнику и копирование всех файлов в иерархии. + +**Опция** `-t` или `--times` — сохранение данных о времени последнего изменения копируемых файлов. + +**Опция** `-u` или `--update` — пропускать файл, если в приемнике оказался файл новее, чем в источнике. + +**Опция** `-v` или `--verbose` — вывод информации о том, что в данный момент делает rsync. + +**Опция** `-z` или `--compress` — сжатие файлов в процессе копирования. + +## Зеркальное копирование + +Утилиту rsync можно использовать для создания зеркальной копии каталога. На удаленной системе должен быть установлен ssh-сервер (к нему можно подключиться с использованием утилиты ssh). Если нужно запускать копирование по расписанию, следует настроить авторизацию с использованием ключей. + +`rsync --archive --update --delete /path/to/mirror/ user@example.com:/path/to/mirrorКопировать + +Опция `--update` заставляет rsync не перезаписывать самые последние версии файлов на удаленной системе более старыми версиями таких же файлов, взятых из локальной системы. Опция `--delete` заставляет rsync удалять на удаленном сервере файлы, отсутствующие на локальной системе. + +## Резервное копирование + +После проведения исходного резервного копирования rsync может эффективно осуществлять дополнительное резервное копирование, экономя место на диске и время копирования. При дополнительном (инкрементном) копировании сохраняются только те файлы, которые претерпели изменения со времени последнего резервного копирования. + +С помощью опции `--link-dest=dir` можно превращать каждое дополняющее резервное копирование в полноценное, путем создания жестких ссылок между дополняющими резервными копиями и неизменившимися файлами, имеющимися в исходной полноценной резервной копии. + +Если `dir` задается как отосительный путь, то он задается относительно файла-приемника. + +`rsync --archive --link-dest=../backup /path/to/src/ user@example.com:/path/to/dstКопировать + +При запуске этой команды rsync проходит сверху вниз по содержимому каталога `/path/to/src`, проверяя каждый найденный файл. Для каждого файла в каталоге `/path/to/src` утилита ищет в каталоге `/path/to/dst` точную копию этого файла. + +- Если она находит точную копию в каталоге `/path/to/dst` — переходит к следующему файлу +- Если она не находит точную копию в каталоге `/path/to/dst` — ищет точную копию в каталоге `backup` + - Если она находит точную копию файла в каталоге `backup`, утилита создает жесткую ссылку из файла в каталоге `backup` на файл в каталоге `/path/to/dst` + - Если она не находит точную копию файла в каталоге `backup`, утилита копирует файл из каталога `/path/to/src` в каталог `/path/to/dst` + +Небольшой bash-скрипт, демонстрирующий создание полноценной и дополняющей резервной копии: + +```bash +#!/bin/bash +rm -rf backup-two-days-ago +mv backup-one-day-ago backup-two-days-ago +mv backup-latest-state backup-one-day-ago +rsync --archive --link-dest=../backup-one-day-ago /some/path/data/ backup-latest-state +``` + +Можно немного доработать этот скрипт, чтобы хранить не три, а тридцать резервных копий: + +```bash +#!/bin/bash + +SOURCE='/home/evgeniy/data' +BACKUP='/home/evgeniy/backup' +COUNT=30 # кол-во бэкапов + +rm -rf ${BACKUP}/backup-${COUNT} +for (( i = COUNT; i > 1; i-- )); do + mv ${BACKUP}/backup-$((i - 1)) ${BACKUP}/backup-${i} +done + +rsync --archive --link-dest=../backup-2 ${SOURCE}/ ${BACKUP}/backup-1 +``` + +========================================== +Шпора по флагам rsync + +![[2025-06-20_22-34-47.png]] + +Rsync - программка, которую можно использовать для синхронизации файлов и каталогов с локального компьютера на удаленный и наоборот. Чем-то напоминает scp. + +`rsync file1 file2 ... user@host:dest + +`rsync -a dir host:dest_dir + +Взаимодействием с сервером возможности утилиты не ограничиваются. Все операции можно выполнять и локально. По умолчанию rsync копирует ресурсы без учета предыдущего содержимого целевого каталога. + +Например, если вы перенесли каталог d, содержащий файлы a и b, на машину, на которой был файл d/c, то после копирования сервер будет содержать d/a, d/b и d/c. + +Чтобы создать точную копию исходного каталога, необходимо из целевого каталога удалить не существующие в исходном каталоге файлы, например d/c в примере: + + +`rsync -a --delete dir host:dest_dir + +Посмотрим на еще 1 пример: + +`rsync -avh --del --progress dir1 dir2 dir3 backup + +В результате выполнения, каталоги "dir1, dir2 и dir3", вместе со всем их содержимым, будут рекурсивно скопированы в каталог backup. + +Если какие-то файлы уже есть в каталоге backup, и не были изменены, они будут пропущены. + +Исключение файлов и каталогов + +Еще одной значительной фичей rsync является способность исключать файлы и каталоги из процесса передачи. + +Например, ты хочешь перенести локальный каталог src на хост и при этом исключить все данные с именем .git. Можно сделать следующим образом: + +`rsync -a --exclude=.git src host: diff --git a/LINUX/SAMBA.md b/LINUX/SAMBA.md new file mode 100644 index 0000000..357b5e4 --- /dev/null +++ b/LINUX/SAMBA.md @@ -0,0 +1,262 @@ +```shell +sudo su +apt install -y samba samba-client +systemctl enable smbd +systemctl start smbd +systemctl status smbd +systemctl stop smbd +systemctl restart smbd + +systemctl disable smbd +systemctl reload smbd + +ufw allow Samba +ufw allow 445 +ufw allow 137 +ufw allow 138 +ufw allow 139 + +#=================================== +smbclient -L 192.168.1.1 +smbclient -L 192.168.1.1 -U username +#=================================== + +### Сброс кэша сетевых подключений Windows: +# (если не дает подключиться) +# cmd + +net use * /delete +ipconfig /flushdns +nbtstat -R + +#=================================== + +sudo cp /etc/samba/smb.conf /etc/samba/res_smb.conf + +# оставим в файле конфигурации только те строки, которые используются в работе и не являются комментарием: +grep -v '^ *#\|^ *$' /etc/samba/smb.conf | sudo tee /etc/samba/smb.conf + +sudo vim /etc/samba/smb.conf + +#============================ +[global] +workgroup = WORKGROUP +security = user +map to guest = bad user +wins support = no +dns proxy = no + +[150Gb] +path = /home/media/150Gb +public = yes +writable = yes +read only = no +guest ok = yes +create mask = 0775 +directory mask = 0775 +force create mode = 0775 +force directory mode = 0775 + +[private] +path = /media/samba/private +public = no +writable = yes +read only = no +guest ok = no +create mask = 0775 +directory mask = 0775 +force create mode = 0775 +force directory mode = 0775 +#============================ + +testparm -s +systemctl restart smbd nmbd + +# Доступ по учетным данным: +# Создаем каталог для новой папки: +mkdir /data/staff + +# Задаем права на созданный каталог: +chmod 775 /data/staff + +sudo adduser samba # add a regular Linux user +sudo smbpasswd -a samba # add Samba user called `samba` +sudo smbpasswd -e samba # enable - may not be needed + +# Создаем пользователя в системе Linux: +useradd staff1 + +# где_ staff1 _— имя пользователя +# Задаем пароль для пользователя: +passwd staff1 + +# Теперь создадим пользователя в samba: +smbpasswd -a staff1 + +# Перезапускаем samba: +systemctl restart smbd nmbd + +# Посмотреть пользователей samba: +sudo pdbedit -L -v +-L - to list users.  +-v - to be verbose. + +# Доступ для пользователей и групп:*** +sudo mkdir /var/acc_gr_and_user +sudo chmod 777 /var/acc_gr_and_user +``` + +```bash +[acc_gr_and_user] +    comment = Private Folder +    path = /var/acc_gr_and_user +    public = no +    writable = no +    read only = yes +    guest ok = no +    valid users = admin, staff2, staff3, @privateusers +    write list = admin, staff2 +    create mask = 0775 +    directory mask = 0775 +    force create mode = 0775 +    force directory mode = 0775 +    inherit owner = yes + + +systemctl restart smbd nmbd +``` + +*стоит обратить внимание на следующие настройки: + +- ***path = /data/private*** — используем новый путь до папки +- ***writable = no*** +- ***read only = yes*** +- в данном примере мы разрешим запись в каталог только некоторым пользователям. Поэтому общие настройки, разрешающие запись в папку, должны быть запрещены +- ***valid users*** - список пользователей, которым разрешено подключаться к каталогу. В данном примере разрешения работают для пользователей +- **_admin_**__,__ **_staff2_** __и__ **_staff3_**, а также для всех, кто входим в группу ***@privateusers*** +- ***write list*** - список пользователей, которые имеют доступ к папке на чтение и запись. В данном примере мы разрешаем это только для пользователей. ***admin*** и ***staff2*** +- ***inherit owner*** - опция позволяем включить наследование владельца при создании папок и файлов + +*если мы хотим, чтобы доступ к каталогу был полный у определенных пользователей (без разделения на тех, кто может только читать и тех, кто может также писать в папку), то опцию +***write list*** можно не указывать, а опции ***writable*** и ***read only*** оставить как в примерах выше + +***Вывести список сетевых ресурсов samba:*** +`smbclient -L localhost -U%` + +***Подключение к ресурсу из Linux***: +```sh +sudo apt install cifs-utils -y +mount.cifs {ресурс} {путь к директории в которую монтируем } {-o опции} +mount.cifs //10.8.0.1/anonimus_share /mnt +``` + +Автоматическое монтирование директории происходит с использованием файла **fstab**. Для начала создадим дополнительный файл с учетными данными пользователя для авторизации. Оправданно будет создать этот файл в директории **root**. + +`sudo nano /root/.smbselus` + +Внесем в файл следующие директивы: + +`username=selectel password=uspass` + +Сохраняем и переходим к конфигурационному файлу **fstab**. + +`sudo nano /etc/fstab` + +Добавляем в него следующий блок инструкций: + +`//10.8.0.1/acc_gr_and_user /mnt cifs user,rw,credentials=/root/.smbselus 0 0` + +Конкретизируем каждый пункт: + +**_//10.8.0.1/acc_gr_and_user_** 一 директория, которую необходимо смонтировать; +**_/mnt_** 一 директория, в которую необходимо смонтировать; +**_cifs user_** 一 разрешает монтировать любому пользователю; +**_rw_** 一 предоставляет права на чтение и запись; +**_credentials=/root/.smbselus_** 一 файл с учетными данными пользователя; +_0_ используется утилитой dump 0 一 выключен; +_0_ используется утилитой fsck 0 一 выключен. + +В некоторых случаях требуется добавить директиву **domain** в файл **.smbselus.** +## Настройка сетевой корзины + +По умолчанию файлы из директории удаляются совсем. При определенных условиях необходимо иметь возможность восстановить эти файлы. В Samba данная возможность реализована с использованием сетевой корзины. Алгоритм работы следующий: настраивается скрытый каталог, в который при удалении перемещаются файлы. + +Первым этапом создадим директорию для корзины и назначим ей права: +```sh +sudo mkdir /var/recycle | sudo chmod 777 /var/recycle + +# Внесем блок директив в конфигурационный файл:  + +sudo vim /etc/samba/smb.conf + +[Recycle] +comment = rec_dir +path = /var/recycle +public = yes +browseable = yes +writable = yes +vfs objects = recycle +recycle:repository = .recycle/%U +recycle:keeptree = Yes +recycle:touch = Yes +recycle:versions = Yes +recycle:maxsize = 0 +recycle:exclude = *.tmp, ~$* +recycle:exclude_dir = /tmp +``` + +Значения директив: + +**_[Recycle]_** 一 имя ресурса, отображаемое клиенту при подключении;                                                                            +**_comment = rec_dir_** 一 комментарий; +**_path = /var/recycle_** 一 директория, в которой размещена сетевая корзина. +**_public = yes_** 一 доступ на чтение всем авторизованным пользователям, также гостевым;  +**_browseable = yes_** 一 параметр устанавливает, будет ли общий ресурс отображаться в списке доступных общих ресурсов в сетевом окружении и в списке просмотра; +**_writable = yes_** 一 право записи в сетевой ресурс; +**_vfs objects = recycle_** 一 использование подсистемы recycle; +**_recycle:repository = .recycle/%U_** 一 место хранения удаленных объектов. В этой директиве настроено попадание удаленных файлов в каталог с именем пользователя, который создается автоматически в директории .**recycle;** +**_recycle:keeptree = Yes_** 一 удаление с сохранением дерева каталогов; +**_recycle:touch = Yes_** 一 изменение даты при перемещении файла в сетевую корзину; +**_recycle:versions = Yes_** 一 добавление номера версии при удалении файлов с одинаковыми именами; +**_recycle:maxsize = 0_** 一 параметр отвечает за максимальный размер файла, который может быть перемещен в корзину. При текущем значении возможно переместить файл любого размера; +**_recycle:exclude = *.tmp, ~$*_**  一 исключение файлов заданного типа; +**_recycle:exclude_dir = /tmp_** 一 исключение директории заданного типа. + +```sh +mkdir /data/recycle +chmod 777 /data/recycle + +# Перезапускаем самбу: + +systemctl restart smbd + +# Пробуем зайти в сетевой каталог Recycle и создать, а после удалить файл. Он должен оказаться к скрытой папке .recycle. + +# Для автоматической чистки сетевой корзины можно создать скрипт: + +mkdir /scripts +vim /scripts/cleanrecycle.sh + +#!/bin/bash + +recyclePath="/data/recycle/.recycle" +maxStoreDays="30" + +/usr/bin/find $recyclePath -name "*" -ctime +$maxStoreDays -exec rm {} \; + +# в данном скрипте мы ищем все файлы в каталоге /data/recycle/.recycle, которые старше 30 дней и удаляем их. + +# Разрешаем запуск скрипта: + +chmod +x /scripts/cleanrecycle.sh + +# Создаем задание в планировщике: + +crontab -e + +0 5 * * * /scripts/cleanrecycle.sh + +# в данном примере мы будем запускать скрипт по очистке сетевой корзины каждый день в 05:00. +``` + + diff --git a/LINUX/SCP, SFTP.md b/LINUX/SCP, SFTP.md new file mode 100644 index 0000000..e133e5f --- /dev/null +++ b/LINUX/SCP, SFTP.md @@ -0,0 +1,70 @@ +Скопируем файл с удаленного хоста в локальный каталог: +$ scp user@host:/path/to/file /local/dir + +Скопируем файлы с локального компьютера на удаленный хост: +$ scp /local/dir/file user@host:/remote/dir + +Скопируем файл с одного удаленного хоста на другой: +$ scp user1@host1:/remote/file user2@host2:/remote/dir + +======================================== +Прога **sftp** не требует постоянно указывать адрес **ssh** сервера. Вместо этого мы подключаемся к нему один раз и используем интерфейс **get** и **put**: + +$ sftp user@host +sftp> get /remote/dir/file /local/dir +sftp> put /local/dir/file /remote/dir + +Для передачи каталогов используем флаг "**-r**":  +$ scp -r /local/dir user@host:/remote/dir +$ sftp> put -r /local/dir /remote/dir + +***Также хочется отметить, что **sftp** имеет важное преимущество перед обычным **ftp** — она не требует, чтобы на удаленном узле работал сервер **FTP**. Ей необходим только **SSH**. + +======================================== +```sh +mkdir bot +scp /полный/путь/к файлу/скрипта/bot.py vlapa@10.10.10.2:~/work_prog + +# Копируем файл на сервер (копирум = что -> куда): + +scp -r source_file_name username@destination_host:destination_folder +# параметр: -r – рекурсивное копирование папок (включая подкаталоги) + +scp /etc/wireguard/wg0.conf vlapa@10.0.0.1:/home/vlapa/wg000.conf +scp vlapa@10.0.0.1:/home/vlapa/wg0.conf log.txt +scp path/myfile user@8.8.8.8:/full/path/to/new/location/ + +# Копируем файл с сервера: + +scp user@8.8.8.8:/full/path/to/file /path/to/put/here +``` + +``` +-r - рекурсивное копирование +-p - сохраняет временные метки и права доступа на файлы +-q - тихий режим. Подавляет все сообщения, кроме ошибок +-C - включает сжатие данных +-P 1345 - указывает порт подключения к удаленному хосту +``` +💻 **Передача файлов с помощью scp** +Когда нам необходимо быстро передать файл на сервер или наоборот, скопировать файл с сервера на локалку, мы можем воспользоваться утилитой — **scp (Secure Copy Protocol)**.  + +SCP — это утилита командной строки в Linux, используемая для безопасной передачи файлов между локальным и удаленным узлами или между двумя удаленными узлами. Она использует протокол SSH (Secure Shell) для передачи данных, обеспечивая безопасное копирование файлов с использованием тех же мер аутентификации и безопасности, что и SSH. + +⚙️ **Примеры использования** +• Копирование файла на удалённый сервер: + +`scp file.txt user@remote_host:/path/to/destination   + +• Скачивание файла с сервера: +`scp user@remote_host:/path/to/file.txt ./   + +• Передача директории: +`scp -r папка user@remote_host:/path/to/destination   +`-r — ключ для копирования директории + + • Указание порта SSH: +Если вдруг используется нестандартный порт, мы можем его передать установив флаг -P: +`scp -P 2222 file.txt user@remote_host:/path/to/destination  + +➡️ Для оптимизации передачи больших файлов, можем добавить флаг -C для сжатия файлов. А также, для проверки удачной передачи, включаем подробный вывод -v. \ No newline at end of file diff --git "a/LINUX/SERVER - \320\274\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263.md" "b/LINUX/SERVER - \320\274\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263.md" new file mode 100644 index 0000000..6875dd6 --- /dev/null +++ "b/LINUX/SERVER - \320\274\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263.md" @@ -0,0 +1,280 @@ +```sh +# Топ процессов по загрузке CPU +ps -eo pid,comm,%cpu --sort=-%cpu | head + +# Запуск интерактивного мониторинга +top +htop  # Более удобный интерфейс (если установлен) + +# Убить процесс с высокой нагрузкой по PID +kill -9 + +# Ограничить нагрузку от процесса (через nice) +nice -n 10 командa + +🟢 ps + sort быстро выявляют топовые процессы +🟢 top и htop позволяют следить в реальном времени +🟢 nice — задаёт приоритет и снижает нагрузку + +#================================================= +# Просмотр истории команд пользователя   +history + +# Узнаем кто зарегистрирован в системе и сколько времени в ней находится: +who + +# список всех пользователей, которые сейчас зарегистрированы в системе: +users + +# Подробная информация о сессиях пользователей   +w + +# когда и сколько времени определенный пользователь находился в системе: +last user_name + +# выдаст информацию о последних пяти входах: +last -n 5 user_name + +# вывод на экран перечня всех пользователей с датами их последнего подключения к системе: +lastlog +# удобно контролировать системные записи. У них дата последнего входа должна быть = Never logged in =, потому что под ними нельзя войти в систему (в качестве командной оболочки установлены /bin/false, /dev/null, /sbin/nologin и др.). Если вы заметили, что кто-либо проник в систему через одну из этих учетных записей, то это значит, что хакер использует ее, изменив настройки. Простая замена командной оболочки в файле /etc/passwd может открыть хакеру потайную дверь, и администратор не заметит этой трансформации. Но после выполнения команды lastlog все неявное становится явным.  + +# Обращайте внимание на тип подключения и адрес. Если что-то вызывает подозрение, то можно выявить атаку на этапе ее созревания. + +# Просмотр логов SSH-подключений   +sudo cat /var/log/auth.log | grep "ssh" + +# определить, какие файлы и какими пользователями открыты в данный момент: +lsof + +# Файлы, открытые определённым пользователем +lsof -u username + +# Определить, кто использует файл +lsof /path/to/file + +# Какие файлы открыты на определённом порту +sudo lsof -i :80 + +# Удалённые, но занятые файлы +lsof | grep deleted + +# узнать, какие процессы используют интернет прямо сейчас? + +lsof -i -P -n + +# Расшифровка: +# - lsof — список открытых файлов (в Linux всё — файл) +# -i — показывает сетевые соединения +# -P — отображает порты в числовом виде (без разрешения имён) +# -n — не резолвит имена хостов (быстрее) + +# Это отличный способ отследить: какие приложения слушают порты, кто подключен к твоему серверу, утечки сетевой активности. Полезно при аудитах, отладке и настройке брандмауэров. + + +# запустить программу на выполнение в фоновом режиме,программа запускается на выполнение, но не блокирует консоль. Да, вы видите вывод на экране, но в любой момент может забрать консоль себе, нажав Enter. Вы можете закрывать консоль, и стартующая программа не прервет свою работу. +start-olap-server.sh & + +# список программ работающих в фоновом режиме +jobs +# Число, которое вы видите в квадратных скобках – это номер выполняемой задачи. В фон можно отправить команду нажатием Ctrl+Z. В этом случае команда уходит в фон, но перестает выполняться. + +# Псевдонимы +alias ll="ls -l" + +# Перенаправление ввода/вывода +ls > outfile.txt +# В результате выполнения этой команды, результат (т.е. содержимое каталога) не будет выведено на экран, а будет сохранено в файл.  + +# Если отобразить содержимое файла:  +cat outfile.txt  +# То вы увидите то, что должно было быть на экране еще после выполнения той команды.  + +# получать параметры из файла. Например, можно выполнить команду: +cat < infile.txt  +# Команде cat в качестве параметров будут передано содержимое infile.txt. + +# Pipe +lastlog | sort + +# Посмотреть общее время загрузки системы +systemd-analyze + +# Показать список сервисов и их время загрузки +systemd-analyze blame + +# Проверить, какие службы запускаются при старте +systemctl list-unit-files --state=enabled + +# Отключить ненужный сервис +sudo systemctl disable имя_сервиса + +# Установить задержку старта для тяжёлого сервиса +sudo systemctl edit имя_сервиса +# В открывшемся файле добавить: +# [Service] +# ExecStartPre=/bin/sleep 30 + +🟢 systemd-analyze показывает время загрузки системы +🟢 systemctl позволяет отключать или откладывать запуск лишних служб +🟢 Оптимизация автозагрузки ускоряет старт системы + +# Регулярная проверка и настройка автозагрузки особенно важна для серверов и рабочих станций с ограниченными ресурсами. + +#================================================== +# информация о процессоре: +less /proc/cpuinfo +lscpu +lshw +nproc +sudo dmidecode -t 4 + + +I #================================================== +# === Изменение имени сервера ===: +hostnamectl set-hostname hostname +# перезагрузка не потребуется — новое имя начнет использоваться сразу ??? +# Если, по каким-либо причинам, новое имя не начнет использоваться, вводим: +systemctl restart systemd-hostnamed +# Подробнее, статус можно посмотреть командой: +hostnamectl status +# Также, можно задать дополнительное для описания имя (прелестное): +hostnamectl set-hostname "Description Name" --pretty + +#================================================== +# === Диски ===: +df -h +du -h +df -i + +lsblk +smartctl -a /dev/sda +smartctl -a /dev/nvme1n1 +cat /proc/mdstat + +iostat +iotop + +#================================================== +# === Процессы / память ===: +top +uptime +htop + +vmstat +free -m +cat /proc/meminfo + +ps aux +kill 123456 +systemctl status nginx +strace -p 1234567 + +#================================================== +# === Сеть ===: +# Быстрое отображение всех прослушиваемых портов +ss -tuln +# Показать процессы, связанные с портами +ss -tulnp +# Сканировать локальный хост с помощью nmap +nmap -sT -p- 127.0.0.1 +# Сканировать удалённый сервер на стандартные порты +nmap example.com +🟢 ss — встроенный инструмент, заменяющий netstat +🟢 nmap — мощный сканер безопасности и сетевых портов +🟢 Позволяет быстро увидеть, какие порты открыты и кем используются. + +ip a +ifconfig +netstat -rn +ip r +ping 8.8.8.8 +traceroute 8.8.8.8 +mtr 8.8.8.8 +dig vlapa.ru +dig @8.8.8.8 vlapa.ru +dig -t mx vlapa.ru +curl -Lv vlapa.ru +curl -v telnet://127.0.0.1:22 +curl --unix-socket /var/run/docker.sock http:/images/json +tcpdump -i any port 9100 -nn + +curl ifconfig.me + +#================================================== +# === Логи ===: + +cd /var/log +ls -lah +tail -f -n50 /var/log/syslog +ls -lah /var/log/auth.log +ls -lah /var/log/kern.log +dmesq -T +journalctl -xeu nginx + +#================================================== +# === Температура ===: +sudo apt install lm-sensors +sudo sensors-detect + +watch -n 1 sensors +watch -d -n 1 sensors + +#================================================== +# === Стресс тест ===: +sudo apt-get install stress-ng +# CPU: +stress-ng --cpu 32 --sequential 8 --timeout 60s --metrics-brief +#  Memory: +stress-ng --class memory --sequential 8 --timeout 60s --metrics-brief +# Disk IO: +stress-ng --class io --sequential 8 --timeout 60s --metrics-brief +# File System: +stress-ng --class filesystem --sequential 8 --timeout 60s --metrics-brief +# All: +# Если необходимо провести комплексное стресс-тестирование, можно задействовать работу нескольких основных подсистем вместе одной командой: + +stress-ng --cpu 4 --io 4 --vm 1 --vm-bytes 1G --timeout 60s --metrics-brief + +# Эта команда запустит тест для CPU в 4 потока, тест виртуальной памяти с размещением в ней одного гигабайта данных, а также 4 потока для тестирования операций ввода/вывода. + +# Что бы запустить тестирование всего «железа», используется команда: +stress-ng --sequential 0 --timeout 60s --metrics-brief + +# Эта команда запустит все тесты. После выполнения результат будет выведен в консоль. Во время выполнения команды сервер не нагружать другой работой. + +#================================================== +# Автоматическое уведомление при высокой загрузке CPU + +# Этот скрипт следит за загрузкой процессора и отправляет уведомление, если нагрузка превышает критическое значение. Полезен для серверов и рабочих станций, чтобы избежать перегрева и зависаний. + +#!/bin/bash +# Пороговое значение загрузки CPU в процентах +THRESHOLD=80 +# Лог-файл +LOG_FILE="$HOME/cpu_usage.log" +# Получаем среднюю загрузку CPU +CPU_LOAD=$(awk '{print $1}' < /proc/loadavg | awk '{print $1*100}') +if (( ${CPU_LOAD%.*} >= THRESHOLD )); then +    MESSAGE="⚠️ Высокая загрузка CPU: $CPU_LOAD%" +    echo "$MESSAGE" | tee -a "$LOG_FILE" +    notify-send "CPU Alert" "$MESSAGE" +fi + +# Проверяет загрузку процессора по /proc/loadavg. +# Если нагрузка превышает установленный порог, отправляет уведомление через notify-send. +# Записывает события в лог-файл для анализа. + +# Автоматический мониторинг: +# Добавьте скрипт в crontab для проверки каждые 5 минут + +*/5 * * * * /path/to/script.sh + +# Этот скрипт поможет отслеживать пиковые нагрузки и предотвратить зависания системы. + +#================================================== + + + +``` + diff --git "a/LINUX/SHELL \320\272\320\276\320\274\320\260\320\275\320\264\321\213.md" "b/LINUX/SHELL \320\272\320\276\320\274\320\260\320\275\320\264\321\213.md" new file mode 100644 index 0000000..b348b41 --- /dev/null +++ "b/LINUX/SHELL \320\272\320\276\320\274\320\260\320\275\320\264\321\213.md" @@ -0,0 +1,63 @@ +```sh +pwd +ls ; ls . ; ls -1 ; ls -la +cd ; cd .. ; cd ~ ; cd - + +mkdir name_dir ; mkdir -p /name1/name2 +touch test.txt ; > test.txt +echo "test" > test.txt + +cp test.txt test1.txt +cp -r dir1 dir2 +mv test.txt test2.txt +mv test2.txt dir + +rm test.txt +rm /путь/к/файлам/*.txt +rm -r dir_name +rm -i /путь/к/файлам/*.txt +rm -f /путь/к/файлам/*.txt + +ln file1 file2 + +chmod xxxx dir +chmod -R xxxx dir + +cat test.txt +cat test.txt | head -2 +cat test.txt | tail -1 + +grep 'string' test.txt + +find ./ -name 'test' +find ~/ -name 'test*' +find ~/ -name '*.php*' + +tar -cf arhive_name.tar dir_name +tar -xvf arhive.tar + +history +clear +exit + +Ctrl-C +Ctrl-D +Ctrl-U +Ctrl-Z +Ctrl-W +!! +Ctrl-Shift_c +Ctrl-Shift-V + +fg ; bg + +==================================== +sodu mkdir demo +^sodu^sudo + +# Это заменит «sodu» на «sudo» и повторно выполнит команду. + +# Это особенно полезно, если вы допустили ошибку в длинной команде, так как избавляет вас от необходимости повторно вводить команду. + +``` + diff --git a/LINUX/SHUTDOWN, HALT, POWEROFF, REBOOT.md b/LINUX/SHUTDOWN, HALT, POWEROFF, REBOOT.md new file mode 100644 index 0000000..57192ec --- /dev/null +++ b/LINUX/SHUTDOWN, HALT, POWEROFF, REBOOT.md @@ -0,0 +1,56 @@ +========= +**shutdown +```sh +shutdown # Schedule a shutdown +shutdown now # Shutdown immediately +shutdown 13:20 # Shutdown at 1:20 PM +shutdown -p now # Power off the machine +shutdown -H now # Halt the machine +shutdown -r 09:35 # Reboot at 9:35 AM + +shutdown -c # отменить +``` +- `-r`: Перезагрузка после выключения. +- `-h`: Остановка или выключение питания (решает система). +- `-H`: Остановите систему. +- `-P`: Выключите систему. +- `-c`: Отменить запущенное завершение работы. +- `-k`: Только отправлять предупреждающие сообщения (без выключения). + +**Примечание по исправлению** : распространенной ошибкой является использование `shutdown -p`, что недопустимо. Правильный вариант выключения — `shutdown -P` + +========= +**halt +```sh +halt # Остановить машину +halt -p # Выключить машину +halt --reboot # Перезагрузить машину +``` + +========= +**poweroff +```sh +poweroff # Выключить машину +poweroff --halt # Остановить машину +poweroff --reboot # Перезагрузить машину +``` + +========= +**reboot +```sh +reboot # Перезагрузить машину +reboot --halt # Остановить машину +reboot -p # Выключить машину +``` + +========= +**systemctl +```sh +sudo systemctl poweroff # Выключить систему +sudo systemctl reboot # Перезагрузить систему +sudo systemctl halt # Остановить систему +``` + +Эти альтернативы работают надежно и считаются лучшими в системах на базе systemd. + + diff --git a/LINUX/SSH.md b/LINUX/SSH.md new file mode 100644 index 0000000..a169457 --- /dev/null +++ b/LINUX/SSH.md @@ -0,0 +1,302 @@ +#### SSH alias !!! #### +```sh +ssh-keygen --help # -h + +vim ~/.ssh/config + +UseRoaming no + +Host +Hostname 178.20.46.157 # или vlapa.ru +User vlapa +Port 22 + +##########################: +# заходим на сервер +ssh newHostName +``` +#### Проброс портов SSH: #### +```sh +ssh -L 9000:localhost:8000 server2 + +ssh -L [локальный_адрес:]порт:удалённый_адрес:порт [user@]hostname + +# Если не указывать [локальный_адрес:], соединение по умолчанию будет привязано к интерфейсу localhost. +``` + +#### SSH #### +```sh +ssh-keygen -t rsa +cat ~/.ssh/id_rsa.pub + +ssh-keygen -t ed25519 +ssh-keygen -t ed25519 -f ~/.ssh/key2 -C "new key" + +# -сменить пароль на ключ +ssh-keygen -p + +# -открытый ключ. копируют на сервера +~/.ssh/id_rsa.pub + +# -закрытый ключ (у нас) +~/.ssh/id_rsa + + +~/.ssh/authorized_keys +chown -R vlapa:vlapa /home/vlapa/.ssh +# Права обязательно !!! +chmod 700 ~/.ssh +chmod 644 ~/.ssh/* + +chmod 600 authorized_keys + +ssh -i ~/.ssh/key2 vlapa@192.168.88.2 + +cd /etc/ssh +ll + +vim /etc/sshd_config + + Port 22 + PermitRootLogin no + PubkeyAuthentication yes + PasswordAuthentication no + +systemctl restart sshd +systemctl status sshd + +ssh -i ~/.ssh/key2 vlapa@192.168.88.2 + +vim .ssh/config + +Host \*.com + StrictHostKeyChecking no + User etoosamoe + ForwardAgent yes + IdentityFile /Users/username/.ssh/id_rsa + IdentitiesOnly yes + UserKnownHostsFile=/dev/null + UseKeychain yes + AddKeysToAgent yes + ServerAliveInterval 60 + ServerAliveCountMax 1200 +Host std-\* + StrictHostKeyChecking no + User ci-user + ForwardAgent yes + IdentityFile /Users/username/.ssh/id_rsa_second + IdentitiesOnly yes + UserKnownHostsFile=/dev/null + UseKeychain yes + AddKeysToAgent yes + ServerAliveInterval 60 + ServerAliveCountMax 1200 +``` + +```sh +# В каталоге пользователя, под которым вы хотите зайти, если создать файл и положить туда открытый ключ, то можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям (и группам !!!), иначе ssh его не примет. В ключе последнее поле — user@machine Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть поменяно (или даже удалено) без нарушения структуры ключа. + +ssh-copy-id user@server +# позволяет скопировать ключ не редактируя файлы вручную. + +# Если у вас ssh на нестандартном порту, то ssh-copy-id требует особого ухищрения при работе: + +ssh-copy-id '-p 443 user@server' # внимание на кавычки ! + +# Первый раз, когда вы заходите на сервер, ssh вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts Узнать, где какой ключ нельзя (ибо несекьюрно). + +# Удалить известный ключ сервера можно командой: +ssh-keygen -R server + +# При этом нужно удалить ещё и ключ IP (они хранятся раздельно): +ssh-keygen -R 127.0.0.1 + +# Ключ сервера хранится в +/etc/ssh/ssh_host_rsa_key + +/etc/ssh/ssh_host_rsa_key.pub + +# Их можно: +# а) скопировать со старого сервера на новый. +# б) сгенерировать с помощью ssh-keygen Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет. + +# Заметим, если вы сервера клонируете (например, в виртуалках), то ssh-ключи сервера нужно обязательно перегенерировать. + +# Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key + +sudo ssh service restart +sudo sshd service restart + +# Чтобы удаленно выполнить команду с локального компьютера, добавьте инструкцию к команде SSH. Например, чтобы удалить файл, введите: + +ssh test.server.com rm ~/Desktop/Dir1/sample4 + +# Введите пароль, и файл на удаленном сервере будет удален без создания новой оболочки. + +sudo systemctl restart ssh + +vim /etc/ssh/sshd_config + +- PasswordAuthentication no +- PermitRootLogin no +- AllowUsers www root + + +sudo service ssh restart + + +# Ключ игнорируется сервером + +# В редких случаях можно столкнуться с проблемой, что вы настроили все корректно, но не можете подключиться к серверу с использованием SSH-ключей. Видя следующий вывод, можно подумать, что сервер не видит ключ: + +Permission denied (publickey). + +# Вероятнее всего, сервер SSH считает, что установлены неподходящие разрешения к некоторым каталогам. Для решения этой проблемы следует изменить права доступа.  + +# Настройка удаленного узла + +# Полный доступ к папке .ssh только владельцу, остальным — полный запрет: + +chmod rwx------ ~/.ssh + +# Права на запись и чтение для файла authorized_keys только владельцу, остальным — полный запрет:  + +chmod rw------- ~/.ssh/authorized_keys + +# Отмена записи группой и остальными пользователями: + +chmod go-w ~/ + +# Настройка локальной машины + +# Полный доступ к папке .ssh только владельцу, остальным — полный запрет: + +chmod rwx------ ~/.ssh + +# Права на запись и чтение для файла ключа только владельцу, остальным — полный запрет: + +chmod rw------- ~/.ssh/*key* ( 600) + +# После применения этих политик ошибка должна исчезнуть. +``` + +=========================================== +### Как общаться с удаленным сервером через SSH + +`ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca + +Файл `host_ca` является закрытым ключом центра сертификации хоста и должен храниться в защищенном месте. Не выдавайте его никому, не копируйте куда-либо и убедитесь, что как можно меньше людей имеют к нему доступ. В идеале он «живет» на машине, которая не допускает прямого доступа, и все сертификаты выдаются автоматически. + +Рекомендуется использовать два отдельных CA – один для подписания сертификатов хостов, другой для пользователей. Одни и те же процессы не будут добавлять и хосты, и юзеров. А если закрытый ключ скомпрометируют, нужно будет лишь пересоздать сертификаты для хостов или пользователей, а не оба сразу. + +Вот так создается `user_ca`: + +`$ ssh-keygen -t rsa -b 4096 -f user_ca -C user_ca` + +Файл `user_ca` – закрытый ключ пользователя, который должен быть защищен, как и закрытый ключ хоста. + +### Выдача сертификатов хостам + +Создадим новый ключ и подпишем с помощью центра сертификации. + +ssh_host_rsa_key-cert.pub содержит подписанный сертификат хоста. + +```sh +$ ssh-keygen -f ssh_host_rsa_key -N '' -b 4096 -t rsa + +$ ls -l +-rw------- 1 palpatine palpatine 3247 Mar 17 14:49 ssh_host_rsa_key +-rw-r--r-- 1 palpatine palpatine 764 Mar 17 14:49 ssh_host_rsa_key.pub + +$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub +Enter passphrase: # the passphrase used for the host CA +Signed host key ssh_host_rsa_key-cert.pub: id "host.example.com" serial 0 for host.example.com valid from 2020-03-16T15:00:00 to 2021-03-15T15:01:37 + +$ ls -l +-rw------- 1 palpatine palpatine 3247 Mar 17 14:49 ssh_host_rsa_key +-rw-r--r-- 1 palpatine palpatine 2369 Mar 17 14:50 ssh_host_rsa_key-cert.pub +-rw-r--r-- 1 palpatine palpatine 764 Mar 17 14:49 ssh_host_rsa_key.pub +``` + +Вот описание используемых флагов: + +- **-s host_ca**: указывает имя файла закрытого CA-ключа, используемого для подписи. +- **-I host.example.com**: буквенно-цифровая строка, идентифицирующая сервер. При необходимости значение можно использовать для отзыва сертификата. + +- **-h**: указывает, что сертификат выдается хосту, а не юзеру. + +- **-n host.example.com**: указывает разделенный запятыми список участников, для проверки подлинности которых будет действителен сертификат. + +- **-V +52w**: срок действия сертификата. В данном случае 52 недели (один год). По умолчанию сертификаты действительны вечно. Указание периода истечения срока действия сертификатов хоста настоятельно рекомендуется для ротации и замены сертификатов. + +## Настройка SSH для использования сертификатов + +Нужно указать серверу, чтобы он использовал новый сертификат. Скопируйте три сгенерированных файла на сервер в каталог `/etc/ssh`, установите разрешения и добавьте в файл `/etc/ssh/sshd_config` следующую строку: + + `HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub` + + +Перезагрузите **sshd** с помощью `systemctl restart sshd`. Теперь сервер настроен на выдачу сертификата. Чтобы локальный ssh-клиент мог автоматически доверять хосту на основе удостоверения сертификата, нужно добавить открытый ключ CA в `known_hosts`. Вы можете сделать это, добавив в начало файла `host_ca.pub` следующее: `@cert-authority *.example.com`, а затем и в `~/.ssh/known_hosts`: + + `@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDwiOso0Q4W+KKQ4OrZZ1o1X7g3yWcmAJtySILZSwo1GXBKgurV4jmmBN5RsHetl98QiJq64e8oKX1vGR251afalWu0w/iW9jL0isZrPrmDg/p6Cb6yKnreFEaDFocDhoiIcbUiImIWcp9PJXFOK1Lu8afdeKWJA2f6cC4lnAEq4sA/Phg4xfKMQZUFG5sQ/Gj1StjIXi2RYCQBHFDzzNm0Q5uB4hUsAYNqbnaiTI/pRtuknsgl97xK9P+rQiNfBfPQhsGeyJzT6Tup/KKlxarjkMOlFX2MUMaAj/cDrBSzvSrfOwzkqyzYGHzQhST/lWQZr4OddRszGPO4W5bRQzddUG8iC7M6U4llUxrb/H5QOkVyvnx4Dw76MA97tiZItSGzRPblU4S6HMmCVpZTwva4LLmMEEIk1lW5HcbB6AWAc0dFE0KBuusgJp9MlFkt7mZkSqnim8wdQApal+E3p13d0QZSH3b6eB3cbBcbpNmYqnmBFrNSKkEpQ8OwBnFvjjdYB7AXqQqrcqHUqfwkX8B27chDn2dwyWb3AdPMg1+j3wtVrwVqO9caeeQ1310CNHIFhIRTqnp2ECFGCCy+EDSFNZM+JStQoNO5rMOvZmecbp35XH/UJ5IHOkh9wE5TBYIeFRUYoc2jHNAuP2FM4LbEagGtP8L5gSCTXNRM1EX2gQ== host_ca` + + +Значение `*.example.com` указывает на то, что этому сертификату следует доверять для идентификации любого хоста, к которому вы подключаетесь и который имеет домен `*.example.com`. Это разделенный запятыми список имен хостов для сертификата: **host1**, **host2**, **host3** или **1.2.3.4**, **1.2.3.5** в зависимости от обстоятельств. + +Как только закончите настройку, удалите все старые записи для `host.example.com` в `~/.ssh/known_hosts` и запустите подключение. Правильность создания сертификата проверяется так: + + `$ ssh -vv host.example.com 2>&1 | grep "Server host certificate" debug1: Server host certificate: ssh-rsa-cert-v01@openssh.com SHA256:dWi6L8k3Jvf7NAtyzd9LmFuEkygWR69tZC1NaZJ3iF4, serial 0 ID "host.example.com" CA ssh-rsa SHA256:8gVhYAAW9r2BWBwh7uXsx2yHSCjY5OPo/X3erqQi6jg valid from 2020-03-17T11:49:00 to 2021-03-16T11:50:21 debug2: Server host certificate hostname: host.example.com` + + +На этом этапе вы можете продолжить выдачу сертификатов всех хостов, используя центр сертификации. Польза от этого следующая: вам больше не нужно полагаться на небезопасную модель **Trust On First Use (TOFU)** для новых хостов, и если вы когда-нибудь повторно развернете сервер и, следовательно, измените ключ хоста, новый хост автоматически представит подписанный сертификат без ужасного предупреждения: **WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!** + +## Выдача сертификатов пользователям (для аутентификации пользователей на хостах) + +В этом примере мы создадим новый ключ пользователя и подпишем с помощью центра сертификации. + + `$ ssh-keygen -f user-key -b 4096 -t rsa $ ls -l -rw-r--r--. 1 tatooine tatooine 737 Mar 19 16:33 user-key.pub -rw-------. 1 tatooine tatooine 3369 Mar 19 16:33 user-key $ ssh-keygen -s user_ca -I gus@gravitational.com -n ec2-user,gus -V +1d user-key.pub Enter passphrase: # the passphrase used for the user CA Signed user key user-key-cert.pub: id "gus@gravitational.com" serial 0 for ec2-user,gus valid from 2020-03-19T16:33:00 to 2020-03-20T16:34:54 $ ls -l -rw-------. 1 tatooine tatooine 3369 Mar 19 16:33 user-key -rw-r--r--. 1 tatooine tatooine 2534 Mar 19 16:34 user-key-cert.pub -rw-r--r--. 1 tatooine tatooine 737 Mar 19 16:33 user-key.pub` + + +`user-key-cert.pub` содержит подписанный сертификат пользователя. Для входа в систему понадобится как этот, так и приватный ключ. Вот описание используемых флагов: + +- **-s user_ca**: указывает приватный ключ CA, используемый для подписи. +- **-I tatooine@proglib.io**: буквенно-цифровая строка, которая будет видна в логе SSH. Для точной идентификации пользователя рекомендуем использовать адрес электронной почты или логин. + +- **-n palpatine, tatooine**: указывает разделенный запятыми список участников, для проверки подлинности которых будет действителен сертификат. В примере мы предоставляем сертификат доступа как для `palpatine`, так и для `tatooine`. + +- **-V +1d**: указывает срок действия сертификата, в данном случае +1d означает 1 день. + +Если нужно увидеть параметры подписи сертификата, используйте`ssh-keygen -L`: + + `$ ssh-keygen -L -f user-key-cert.pub user-key-cert.pub: Type: ssh-rsa-cert-v01@openssh.com user certificate Public key: RSA-CERT SHA256:egWNu5cUZaqwm76zoyTtktac2jxKktj30Oi/ydrOqZ8 Signing CA: RSA SHA256:tltbnMalWg+skhm+VlGLd2xHiVPozyuOPl34WypdEO0 (using ssh-rsa) Key ID: "palpatine@proglib.io" Serial: 0 Valid: from 2020-03-19T16:33:00 to 2020-03-20T16:34:54 Principals: tatooine palpatine Critical Options: (none) Extensions: permit-X11-forwarding permit-agent-forwarding permit-port-forwarding permit-pty permit-user-rc` + + +## Настройка SSH для проверки подлинности + +После того как сертификат подписан, нужно сообщить серверу, что можно доверять пользователским сертификатам. Копируем `user_ca.pub` в директорию `/etc/ssh`, поправляем права и добавляем в конфиг `/etc/ssh/sshd_config` строку: + + `TrustedUserCAKeys /etc/ssh/user_ca.pub` + + +Как раньше, перезагружаем **sshd** с помощью `systemctl restart sshd`. Теперь сервер настроен на пропуск всех, кто представляет сертификат, выданный центром сертификации при подключении. Если сертификат хранится в том же каталоге, что и ваш приватый ключ (указанный с флагом `-i`, например `ssh -i /home/tatooine/user-key` `palpatine @proglib.io`), он будет автоматически использоваться при подключении к серверам. + +## Проcмотр логов + +Если вы посмотрите в журнал sshd сервера, запустив `journalctl -u sshd`, то увидите имя используемого для аутентификации сертификата, а также данные центра сертификации: + + `sshd[14543]: Accepted publickey for tatooine from 1.2.3.4 port 53734 ssh2: RSA-CERT ID palpatine@proglib.io (serial 0) CA RSA SHA256:tltbnMalWg+skhm+VlGLd2xHiVPozyuOPl34WypdEO0` + + +Если пользователь попытается войти в систему под логином, у которого нет доступа, в логе вы увидите такую ошибку: + + `sshd[14612]: error: key_cert_check_authority: invalid certificate sshd[14612]: error: Certificate invalid: name is not a listed principal` + + +Если срок действия сертификата истек, вы увидите следующую ошибку: + + `sshd[14240]: error: key_cert_check_authority: invalid certificate sshd[14240]: error: Certificate invalid: expired` + + +В качестве домашнего задания напишите скрипт, который будет использовать центр сертификации для выдачи сертификатов, действительных в течение следующих двух часов. Каждое использование этого скрипта должно журналировать того, кто запросил сертификат и его почту, а потом встраивать этот email в сертификат. Это поможет в мониторинге. + +Взгляните на `man ssh-keygen` для новых идей. \ No newline at end of file diff --git a/LINUX/SYSTEMCTL.md b/LINUX/SYSTEMCTL.md new file mode 100644 index 0000000..e550eed --- /dev/null +++ b/LINUX/SYSTEMCTL.md @@ -0,0 +1,405 @@ +Почему стоит перейти на ==`systemd`== вместо скриптов: +- Более надёжная демонизация. +- Автоматический перезапуск при падении. +- Логи сохраняются через journalctl. +- Возможность ограничения ресурсов (CPU, память). +- Красивое управление (`start`, stop, restart, `status`). + +#### ▪️ Правильный systemd-юнит для сервиса: +vim /etc/systemd/system/myapp.service: +```sh +[Unit] +Description=MyApp Server +After=network.target + +[Service] +Type=simple +ExecStart=/opt/myapp/server +Restart=always +RestartSec=5 +WorkingDirectory=/opt/myapp/ +StandardOutput=append:/var/log/myapp/server.log # Каталог и файл должны существовать!!! +StandardError=append:/var/log/myapp/server_error.log # Каталог и файл должны существовать!!! +User=appuser +Group=appuser +Environment=ENV=production + +[Install] +WantedBy=multi-user.target +``` +▪️ Что важно здесь: +- Restart=always — перезапуск при сбоях. +- StandardOutput и StandardError перенаправляют логи прямо в файлы. +- User и Group указывают, под кем должен работать процесс. +- WorkingDirectory задаёт рабочую папку для приложения. + +▪️ Как активировать сервис: +```sh +sudo systemctl daemon-reload +sudo systemctl enable myapp +sudo systemctl start myapp +sudo systemctl status myapp +``` +▪️ Теперь управление сервисом становится надёжным и простым. +▪️ Дополнительные вопросы на собеседовании: +▪️ Вывод: +Переход от скриптов к systemd — это шаг к профессиональной эксплуатации Linux-приложений.   +Меньше ручных ошибок, лучшее управление процессами, больше надёжности. +```sh +# Проверить, включен ли автозапуск сервиса +systemctl is-enabled your_service.service + +# Посмотреть статус сервиса (включая последние ошибки) +systemctl status your_service.service + +# Включить автозапуск +sudo systemctl enable your_service.service + +# Логи сервиса с момента последнего запуска +journalctl -u your_service.service -b + +# Показать ошибки systemd на загрузке +systemd-analyze blame +``` +🟢 systemctl — управление сервисами и проверка их состояния +🟢 journalctl — просмотр логов systemd +🟢 systemd-analyze помогает понять, что тормозит загрузку системы. + +#======================== +_bot.service_ +```sh +# Создаем НОВУЮ службу или редактируем первоисточник: +sudo systemctl edit --force --full bot + +# или редактируем уже имеющуюся (открывается пустой файл +# для добавления или исправления): +sudo systemctl edit bot + +# Все сервисы находятся в: +cd /etc/systemd/system/ +#============================ +``` + +```shell +[Unit] +Description=bot +After=network.target # только после запуска сети +# After=multi-user.target + +[Service] +Type=simple +ExecStart=python3 /home/vlapa/folder/bot.py +WorkingDirectory=/home/vlapa +Restart=always # on-failure +#---------------------------- +User=root +Group=root +#---------------------------- + +[Install] +WantedBy=multi-user.target # default.target +``` + +```sh +# перезагрузка всех служб: +sudo systemctl daemon-reload + +# включить в автозагрузку: +sudo systemctl enable bot.service + +# перезапуск с перечитыванием конфигов +systemctl restart bot.service + +# перезапуск без перечитывания конфигов +systemctl reload bot.service + +# включить в автозагрузку +systemctl enable bot.service + +# выключить из автозагрузки +systemctl disable bot.service + +# проверка включена или нет в автозагрузку +systemctl is-enabled ssh + +# Все модули: +systemctl list-units --all +systemctl list-unit-files --type=service "ssh*" + +# Оптимизация загрузки: +systemd-analyze blame + +``` + +```sh +# Создание исполняемого скрипта: +#!/usr/bin/env python3 +chmod +x my_script.py + +# Запуск скрипта: +./my_script.py +``` + +=============================== +Все модули можно найти в трёх каталогах: + +`/usr/lib/systemd/system` +— юниты сервисов, установленных с помощью менеджера пакетов. Самый простой пример — веб-серверы: Apache или Nginx. +`/run/systemd/system` +— юниты, которые создаются в процессе работы системы. +`/etc/systemd/system` +— юниты, которые создаёт администратор системы. + +Список всех запущенных модулей можно посмотреть, использовуя команду `systemctl`. В терминале вы увидите таблицу со статусом каждой службы. Разберём, что означает каждый из столбцов: + +1. **UNIT**. Название модуля +2. **LOAD**. Статус загрузки конфигурации, если успешно — loaded. +3. **ACTIVE**. Статус службы. Один из следующих: _active, inactive, running, exited, dead, loaded, not-found, plugged, mounted, waiting, listening._ +4. **SUB**. Детальная информация о юните. +5. **DESCRIPTION**. Краткое описание модуля — за что он отвечает. + +Чтобы увидеть все модули, независимо от того, запущены они или нет, воспользуйтесь командой `systemctl list-units --all`. Вы увидите все модули, которые когда-либо загружал или пытался загрузить диспетчер systemd. Для отображения конкретных записей используйте флаг `--state`. Так, например, для того, чтобы увидеть все неактивные юниты, нужно использовать: + +`sudo systemctl list-units --all --state=inactive` `` + +### Типы юнитов + +Модули делятся на категории по типу. Тип каждого модуля можно узнать из названия файла — он указан через точку. Все типы модулей: + +1. .service — описывает, как управлять службой и приложением +2. .socket — описывает сетевой буфер, который используется для активации сокета +3. .device — описывает устройство как необходимое для управления systemd +4. .mount — определяет точку монтирования в системе +5. .automount — настраивает автоматическую установку точки монтирования +6. .swap — описывает пространство подкачки в системе +7. .target — обеспечивает синхронизацию устройств при загрузке системы +8. .path — определяет путь, который используется для активации +9. .timer — определяет задержку или активацию по плану +10. .snapshot — делает снимок системы для последующего восстановления +11. .slice — ограничивает узлы группы управления +12. .scope — systemd создаёт эти модули автоматически, пользуясь информацией из интерфейса шины + +```sh +[Unit] +Description=OpenSSH server daemon +Documentation=man:sshd(8) man:sshd_config(5) +After=network.target sshd-keygen.target +Wants=sshd-keygen.target + +[Service] +Type=notify Environment +File=-/etc/crypto-policies/back-ends/opensshserver.config EnvironmentFile=-/etc/sysconfig/sshd +ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY +ExecReload=/bin/kill -HUP $MAINPID +KillMode=process +Restart=on-failure +RestartSec=42s + +[Install] +WantedBy=multi-user.target +``` + +**Unit** + +Это первая обязательная секция. В ней описаны правила взаимодействия с другими службами и указаны метаданные — описание и документация. Подробнее: + +- Description — описание модуля. +- Documentation — страница руководства man. +- After — после каких демонов и событий нужно запускать модуль. Например, модули веб-серверов запускаются только после сетевых интерфейсов. +- Requires — сервисы, необходимые для работы юнита +- Wants — сервисы, которые желательно запустить перед стартом модуля + +**Service** + +В этой секции необходимо указать, какими командами запускать службу: + +- Type — как запускается демон? По умолчанию — simple, то есть служба просто запускается. Notify это примерно то же самое, но в таком случае процесс сообщит диспетчеру, что он готов к работе. Есть также типы forking (после запуска демона родительский процесс завершается) и one-shot (выполняется один раз). +- PIDFile — ссылка на основной процесс +- WorkingDirectory — текущая рабочая директория для запуска команд +- User — пользователь для запуска сервиса +- Group — группа для запуска сервиса +- ExecStart — команда для запуска сервиса +- ExecStop — команда для остановки сервиса +- TimeoutSec — время, которое служба ожидает остановки или старта +- Restart — настройки перезапуска + +**Install** + +В этой секции нужно указать, на каком уровне загрузки системы нужно запускать сервис. Переменная WantedBy сообщает, как включится устройство, в качестве параметра указываются специальные файлы целей. Они служат для того, чтобы привести систему в разные состояния.  + +Список доступных целей вы можете получить, выполнив команду  + +`sudo systemctl list-unit-files --type=target` + + +### Редактирование модулей + +Модули нельзя править напрямую. Для этого нужно использовать команду  + +`systemctl edit` + +Откроется файл, который можно использовать для переопределения директив службы или добавления новых. При этом настройки из файла переопределения приоритетнее, чем настройки по умолчанию.  + +Если нужно отредактировать файл модуля целиком, а не добавлять новые директивы, нужно использовать флаг `--full`: + +`sudo systemctl edit --full apache2.service` `` + +Перед вами откроется редактор, в котором вы можете править настройки юнита.  + +По умолчанию файлы переопределения хранятся в  + +`/etc/systemd/system/` + +в каталоге который называется так же, как модуль, но с суффиксом `.d`. Например, в случае apache2 это будет директория  + +`/etc/systemd/system/apache2.service.d/`.  + +Если вы редактируете конфигурацию напрямую с использованием флага `--full`, нужный файл находится в каталоге  + +`/etc/systemd/system/` + +и называется так же, как модуль. + +Для того, чтобы удалить переопределения, которые вы добавили, просто удалите каталог с суффиксом `.d`. Если нужно восстановить настройки по умолчанию, удалите весь файл модуля. В случае с apache2 это: + +`sudo rm -r /etc/systemd/system/apache2.service.d` `` +или  +`sudo rm /etc/systemd/system/apache2.service` `` + +После этого нужно перезагрузить процесс systemd: + +`sudo systemctl daemon-reload` ` + +=============================== + +## Создание сервиса + +В подсистеме systemd также можно легко создать собственную службу и использовать ее для автозапуска приложений или собственных скриптов. Для этого в каталоге **/usr/lib/systemd/system** создаем юнит (файл) с расширением **.service**. + +Пример простой и частоиспользуемой конфигурации: + +[Unit] +Description=Service Name +After=network.target + +[Service] +User=root +Group=root +Type=simple + +ExecStart=/usr/bin/myapp +ExecReload=/bin/kill -HUP $MAINPID +Restart=on-failure + +[Install] +WantedBy=multi-user.target + +* как правило, файл разделен на 3 части: + +- **Unit** — позволяет определить метаданные для юнита. +- **Service** — раздел для основной конфигурации юнита. +- **Install** — определение поведения для юнита при его включении или отключении. + +Подробнее можно почитать о структуре и возможных опциях на странице [https://linux-notes.org/pishem-systemd-unit-fajl/](https://linux-notes.org/pishem-systemd-unit-fajl/) + +Более сложный вариант разберем на примере сервиса bind: + +vi /usr/lib/systemd/system/named.service + +Содержимое может быть следующего содержания: + +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Wants=named-setup-rndc.service +Before=nss-lookup.target +After=network.target +After=named-setup-rndc.service + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/run/named/named.pid +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS +ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID' +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' +PrivateTmp=true + +[Install] +WantedBy=multi-user.target + +После внесения изменений и сохранения файла, необходимо перечитать изменения командой: + +systemctl daemon-reload + +Теперь можно разрешить автозапуск: + +systemctl enable named + +### Редактирование сервисов + +Если мы хотим внести изменения в юнит-файл сервиса, который был установлен с последним, необходимо использовать drop-in файл или файл переопределения настроек. В противном случае, после обновления программы наши изменения могут быть удалены. + +И так, мы для примера взяли юнит для bind. Чтобы создать для него drop-in файл, вводим: + +systemctl edit named + +И вносим, например, такие изменения: + +[Service] +Restart=on-failure + +_* будет создан файл **/etc/systemd/system/named.service.d/override.conf**, который будет переопределять настройки основного юнит-файла. В данном примере, мы указываем на необходимость перезапуска сервиса при сбое._ + +Чтобы убедиться в использовании Drop-In файла смотрим статус сервиса: + +systemctl status named + +Мы должны увидеть что-то на подобие: + +Drop-In: /etc/systemd/system/named.service.d +           — override.conf + +Также мы можем редаетировать файл юните без drop-in. Для этого добавляем опцию full: + +systemctl edit --full named + +Однако, как было сказано выше, при очередном обновлении приложения, если разработчик пакета предоставляет файл systemd наши изменения могут быть перетерты. + +## Таймеры + +Выше мы рассмотрели возможность автоматического запуска сервисов с помощью systemd. Мы также можем настроить периодический запуск данных юнитов по таймеру. Для этого нам нужно создать юнит с таким же названием, но на конце должен быть суффикс ==.timer==. + +Предположим, мы хотим создать запуск по таймеру named, для которого выше в примере создали юнит сервиса. Тогда создаем файл: + +```sh +vi /usr/lib/systemd/system/named.timer + +[Unit] +Description=Run named every 10 min + +[Timer] +OnBootSec=5min +OnUnitActiveSec=10min + +[Install] +WantedBy=timers.target + +# в данном примере наш таймер будет создан для юнита named; он запустится через 5 минут после старта службы и будет запускать ее каждые 10 минут + +# Перечитаем изменения в systemd: +systemctl daemon-reload + +# Разрешаем наш таймер: +systemctl enable named.timer + +# Запустим его: +systemctl start named.timer + +# Вывести список таймеров можно командой: +systemctl list-timers +``` + diff --git a/LINUX/TAR.md b/LINUX/TAR.md new file mode 100644 index 0000000..7bb98c5 --- /dev/null +++ b/LINUX/TAR.md @@ -0,0 +1,314 @@ +1️⃣ **Распаковка tar** +Для распаковки архива в формате **.tar** в текущую директорию выполните команду: + +`tar xvf archive.tar + +2️⃣ **Распаковка tar.bz2, tar.bzip2, tbz2, tb2, tbz** + +`tar xvjf archive.tar.bz2 + +3️⃣ **Распаковка tar.xz, txz** + +`tar xvJf archive.tar.xz + +4️⃣ **Распаковка tar.gz, tgz** + +`tar xvzf archive.tar.gz + +5️⃣ **Распаковка tar.lzma** + +`tar --lzma -xvf archive.tar.lzma + +🤔 **Пояснение опций** + +x — распаковать архив. +v — Verbose-режим (вывод на экран дополнительной информации во время распаковки). +f — выполнить распаковку архива из файла. +j — вызвать bzip2 для распаковки архива. +z — вызвать gzip +J — вызвать xz + +Чтобы распаковать архив в определенную директорию используется опция -C или --directory, например: + +`tar xvf archive.tar -C /to/directory + +===================================== + ![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 24.07.2024  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 18.11.2016 +### Создать + +Создание выполняется с ключом **c**. Синтаксис следующий: + +tar -c<опции> <новый архивный файл> <что сжимаем> + +Пример создания: + +tar -czvf archive.tar.gz /home/dmosk + +_* в данном примере будет создан архив **archive.tar.gz** домашней директории пользователя (**/home/dmosk**) +** где **z** — сжать архив в gzip (без этого параметра, tar не сжимает, а создает так называемый тарбол); **c** — ключ на создание архива; **v** — verbose режим, то есть с выводом на экран процесса (очень удобно для наблюдением за ходом работы, но в скриптах можно упустить); **f** — использовать файл (обязательно указываем, так как в большей степени работаем именно с файлами)._ + +### Распаковать + +Распаковка выполняется с ключом **x** с синтаксисом: + +tar -x<опции> <архивный файл>  + +Пример распаковки: + +tar -xvf archive.tar.gz  + +## Форматы + +Утилита tar позволяет работать с архивами различных форматов. Рассмотрим их кратко. + +### gz + +Сжатие: + +tar -cf archive.tar.gz /files + +Распаковка .gz файла: + +tar -xf archive.tar.gz  + +_* при возникновении ошибки **This does not look like a tar archive**, можно воспользоваться командой **gzip -d archive.tar.gz**._ + +### bz2 + +tar -xvjf archive.tar.bz2 + +_* ключ j отвечает за работу с bz2._ + +Если система ругается на bzip2, значит нужно его установить: + +apt-get install bzip2 + +Если видим ошибку **tar: Unrecognized archive format**, воспользуемся следующей командой: + +bzip2 -d archive.tar.bz2 + +### gzip + +tar -xvzf archive.tar.gzip + +_* ключ z отвечает за работу с gzip._ + +### tgz + +TGZ — tar-архив, сжатый с помощью утилиты gzip. По сути, это тот же tar.gz, и работа с ним ведется такими же командами. Рассмотрим примеры работы с данным форматом. + +Для создания архива tgz выполняем: + +tar -czf archive.tgz /files + +Распаковывается, как gzip: + +tar -xzf archive.tgz + +### xz + +Это формат сжатия данных с помощью алгоритма LZMA. Для работы с ним устанавливаем: + +apt install xz-utils + +_* на Debian / Ubuntu._  + +yum install xz + +_* на Rocky Linux / CentOS._ + +Теперь можно пользоваться. + +Создать архив: + +tar -cpJf archive.tar.xz /home/user + +Распаковка: + +tar -xpJf archive.tar.xz + +## Описание ключей tar + +### Команды для действия + +|Ключ|Описание| +|---|---| +|-A|Добавление файлов в архив.| +|-c|Создание нового архивного файла.| +|-d|Показать отличающиеся данные между каталогом-исходником и содержимым архива.| +|--delete|Удалить файлы внутри архива.| +|-r|Добавить файлы в конец архива.| +|-t|Показать содержимое архива.| +|-u|Добавить файлы, которых нет в архиве.| +|-x|Извлечь файлы из архива.| + +_* нельзя использовать несколько вышеперечисленных ключей в одной команде._ + +### Дополнительные опции + +|Ключ|Описание| +|---|---| +|--atime-preserve|Оставить прежнюю метку времени доступа для файла.| +|-b N|Задать размер блока N x 512.| +|-C|Смена каталога. По умолчанию, используется тот, в котором мы находимся.| +|--checkpoint|Показать имена папок при чтении архивного файла.| +|-G|Использование старого формата инкрементального резервирования при отображении или извлечения.| +|-g|Использование нового формата инкрементального резервирования при отображении или извлечения.| +|-h|Не дублировать символьные ссылки. Только файлы, на которые указывают эти симлинки.| +|-i|Игнорировать блоки нулей.| +|-j|Использование bzip2.| +|--ignore-failed-read|Игнорировать не читаемые файлы.| +|-k|При распаковке, существующие файлы не заменяются соответствующими файлами из архива.| +|-L N|Смена магнитной ленты после N*1024 байт.| +|-m|При извлечении игнорировать время модификации объекта.| +|-M|Многотомные архивы.| +|-N DATE|Сохранять только более новые файлы относительно DATE| +|-O|Направление извлекаемого на стандартный вывод.| +|-p|Извлечение защищенной информации.| +|-P|Не отбрасывает начальный слэш (/) из имен.| +|-s|Сортировка файлов при извлечении.| +|--preserve|Аналогично -ps| +|--remove-files|Удалить исходные файлы после добавления в архив.| +|--same-owner|Сохранить владельца при извлечении.| +|--totals|Вывод байт при создании архива.| +|-v|Протоколирование действий — отображение списка объектов, над которыми происходит действие.| +|-V NAME|Создание архива на томе с меткой NAME.| +|--version|Показать версию tar.| +|-w|Требовать подтверждения для каждого действия.| +|-W|Проверка архива после записи.| +|--exclude FILE|Исключить файл FILE.| +|-X FILE|Исключить файлы FILE.| +|-Z|Фильтрует архив с помощью compress.| +|-z|Использование gzip.| + +* актуальный список опций можно получить командой **man tar**. + +## Примеры + +Рассмотрим некоторые сценарии использования tar. + +### Распаковать в определенную папку + +tar -C /home/user -xvf archive.tar.gz + +_* ключ **-C** используется для указания папки, куда необходимо распаковать файлы из архива._ + +### Распаковка без вложенной папки + +Такой способ можно использовать для распаковки в заранее подготовленный каталог. Будет некий эффект переименовывания каталога или аналог «Распаковать здесь»: + +tar -C /home/admin/mytar -xvf admin.tar.gz --strip-components 1 + +_* каталог **/home/admin/mytar** заранее должен быть создан; **--strip-components 1** пропустит одну вложенную папку внутри архива._ + +### Указать конкретный файл или каталог для распаковки + +Если у нас большой архив, но извлечь нужно конкретный файл или каталог, то можно указать его через пробел после указания файла с архивом. Синтаксис: + +tar zxf <путь до архива> <что извлечь> + +Рассмотрим пример. Напомним, что можно посмотреть содержимое архива с помощью опции t: + +tar tf /backup/samba.tar.gz + +Теперь можно распаковать архив: + +tar -zxf /backup/samba.tar.gz mail + +_* предположим, что внутри архива **samba.tar.gz** есть что-то и каталог **mail**. Извлечем мы только последний._ + +### Исключение файлов по маске + +Если необходимо пропустить некоторые файлы, вводим команду с ключом --exclude: + +tar --exclude='sess_*' -czvf archive.tar.gz /wwwsite + +_* в данном примере мы создадим архив **archive.tar.gz**, в котором не будет файлов, начинающихся на **sess_**._ + +Также можно исключить несколько файлов или папок, добавляя несколько опций exclude: + +tar --exclude='/data/recycle' --exclude='*.tmp' -zcf /backup/samba/2021-08-29.tar.gz /data/ + +_* в данном примере мы исключим папку **recycle** и файлы, которые заканчиваются на **.tmp**_ + +### Работа с архивами, разбитыми на части + +Разбить архив на части может понадобиться по разным причинам — нехватка места на носителе, необходимость отправки файлов по почте и так далее. + +Чтобы создать архив, разбитый на части, вводим команду: + +tar -zcvf - /root | split -b 100M - root_home.tar.gz + +_* данная команда создаст архив каталога **/root** и разобьет его на части по **100 Мб**._ + +> Если у нас уже есть архив, который нужно разбить, команда будет такой: +> +> split -b 100M root_home.tar.gz root_home.tar.gz +> +> _* в данном примере архив **root_home.tar.gz** будет разбит на части, состояние из файлов по 100 Мб._ + +В итоге мы получим, примерно, такую картину: + +root_home.tar.gzaa  root_home.tar.gzac  root_home.tar.gzae +root_home.tar.gzag  root_home.tar.gzai  root_home.tar.gzab +root_home.tar.gzad  root_home.tar.gzaf  root_home.tar.gzah + +Чтобы собрать архив и разархивировать его, вводим команду: + +cat root_home.tar.gz* | tar -zxv + +> Если мы хотим только собрать разбитый архив, вводим: +> +> cat root_home.tar.gz* > root_home.tar.gz + +### Создание tar из отдельных файлов с последующим его архивированием + +Мы можем собрать файл tar, добавляя по очереди в него файлы, после чего создать сжатый архив. Предположим, у нас 3 файла: file1, file2, file3. + +Сначала создадим tar-файл с первым файлом внутри: + +tar -cf ./my_archive.tar ./file1 + +Следующими двумя командами мы добавим в архив файлы file2 и file3: + +tar -rf ./my_archive.tar ./file2 + +tar -rf ./my_archive.tar ./file3 + +Сожмем содержимое tar-файла: + +gzip < ./my_archive.tar > ./my_archive.tar.gz + +Файл tar можно удалить: + +rm -f my_archive.tar + +### Рекурсивная распаковка + +Предположим, что у нас есть архив, в котором есть еще архив. И еще и еще много раз. Чтобы не заниматься ручной распаковкой, можно использовать команду с while: + +while [ -f *.tar.gz ]; do filename="$(ls -1 *.tar.gz | head -n 1)"; tar -xvf $filename && rm $filename; done; + +Обратите внимание, что данная команда удалит исходный файл архива, а также будет искать архив по маске, поэтому в каталог, где выполняем команду не стоит копировать другие архивы. + +## ZIP + +Tar не работает с zip-архивами. В системах UNIX для этого используем утилиты zip и unzip. Для начала, ставим нужные пакеты: + +yum install zip unzip + +apt-get install zip unzip + +pkg install zip unzip + +_* соответственно, для RPM based, deb based, BSD based._ + +Создание ZIP: + +zip -r archive.zip /home/dmosk + +_* создает архив каталога **/home/dmosk** в файл **archive.zip**._ + +Распаковка ZIP: + +unzip archive.zip \ No newline at end of file diff --git a/LINUX/TERMINAL.md b/LINUX/TERMINAL.md new file mode 100644 index 0000000..d71aaa4 --- /dev/null +++ b/LINUX/TERMINAL.md @@ -0,0 +1,207 @@ + +### Смена редактора по умолчанию: +```sh +which vim +export EDITOR=/usr/bin/vim +``` +### Ускорить работу в терминале + +Используй !$ — это магия последнего аргумента предыдущей команды. + +`mkdir new_project +`cd !$ + +📌 Ещё пример: + +`curl https://example.com/file.zip +`wget !$ + +🔁 Работает с vim, cp, mv, tar и др. +💡 Экономит много времени! + + +### Горячие клавиши в терминале + +🌟 Ctrl + A — переход в начало строки +🌟Ctrl + E — переход в конец строки +🌟Ctrl + U — удаление от курсора до начала строки +🌟 Ctrl + K — удаление от курсора до конца строки +🌟Ctrl + W — удаление слова перед курсором +🌟Ctrl + L — очистить экран терминала +🌟Ctrl + C — остановить текущий процесс/команду +🌟 Ctrl + D — выход из системы +🌟 Ctrl + Z — поставить текущий процесс на паузу (в отличии от Ctrl + C, данный процесс можно будет продолжить)  +🌟 Ctrl + R — поиск по истории команд +🌟 Стрелка вверх — показать предыдущую команду +🌟 Стрелка вниз — показать следующую команду +🌟 !! — повторить последнюю команду +🌟 !n — повторить n команду +🌟 Tab — автозаполнение команд, файлов и каталогов +🌟 Ctrl + Shift + C — копировать +🌟 Ctrl + Shift + V — вставить +🌟 Ctrl + Shift + N — открыть новое окно терминала +🌟 Ctrl + Shift + T — открыть новую вкладку в терминале +🌟 Ctrl + Tab — переключение между вкладками терминала + +## Управление окном эмулятора терминала + +Указанные ниже сочетания клавиш упростят вашу работу с терминалом GNOME и большинством других приложений эмуляторов терминала. + +- **Ctrl + Shift + Q** — закроет текущее окно терминала. +- **Ctrl + Shift + T** — откроет дополнительную вкладку терминала. +- **Ctrl + Shift + W** — закроет текущую вкладку. +- **Ctrl + Shift + D** — превратит вкладку в отдельное окно. +- **Ctrl + PgUp** — переместит на предыдущую вкладку. +- **Ctrl + PgDown** — переместит на следующую вкладку. + +## Переключение между tty-сессиями в терминале. + +В терминале Linux есть возможность переключаться между разными сессиями терминала, своеобразными «рабочими столами» в контексте командной строки. Для переключения между разными сессиями, например, когда кажется, что терминал завис, нажмите комбинацию: **Ctrl + Alt + f2**. Вы можете переключаться между шестью разными сессиями. Для переключения назад на первую tty-сессию терминала нажмите **Ctrl + Alt + f1**. + +Нажатие комбинации **Ctrl + Alt + f7**, в свою очередь, управляет отображением графической оболочки ОС. + +## Управление вводом: автодополнение команд и исправление опечаток + +### TAB + +Клавиша TAB — самая частая и основная в использовании среди всех горячих клавиш Linux. Данная клавиша поможет вам дополнить команду или путь к файлу или предложит варианты, если их несколько. +Для использования данного функционала начните набирать команду и нажмите TAB после введения нескольких символов. + +- Одно нажатие — дополняет команду. +- Два нажатия — предлагает несколько вариантов, если введенный текст имеет несколько вариантов продолжения. Например, двойное нажатие **Tab** поможет написать длинный путь к нужному файлу или директории. + +### Ctrl + Shift + «-» + +Сочетание клавиш **Ctrl Shift** и знака «минус» поможет вам отменить последний ввод в терминал. Команда очень полезна, если вы выбрали не тот вариант из меню предложенных в автодополнении или сделали опечатку. + +### Ctrl + T + +Это сочетание клавиш меняет местами два соседних символа и может быть очень полезна, если вы опечатались и написали слово неправильно. Например, используя данное сочетание клавиш, можно с легкостью исправить **selectle** на правильный вариант — **selectel**. + +### Alt + T + +Это сочетание клавиш уже посерьезнее, чем предыдущее и меняет местами целые слова. Например, с помощью этого сочетания, можно парой нажатий исправить **I Selectel Love** на правильный вариант — **I Love Selectel**. + +### Alt + Backspace и Alt + D + +Эти два сочетания помогут быстро удалить ненужные части введенных ранее команд. + +- **Alt + Backspace** поможет удалить слово, стоящее перед курсором (слева). +- **Alt + D удаляет** все символы, которые находится справа от курсора в текущей строке. + +## Управление курсором + +В какой-то момент стрелочек на клавиатуре будет недостаточно для быстрого перемещения по тексту, и вам понадобятся новые комбинации. Они позволят быстрее ориентироваться в тексте и набирать команды. + +- **Ctrl+A (Home)** совершит быстрый переход в начало строки. +- **Ctrl+E (End)** переместит курсор в конец строки текста. +- **Alt+B** переместит курсор назад (влево) на одно слово. +- **Ctrl+B** переместит курсор назад (влево) на один символ. +- **Alt+F** сдвинет курсор на слово вправо. +- **Ctrl+F** сдвинет курсор на слово вправо. +- **Ctrl+XX** мгновенно переместит курсор в начало текущей строки, выделив весь текст на своем пути. С помощью этого сочетания клавиш можно выделить строку или исправить что-то в ее начале. Второе нажатие комбинации переместит позицию курсора назад. + +## Работа с буфером обмена + +В терминале также есть возможность пользоваться буфером обмена: копировать в него текст, вырезать и вставлять в строку или в файл, открытый в терминале. + +### Ctrl + W + +Это сочетание клавиш поможет вырезать стоящее перед курсором слово и скопировать его в буфер обмена. + +### Ctrl + U + +Это сочетание вырежет и скопирует в буфер обмена текущую строку. + +### Ctrl + K + +Сочетание клавиш **Ctrl и K** вырежет строку, находящуюся справа от курсора. + +### Shift + Insert + +Данное сочетание клавиш нужно для того, чтобы вставить в терминал текст, находящийся в буфере обмена. + +### Ctrl + Y + +Вставит в поле ввода последний скопированный или вырезанный в буфер обмена текст. + +## Форматирование текста в терминале + +Следующий набор горячих клавиш сильно упростит работу с регистром символов, введенных в терминал. В Linux и UNIX-системах регистр играет важную роль, поэтому данные команды также будут очень полезны. + +### Alt + U + +После того, как вы нажмете это сочетание клавиш, все символы справа от курсора и до конца текущего слова сменят регистр на верхний. + +### Alt + L + +Сочетание **Alt + L** работает наоборот: все символы справа от курсора и до конца текущего слова сменят регистр на нижний. + +### Alt + C + +При активации этого сочетания клавиш символ, находящийся под курсором, изменит регистр с нижнего на верхний, а курсор переместится в конец слова. + +## Работа с историей bash + +Терминал хранит историю выполненных пользователем команд. Если вы хотите ее посмотреть, выполните следующую команду: + + `history` + +Эта команда не очень удобна, когда нужно быстро вспомнить ранее введенную команду и выполнить ее в командной оболочке. В этом нам помогут сочетания клавиш. + +### Ctrl + P + +Данное сочетание клавиш заменяет стрелку «вверх». Используйте его, чтобы переместиться к команде, выполненной ранее. Вы можете использовать данное сочетание неограниченное количество раз, каждый раз перемещаясь к более ранней команде. + +### **Ctrl + N** + +Это сочетание клавиш, в свою очередь, является альтернативой стрелке «вниз» и нужно, чтобы переместиться по истории в обратную сторону. + +### Ctrl + R + +После нажатия этого сочетания клавиш в терминале появится строка поиска, которая поможет найти и выполнить команду из истории команд, ранее запущенных через терминал. Для выполнения предложенной команды, просто нажмите **Enter,** а для редактирования предложенной команды или выхода из поиска — **Esc**. + +- **Ctrl + 0** сразу выполнит найденную команду без изменений. +- **Ctrl + G** завершит работу с инструментом поиска по истории без выполнения найденной команды. + +### Alt + R + +Если вы нашли в истории команду, уже отредактировали и хотите отменить изменения, нажмите это сочетание клавиш. Команда вернется к первоначальному виду. + +## Управление процессами + +В терминале Linux также есть горячие клавиши для легкого управления запущенными в терминале процессами. + +### Ctrl + C + +Данное сочетание клавиш необходимо знать любому пользователю терминала. С его помощью можно завершить процесс, выполняющийся на данный момент в терминале. Это сочетание клавиш мгновенно отправит программе сигнал **SIGINT**, и если программа не завершит работу должным образом, он будет принудительно остановлен. Иными словами, эта комбинация убивает текущий процесс. + +### Ctrl + D + +Сочетание **Ctrl + D** завершает работу терминала, посылая в терминал запрос EOF или «конец файла». После получения данного запроса, работа терминала завершается. Если у вас в терминале открыто активное ssh подключение, то комбинация **Ctrl + D** разъединит вас с удаленным хостом. Это сочетание клавиш является альтернативой команды **exit**. + +### Ctrl + Z + +Сочетание **Ctrl + Z** пошлет текущему процессу запрос **SIGSTP** и приостановит его выполнение до востребования. Запустить приостановленный процесс можно с помощью следующей команды: + +`fg` + +Посмотреть список приостановленных процессов вы можете, выполнив команду: + +`jobs` + +## Сочетания клавиш для управления отображением + +При помощи сочетаний клавиш, приведенных ниже, вы сможете легко управлять количеством информации, находящейся в окне терминала. + +### Ctrl + L + +Это сочетание — альтернатива команде clear. После нажатия Ctrl + L терминал очистится от результатов выполнения предыдущих команд. + +### Ctrl + S + +Сочетание клавиш **Ctrl + S** остановит вывод в терминал. Команда не прекратит выполняться, но вывод данных непосредственно в терминал будет приостановлен. + +### Ctrl + Q + +Нажатие этой горячей клавиши снимет вывод в терминал с паузы, на которую вы его поставили нажатием клавиши **Ctrl + S**. \ No newline at end of file diff --git a/LINUX/TIMEDATE, CHRONY, NTP.md b/LINUX/TIMEDATE, CHRONY, NTP.md new file mode 100644 index 0000000..606238b --- /dev/null +++ b/LINUX/TIMEDATE, CHRONY, NTP.md @@ -0,0 +1,48 @@ +```sh +# TIMEDATE + +timedatectl status +timedatectl list-timezones +sudo set timedatectl set-timezone Europe/Moscow + +========================================== +# CHRONY + +sudo apt install chrony +sudo systemctl enable chrony +sudo systemctl start chrony + +sudo timedatectl set-timezone Europe-Moscow + +date +Mon Dec 6 07:13:49 UTC 2021 + +========================================== +# NTP + +sudo apt install ntp +sntp --version +sudo vim /etc/ntp.conf +``` + +![[Снимок экрана 2023-10-29 в 14.23.34.png]] +Замените на свои. + +```sh +sudo service ntp restart +sudo service ntp status +sudo ufw allow from any port 123 proto udp + +sudo apt install ntpdate +sudo vim /etc/hosts +sudo ntpdate NTP-server-host +sudo timedatectl set-ntp off +sudo apt install ntp +sudo vim /etc/ntp.conf + +# добавьте: +server NTP-server=host prefer iburst` +sudo service ntp restart` +ntpq -ps` +``` + diff --git a/LINUX/TLDR.md b/LINUX/TLDR.md new file mode 100644 index 0000000..5c05592 --- /dev/null +++ b/LINUX/TLDR.md @@ -0,0 +1,12 @@ +**tldr вместо man: как быстро найти примеры использования команды** + +Вместо того, чтобы блуждать по длинным описаниям команд в man, можем использовать tldr. Эта утилита предоставляет краткие и понятные примеры команд. + +✔️ **Установка** +`sudo apt install tldr  # Для Ubuntu/Debian +`sudo pacman -S tldr    # Для Arch + +⚙️ **Пример использования** +`tldr tar + +В результате получите наглядные примеры: как распаковать архив, добавить файлы и так далее... \ No newline at end of file diff --git a/LINUX/TMUX.md b/LINUX/TMUX.md new file mode 100644 index 0000000..6a640e1 --- /dev/null +++ b/LINUX/TMUX.md @@ -0,0 +1,58 @@ +```sh +cd +git clone https://github.com/gpakosz/.tmux.git +ln -s -f .tmux/.tmux.conf +cp .tmux/.tmux.conf.local . +tmux new-session -s name +``` + +**tmux** **команда** **опции** +_**attach-session**_ (attach) - подключиться к уже существующей сессии. В параметре необходимо передать опцию -t и идентификатор сессии; +tmux attach -t 0 +_**detach-session**_ (detach) - отключить всех клиентов (или переданного с помощью опции -t) от сессии, переданной в опции -s; +_**has-session**_ - проверить существует ли сессия, аналогично, надо передать идентификатор сессии; +_**kill-server**_ - остановить все запущенные сессии; +_**kill-session**_ - завершить сессию переданную в параметре -t; +_**list-clients**_ - посмотреть клиентов, подключенных к сессии -t; +_**list-sessions**_ (ls) - вывести список всех запущенных сессий; +_**new-session**_ - создать новую сессию, можно передать имя сессии в опции -s и стартовую директорию в опции -c; +_**rename-session**_ - переименовать сессию, нужно передать идентификатор сессии и новое имя; + +**Ctrl+b c** - создать новое окно; +**Ctrl+b w** - выбрать окно из списка; +**Ctrl+b 0-9** - открыть окно по его номеру; +**Ctrl+b ,** - переименовать текущее окно; +**Ctrl+b %** - разделить текущую панель по горизонтали; +**Ctrl+b "** - разделить текущую панель по вертикали; +**Ctrl+b стрелка** - перейти на панель, находящуюся в стороне, куда указывает стрелка; +**Ctrl+b Ctrl+стрелка** - изменить размер текущей панели; +**Ctrl+b o** - перейти на следующую панель; +**Ctrl+b ;** - переключаться между текущей и предыдущей панелью; +**Ctrl+b x** - закрыть текущую панель; +**Ctrl+b \[** - войти в режим копирования (подробнее ниже); +**Ctrl+b ]** - вставить из внутреннего буфера обмена tmux; +**Ctrl+b d** - отключится от текущей сессии; +**Ctrl+b :** - открыть командную строку. +**Ctrl+b "** - деление окна горизонтально +**Ctrl+b %** - деление окна + + + ```sh +sudo nvim ~/.tmux.conf + +# Установка двух префиксов: от 'Ctrl+b' до 'Alt+b'**_ +set-option -g prefix M-b +set-option -g prefix2 C-b + +# для включения режима мыши (скролл, изменение размера панели, выбор панели и др.) +set -g mouse on + +tmux_conf_copy_to_os_clipboard=true + +tmux source ~/.tmux.conf # -перезапуск + + +tmux new -s name -d # запускаем и отцепляемся от сессии +tmux split-window -v -t name:0.0 # разбиваем вертикально на 2 окна +tmux split-window -h -t name:0.1 # разбиваем горизонтально на 2 окна +``` diff --git a/LINUX/TRANSMISSION.md b/LINUX/TRANSMISSION.md new file mode 100644 index 0000000..9867465 --- /dev/null +++ b/LINUX/TRANSMISSION.md @@ -0,0 +1,30 @@ +`sudo apt install transmission-daemon` + + +**# остановить сервис** + +`sudo systemctl stop transmission-daemon.service` + +**# проверить состояние** + +`sudo systemctl status transmission-daemon.service` + + +_файл инициализирующий старт демона:_ + +`/etc/init.d/transmission-daemon` + + +_Файл конфигурации:_ + +`/etc/default/transmission-daemon` + + +_Файл global settings:_ + +`/etc/transmission-daemon/settings.json` + + +_Файл local settings:_ + +`~/.config/transmission-daemon/settings.json` diff --git a/LINUX/UFW.md b/LINUX/UFW.md new file mode 100644 index 0000000..af92d4e --- /dev/null +++ b/LINUX/UFW.md @@ -0,0 +1,165 @@ +```sh +sudo su + +ufw status + +ufw enable + +ufw app list +ufw allow OpenSSH + +# Чтобы увидеть, что в настоящее время заблокировано или разрешено, вы можете использовать параметр **verbose** при запуске **ufw status**, как показано ниже: + +sudo ufw status verbose + +sudo ufw disable + +# Блокировка обращения IP-адреса +# Чтобы заблокировать все сетевые подключения, исходящие с определенного IP-адреса, выполните следующую команду, заменив выделенный IP-адрес на IP-адрес, который вы хотите заблокировать: + +sudo ufw deny from 91.198.174.190 + +# Заблокировать подсеть +# Если вам нужно заблокировать всю подсеть, вы можете использовать адрес подсети в качестве параметра «from» в команде ufw deny. Это заблокирует все IP-адреса в приведенной в примере подсети 91.198.174.0/24: + +sudo ufw deny from 91.198.174.0/24 + +# Блокирование входящих подключений к сетевому интерфейсу +# Чтобы заблокировать входящие подключения с определенного IP-адреса к определенному сетевому интерфейсу, выполните следующую команду, заменив IP-адрес на IP-адрес, который вы хотите заблокировать: + +sudo ufw deny in on eth0 from 91.198.174.192 + +# Параметр «in» указывает брандмауэру применять правило только для входящих соединений, а параметр «on eth0» указывает, что правило применяется только для интерфейса eth0. +# Это может быть полезно, если у вас есть система с несколькими сетевыми интерфейсами (включая виртуальные), и вам нужно заблокировать внешний доступ к некоторым из этих интерфейсов, но не ко всем. + +# Разрешить обращения IP-адреса +# Чтобы разрешить все сетевые подключения, исходящие с определенного IP-адреса, выполните следующую команду, заменив выделенный IP-адрес на IP-адрес, к которому вы хотите разрешить доступ: + +sudo ufw allow from 91.198.174.192 + +# Если теперь вы запустите «sudo ufw status», вы увидите вывод, похожий на этот, с надписью ALLOW рядом с IP-адресом, который вы только что добавили: + +# Разрешение входящих подключений к сетевому интерфейсу +# Чтобы разрешить входящие подключения с определенного IP-адреса к определенному сетевому интерфейсу, выполните следующую команду, заменив IP-адрес на тот, который вы хотите разрешить: + +sudo ufw allow in on eth0 from 91.198.174.22 + +# Параметр «in» указывает брандмауэру применять правило только для входящих соединений, а параметр «on eth0» указывает, что правило применяется только для интерфейса «eth0». + +# Удалить правило брандмауэра +# Чтобы удалить правило, ранее установленное в UFW, используйте **ufw delete**, затем введите правило (allow / deny) и целевую спецификацию. В следующем примере удаляется правило, ранее установленное для разрешения всех подключений с IP-адреса 91.198.174.192: + +sudo ufw delete allow from 91.198.174.192 + +# Другой способ указать, какое правило вы хотите удалить, – это указать ID правила. Эту информацию можно получить с помощью следующей команды: + +sudo ufw status numbered + +sudo ufw delete 1 + +# Список доступных профилей приложений +# При установке приложения, которые полагаются на сетевые коммуникации, обычно устанавливают профиль брандмауэра, который можно использовать для разрешения подключения с внешних адресов. Это часто то же самое, что запустить «ufw allow from», с тем преимуществом, что это ярлык, который абстрагирует конкретные номера портов, используемые службой, и обеспечивает удобную номенклатуру для ссылающихся служб. + +sudo ufw app list + +# Если вы установили службу, например, веб-сервер или другое сетезависимое программное обеспечение, и профиль не был доступен в брандмауэре, сначала убедитесь, что служба включена. + +# В следующем примере мы включаем профиль OpenSSH, который разрешит все входящие SSH-соединения на стандартном порту SSH. + +sudo ufw allow OpenSSH + +# Отключить профиль для определенного приложения +# Чтобы отключить профиль приложения, который вы ранее настроили в брандмауэре, вам нужно удалить соответствующее правило. + +sudo ufw status + +# Этот вывод указывает на то, что профиль приложения «Nginx Full» в настоящее время включен, разрешая любые соединения с веб-сервером как через HTTP[](https://serverspace.ru/support/glossary/http/), так и через HTTPS. + +# Если вы хотите разрешить только HTTPS-запросы к вашему веб-серверу, вам нужно сначала включить наиболее ограничивающее правило, которым в данном случае будет «Nginx HTTPS», а затем отключить активное правило «Nginx Full»: + +sudo ufw allow "Nginx HTTPS" sudo ufw delete allow "Nginx Full" + +# Помните, что вы можете перечислить все доступные профили приложений с помощью: + +sudo ufw app list + + + +ip addr show +hostname -I + +curl -4 icanhazip.com +``` +===================================================== +### Шпаргалка по ufw для базовой настройки фаервола + +Сетевой безопасностью часто пренебрегают при создании своих проектов на своем сервере. Но даже базовая настройка фаервола уже существенно снижает риски. + +`ufw (Uncomplicated Firewall)` - простой способ настроить фаервол на Linux. Работает как обёртка над iptables, но не требует глубоких знаний сетевого стека. + +Зачем вообще нужен фаервол? + +Когда ты поднимаешь сервер (особенно публичный), он сразу становится видимым всему интернету. И даже если ты не настраиваешь ничего «опасного», какие-то сервисы по умолчанию могут слушать порты. + +ufw помогает ограничить доступ: только те порты, которые ты явно разрешил - будут открыты. Если ты только поднял VPS и хочешь защитить сервер - это именно то, что нужно. Если по какой-то причине у тебя ufw не установлен: + +`sudo apt install ufw + +Перед включением стоит задать основные правила, иначе можно случайно отрезать себя от SSH-доступа (особенно на VPS). Начнем с самого важного: + +`sudo ufw allow ssh + +Теперь можно активировать фаервол: + +`sudo ufw enable + +Просмотр статуса и активных правил: + +`sudo ufw status verbose + +Отключение при необходимости: + +`sudo ufw disable + +Базовые правила, которые стоить задать + +Одно правило по разрешению ssh-доступа мы уже добавили, также будет правильно разрешить веб-траффик (http/https): + + +$ sudo ufw allow 80,443/tcp + + +Полезно запретить весь входящий трафик по умолчанию и разрешить только нужное. Также оставить открытым все на выход: + +`sudo ufw default deny incoming + +`sudo ufw default allow outgoing + +#### Полезные команды: + +**Удалить правило: + +`sudo ufw delete allow 80/tcp + +**Разрешить доступ по конкретному IP: + +sudo ufw allow from 192.168.1.10 + +Это может понадобиться, например, чтобы открыть порты для веб-траффика только Cloudflare или ServicePipe и закрыть для всего остального: + +`ufw default deny incoming +`ufw default allow outgoing + +предположим что 192.168.1.10 - IP нашего ServicePipe + +`sudo ufw allow from 192.168.1.10 to any port 22 + +Сбросить все правила и начать с нуля: + +`sudo ufw reset + +После настройки рекомендую протестировать сервер из другого устройства или использовать онлайн-сервисы вроде portquiz или nmap для сканирования портов. Также полезно мониторить логи: + +`sudo less /var/log/ufw.log + +Если `ufw` работает - ты увидишь записи о заблокированных соединениях, особенно на нестандартные порты. Даже минимальные настройки ufw — это уже огромный шаг вперёд в безопасности. Он не требует глубокого понимания iptables и легко вписывается в ежедневный рабочий процесс. Один раз настроил — и забыл. \ No newline at end of file diff --git a/LINUX/USER.md b/LINUX/USER.md new file mode 100644 index 0000000..62597a2 --- /dev/null +++ b/LINUX/USER.md @@ -0,0 +1,137 @@ +```sh +# Создаем пользователя и добавляем в SUDO: +sudo adduser vlapa +sudo usermod -aG sudo vlapa + +# Блокируем ROOT: +sudo passwd -l root + +# Переключаемся на VLAPA и проверяем: +su - vlapa +sudo whoami # должно вывести "root" (работает через sudo) +sudo su - # должно запросить ваш пароль, а не root + +# Запрещаем вход по SSH: +sudo vim /etc/ssh/sshd_config + +# Найдите строку PermitRootLogin и установите: + +text + +PermitRootLogin no + +# Затем перезапустите SSH: +sudo systemctl restart sshd + +# ## Что делать, если root уже активирован? +sudo passwd -l root # блокируем пароль +sudo usermod -s /bin/bash root # возвращаем shell (на всякий случай) + +# После этого войти как root будет невозможно. Все административные задачи будут выполняться через `sudo` от вашего пользователя. + +#========================================= +# Заблокировать аккаунт пользователя: +passwd -l имя_пользователя + +# Проверить статус аккаунта: +passwd -S имя_пользователя + +# Разблокировать пользователя: +passwd -u имя_пользователя + +#========================================= +# Создание пользователя с привилегиями Sudo +sudo adduser *имя_пользователя* +sudo adduser *имя_пользователя* sudo +su - *имя_пользователя* + +# ======================================== +# - root - правильное переключение sudo su - +sudo su + +# - НЕ интерактивная (лучше создании пользователя из скрипта), НЕ создаст пользователю домашний каталог и НЕ придумает пароль если не использовать дополнительные опции команды. Зато создаст одноименную группу пользователя и включит этого пользователя в неё. + +useradd # -не задает вопросы, а создает пользователя используя опции +-m # — создать домашний каталог пользователю; +-p <пароль> # — здесь нужно ввести хешированный пароль, что не всегда удобно, поэтому не стоит использовать эту опцию; +-s <путь_к_оболочке> # — указать командную оболочку используемую по умолчанию для пользователя (сейчас мы работает в оболочке bash, путь к ней — /bin/bash); + +# - интерактивная (лучше при ручном создании пользователя) утилита у нас запросит пароль для нового пользователя, создаст одноименную группу для пользователя, также мы можем ввести дополнительную информацию о пользователе: полное имя, номер комнаты, рабочий телефон, домашний телефон. +adduser +—no-create-home # — не создавать домашний каталог пользователю; +—shell <Оболочка> # — задать оболочку для пользователя, по умолчанию задается оболочка bash; + +userdel +-f # — завершить все процессы пользователя и удалить насильно, даже если пользователь сейчас работает в системе; +-r # — удалить домашний каталог пользователя; + +deluser +—remove-home # — удалить домашний каталог пользователя; +—force # — завершить все процессы пользователя и удалить насильно, даже если пользователь сейчас работает в системе; +``` + +#### Как создать Sudo пользователя в Ubuntu 22.04 LTS + +[Подписывайтесь на наш канал в Telegram](https://tx.me/amur_pro) + +В Ubuntu-системе, да и в принципе, в любой другой Linux-системе, обязательно есть один привилегированный пользователь — **root**.  + +**sudo** — утилита, которая дает привилегии root для выполнения административных операций. + +Простым языком команда sudo позволяет пользователям Ubuntu выполнять команды от имени суперпользователя root, либо других пользователей. + +## Создание пользователя с привилегиями Sudo + +Сперва, при помощи команды «**adduser**» создаем нового пользователя.  + +sudo adduser *имя_пользователя* + +При создании пользователя будет предложено ввести пароль и другие необязательные данные (Имя, Номер комнаты, Телефон и тд), указываем их по своему желанию. + +![Как создать Sudo пользователя в Ubuntu 22.04 LTS](https://img.amur.pro/blog/2022/07/465/f7f11c9f78533ca611bcb35fa5ef99b6.jpg) + +Обращаем внимание, что только суперпользователь с правами root имеет право добавлять новых пользователей в Ubuntu. Следовательно, запускаем команду adduser с sudo. + +## Добавляем пользователя в группу Sudo + +Следующим шагом является **добавление созданного пользователя в группу sudo**, которая выдаст пользователю все привилегии sudo: + +sudo adduser *имя_пользователя* sudo + +При успешном добавлении в группу Sudo получим уведомление в терминале Ubuntu: «**Добавление пользователя *имя* в группу sudo. Готово.**». + +![Как создать Sudo пользователя в Ubuntu 22.04 LTS](https://img.amur.pro/blog/2022/07/465/dd5b8b4e960d8b99976ca866840c4bfd.jpg) + +Отлично! Пользователь добавлен в группу sudo, теперь проверим, есть ли у него привилегии sudo. + +## Тестирование пользователя Sudo + +Переключаемся на вновь созданного пользователя (пользователь с именем admin в нашем случае) при помощи команды «**su**»: + +su - *имя_пользователя* + +После того, как мы войдем в систему под новым пользователем, мы получим сообщение, как правильно использовать команду «**sudo**» — «**To run a command as administrator (user *root*), use *sudo command***». + +![Как создать Sudo пользователя в Ubuntu 22.04 LTS](https://img.amur.pro/blog/2022/07/465/59cf2584eb8be26da0695ac9aeea46eb.jpg) + +Данное уведомление в терминале будет означает, что пользователь находится в группе sudo. + +================================== +```sh +groups +groups plex + +``` + +================================== +▪**Блокировка учетной записи пользователя:** + +`passwd -l user_name + +▪**Проверьте статус акаунта:** + +`passwd -S user_name + +▪**Разблокировать пользователя:** + +`passwd -u user_name \ No newline at end of file diff --git a/LINUX/VSFTPD.md b/LINUX/VSFTPD.md new file mode 100644 index 0000000..d2e80ed --- /dev/null +++ b/LINUX/VSFTPD.md @@ -0,0 +1,367 @@ +## Обновление системных пакетов + +Перед установкой любого нового ПО рекомендуем обновлять системные пакеты до актуальных версий. Рассмотрим, какие команды для этого следует выполнить. + +1. Обновление списка доступных пакетов и их версий: + + `sudo apt update` + +2. Обновление установленных пакетов до последних версий: + + `sudo apt upgrade -y` + +Теперь система готова к установке FTP-сервера. + +## Выбор FTP-сервера на Ubuntu + +FTP-серверы широко используют для обмена файлами, так как FTP-протокол позволяет одновременно передавать большие объемы данных, например резервные копии. Быстрое копирование файлов на FTP-сервер достигается благодаря передаче данных потоком.  + +Существует несколько популярных FTP-серверов для Linux. Рассмотрим некоторые из них. + +**VSFTPD (Very Secure FTP Daemon)** + +Преимущества: высокий уровень безопасности, отличная производительность, поддержка виртуальных пользователей, возможность ограничения доступа к домашним директориям. + +Недостатки: для обеспечения максимальной безопасности нужна детальная настройка. + +**ProFTPD (Professional FTP Daemon)** + +Преимущества: гибкие настройки, поддержка модулей, возможность использования конфигурации, похожей на Apache. + +Недостатки: более длительная настройка по сравнению с VSFTPD, меньшая производительность при высокой нагрузке. + +**Pure-FTPd** + +Преимущества: легкость установки и использования, высокая производительность, поддержка виртуальных пользователей. + +Недостатки: меньшее количество настроек безопасности по сравнению с VSFTPD и ProFTPD. + +### Что выбрали + +Для демонстрации установки и настройки будем использовать VSFTPD по нескольким причинам. + +- Низкий ресурсный overhead. VSFTPD потребляет минимум ресурсов, что делает его идеальным для систем с ограниченными возможностями. +- Высокая скорость передачи данных. Обеспечивает отличную производительность при передаче файлов, что важно для высоконагруженных серверов. +- Встроенная поддержка шифрования для безопасной передачи данных — SSL/TLS. +- Многоплатформенность. Работает на большинстве UNIX-подобных систем. +- Простота интеграции с системами безопасности. Легко интегрируется с PAM и другими системами аутентификации для гибкого управления доступом. + +[ + +## Создайте FTP-сервер на мощностях Selectel + +Более 100 фиксированных конфигураций с готовностью — 2 минуты. + +](https://selectel.ru/services/cloud/servers/ftp/) + +## Установка FTP-сервера на Ubuntu + +### Установка VSFTPD + +VSFTPD прост в установке — он доступен в стандартных репозиториях Ubuntu. Откроем терминал и выполним следующую команду: + + `sudo apt install vsftpd -y` + +### Запуск и настройка автозагрузки VSFTPD + +После установки запустим VSFTPD: + + `sudo systemctl start vsftpd` + +Совет: для настройки автозагрузки VSFTPD при запуске системы выполните команду sudo systemctl enable vsftpd. + +### Проверка состояния VSFTPD + +После запуска службы проверим ее состояние: + + `sudo systemctl status vsftpd` + +В выводе отобразится текущий статус службы VSFTPD. Если она запущена корректно, мы увидим сообщение, что VSFTPD активен и работает (Active: active (running)). + +Пример вывода sudo systemctl status vsftpd: + + `● vsftpd.service - vsftpd FTP server Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2024-06-23 14:35:26 UTC; 2h 15min ago Main PID: 12345 (vsftpd) Tasks: 1 (limit: 4915) Memory: 1.3M CGroup: /system.slice/vsftpd.service └─12345 /usr/sbin/vsftpd /etc/vsftpd.conf` + +### Настройка файрвола для FTP + +Если на сервере включен файрвол, следует открыть порты для FTP, чтобы обеспечить доступ к серверу. + +В примере используем UFW (Uncomplicated Firewall). Команды далее могут отличаться в зависимости от вашего брандмауэра. + + +1. По умолчанию FTP использует порты 20 и 21 (TCP-трафик), а также диапазон 30000-31000 (пассивный режим FTP). Чтобы открыть их, выполним команды: + + `sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 30000:31000/tcp` + +2. Перезапустим файрвол для применения изменений: + + `sudo ufw reload` + +3. Убедимся, что правила файрвола применены корректно: + + `sudo ufw status` + +Пример вывода sudo ufw status: + + `Status: active To Action From -- ------ ---- 20/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere 30000:31000/tcp ALLOW Anywhere 22/tcp ALLOW Anywhere` + +## Настройка FTP-сервера в Ubuntu + +### Основная настройка + +Конфигурационный файл VSFTPD находится в директории /etc/vsftpd.conf. Чтобы его отредактировать, можно воспользоваться любым текстовым редактором, например nano: + + `sudo nano /etc/vsftpd.conf` + +Для обеспечения безопасности и эффективности работы сервера изменим конфигурационный файл VSFTPD в соответствии с настройками. + +1. Отключим анонимный доступ, заменив значение параметра anonymous_enable на NO: + + `anonymous_enable=NO` + +2. Для разрешения входа на сервер локальным пользователям установим значение параметра local_enable на YES: + + `local_enable=YES` + +3. Разрешим команды записи. Чтобы пользователи могли загружать файлы на сервер, установим значение параметра write_enable на YES: + + `write_enable=YES` + +4. Настроим права доступа для новых файлов, создаваемых пользователями. Их автоматическое назначение осуществляется с помощью параметра local_umask. Значение 022 позволяет владельцу файла записывать, читать и выполнять, а всем остальным — читать и выполнять: + + `local_umask=022` + +Набор прав состоит из трех цифр: + +- первая — права владельца, +- вторая — права группы владельца, +- третья — права остальных пользователей. + +Каждая из них может принимать значения: + +- 0 — нет прав; +- 1 — выполнение; +- 2 — запись; +- 3 — запись и выполнение; +- 4 — чтение; +- 5 — чтение и выполнение; +- 6 — чтение и запись; +- 7 — чтение, запись и выполнение. + +Новые файлы и директории будут создаваться с правами, которые исходят из полного набора (777) за вычетом значений local_umask. Например, маска 022 означает набор прав 755. + +5. Включим отображение приветственных сообщений при входе в директории: + + `dirmessage_enable=YES` + +Для настройки текста сообщений следует перейти в интересующую директорию и создать в ней файл .message. Когда пользователь будет переходить в данную директорию, он будет получать сообщение, текст которого указан в файле. + +6. Для корректной работы файрвола установим использование порта 20 для передачи данных: + + `connect_from_port_20=YES` + +7. Чтобы ограничить пользователей их домашними директориями, установим значение параметра chroot_local_user на YES: + + `chroot_local_user=YES allow_writeable_chroot=YES` + +Параметр allow_writeable_chroot используется, чтобы разрешить запись в домашнюю директорию пользователя при использовании chroot_local_user=YES. + +8. Зададим корневую директорию для каждого пользователя: + + `user_sub_token=$USER local_root=/home/$USER/ftp` + +9. После внесения всех изменений сохраним файл (**Ctrl+O** в nano), закроем редактор (**Ctrl+X** в nano) и перезапустим службу VSFTPD для применения изменений: + + `sudo systemctl restart vsftpd` + +### Тестирование VSFTPD + +1. Проверим корректность применения настроек. Для начала создадим тестового пользователя: + + `sudo adduser testuser sudo passwd testuser` + +2. Создадим необходимые директории и настроим на них права: + + `sudo mkdir -p /home/testuser/ftp/upload sudo chown nobody:nogroup /home/testuser/ftp sudo chmod a-w /home/testuser/ftp sudo chown -R testuser:testuser /home/testuser/ftp/upload` + +3. Добавим пользователя в список пользователей VSFTPD: + + `echo "testuser" | sudo tee -a /etc/vsftpd.userlist` + +4. Подключимся к серверу с учетными данными тестового пользователя и убедимся в возможности загружать файлы в директорию /upload. Можно использовать любой FTP-клиент, в рамках инструкции будем пользоваться FileZilla. + +### Настройка часового пояса + +Чтобы сервер использовал локальное время, откроем конфигурационный файл VSFTPD и установим параметр use_localtime на YES: + + `use_localtime=YES` + +### Настройка логов + +Для настройки логирования перейдем в конфигурационный файл VSFTPD и включим логирование всех FTP-транзакций: + + `xferlog_enable=YES xferlog_std_format=YES` + +Параметр xferlog_std_format позволяет использовать стандартный формат логов. + +Также следует указать корректный путь к файлу логов (обычно /var/log/vsftpd.log): + + `xferlog_file=/var/log/vsftpd.log` + +### Настройка PAM-сервиса + +PAM (Pluggable Authentication Modules) — это система аутентификации, используемая в UNIX-подобных ОС, включая Linux. PAM позволяет администраторам настраивать политику аутентификации для различных приложений и служб. Для этого используется набор модулей, которые могут быть включены и настроены по мере необходимости.  + +Для использования PAM необходимо предварительно включить его в файле /etc/vsftpd.conf. + +1. Откроем файл /etc/vsftpd.conf: + + `sudo nano /etc/vsftpd.conf` + +2. Отредактируем строку pam_service_name: + + `pam_service_name=vsftpd` + +Для дальнейшей настройки сервиса PAM в VSFTPD следует внести изменения в файл /etc/pam.d/vsftpd. Внутри него — инструкции, которые PAM использует для управления аутентификацией пользователей при подключении к FTP-серверу.  + +3. Откроем файл конфигурации PAM для VSFTPD: + + `sudo nano /etc/pam.d/vsftpd` + +4. Настроим параметры аутентификации в соответствии со списком: + + `auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed auth required pam_shells.so auth include common-auth account include common-account session include common-session` + +- auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed — отказывает в доступе пользователям из файла /etc/vsftpd.ftpusers. +- auth required pam_shells.so — проверяет, что оболочка пользователя разрешена. +- auth include common-auth — включает общие правила аутентификации. +- account include common-account — включает общие правила управления учетными записями. +- session include common-session — включает общие правила управления сеансами. + +5. Создадим файл списка пользователей: + + `sudo nano /etc/vsftpd.ftpusers` + +Добавим имена пользователей, которым следует запретить доступ (по одному на строку). + +6. Перезапустим службу VSFTPD: + + `sudo systemctl restart vsftpd` + +## Создание пользователей + +### Создание + +Для создания нового пользователя на сервере выполним команду: + + `sudo adduser ftpuser` + +Далее следует ввести пароль для нового пользователя и несколько дополнительных данных (имя, номер телефона и прочее). Можно оставить эти поля пустыми, нажав **Enter**. + +Для назначения или изменения пароля пользователя нужно выполнить команду sudo passwd ftpuser, ввести новый пароль и подтвердить его. + +### Настройка домашних папок + +1. Создадим домашнюю папку пользователя: + + `sudo mkdir -p /home/ftpuser/ftp` + +2. Домашний каталог пользователя должен быть защищен от записи, чтобы соблюсти требования безопасности VSFTPD: + + `sudo chown nobody:nogroup /home/ftpuser/ftp sudo chmod a-w /home/ftpuser/ftp` + +3. Далее создадим папку, в которую пользователь сможет загружать файлы, и настроим права доступа: + + `sudo mkdir -p /home/ftpuser/ftp/upload sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp/upload sudo chmod -R 0755 /home/ftpuser/ftp/upload` + +### Настройка анонимного или только авторизованного доступа + +VSFTPD поддерживает доступ как анонимных, так и авторизованных пользователей. Для настройки политики следует внести изменения в конфигурационный файл. + +#### Анонимный доступ + +Если нам нужно разрешить анонимный доступ к FTP-серверу, следует указать для параметра anonymous_enable значение YES в конфигурационном файле /etc/vsftpd.conf: + + `anonymous_enable=YES` + +#### Авторизованный доступ + +Чтобы разрешить доступ к FTP-серверу авторизованным пользователям, укажем для параметра local_enable значение YES: + + `local_enable=YES` + +### Разрешение / запрет доступа по SSH + +Все настройки доступа к серверу по SSH находятся в конфигурационном файле /etc/ssh/sshd_config. В нем описываются разрешающие и запрещающие правила. + +Для разрешения или запрета доступа к серверу по SSH группе пользователей следует указать в конфигурационном файле одну из следующих строк соответственно: + + `AllowGroups ftpusers` + + `DenyGroups ftpusers` + +Чтобы разрешить или запретить доступ для отдельных пользователей, следует использовать следующие параметры: + + `AllowUsers ftpuser` + + `DenyUsers ftpuser` + +Группа ftpusers и пользователь ftpuser указаны в качестве примера. + +Для применения новых правил перезапустим службу SSH: + + `sudo systemctl restart ssh` + +Порядок правил, указанных в конфигурационном файле SSH, имеет важное значение в определении политики доступа пользователя. Например, первым указано правило, запрещающее пользователям группы ftpusers доступ по SSH, а затем указано правило, разрешающее доступ пользователю ftpuser1 (входящему в группу ftpusers).  + +В таком случае у пользователя ftpuser1 будет доступ к серверу по SSH. При установке этих правил в обратном порядке, пользователь ftpuser1 не получит доступ по SSH. + +## Настройка SSL/TLS + +Обеспечение безопасности FTP-соединений может обеспечить [SSL/TLS-протокол](https://selectel.ru/blog/what-is-ssl/).   + +1. Создадим директорию,  в которой будут храниться SSL-сертификаты и ключи: + + `sudo mkdir /etc/ssl/private` + +2. Создадим самоподписанный сертификат: + + `sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem` + +Ключ будет действителен в течение 10 лет. + +В процессе генерации будет предложено ввести информацию о сертификате: страну, город, организацию и т. д. Можно оставить некоторые поля пустыми, нажав **Enter**. + +3. Для использования созданного сертификата откроем конфигурационный файл VSFTPD: + + `sudo nano /etc/vsftpd.conf` + +4. Внесем в него изменения в соответствии со следующим списком: + + `rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.key ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH` + +- rsa_cert_file и rsa_private_key_file — указывают путь к сертификату и приватному ключу. +- ssl_enable=YES — включает SSL. +- allow_anon_ssl=NO — запрещает анонимный доступ через SSL. +- force_local_data_ssl=YES и force_local_logins_ssl=YES — требуют использование SSL для всех данных и логинов локальных пользователей. +- ssl_tlsv1=YES, ssl_sslv2=NO, ssl_sslv3=NO — включают TLSv1 и отключают устаревшие SSLv2 и SSLv3. +- require_ssl_reuse=NO — отключает требование повторного использования SSL-сессий. +- ssl_ciphers=HIGH — устанавливает использование только сильных шифров. + +5. После внесения изменений сохраним файл и перезапустим службу VSFTPD: + + `sudo systemctl restart vsftpd` + +При установке SSL/TLS-сертификатов подключение через FTP-клиенты осуществляется стандартным путем. + +## Проверка подключения к серверу через FTP-клиент + +Теперь FTP-сервер настроен и готов принимать безопасные соединения от клиентов. + +Популярные программы, позволяющие подключаться к FTP-серверам, — FileZilla, WinSCP, FAR Manager, Total Commander, Midnight Commander и Cyberduck. Далее будем использовать наиболее известный кроссплатформенный FTP-клиент — FileZilla. + +Для его установки в Ubuntu выполним команду: + + `sudo apt-get install filezilla` + +Для подключения к FTP-серверу следует заполнить поля **Хост** (IP-адрес сервера), **Имя пользователя**, **Пароль** и нажать на кнопку **Быстрое соединение**. После подключения к FTP-серверу в правой части окна появится список директорий, доступных для данного пользователя. \ No newline at end of file diff --git a/LINUX/WIREGUARD.md b/LINUX/WIREGUARD.md new file mode 100644 index 0000000..14a8597 --- /dev/null +++ b/LINUX/WIREGUARD.md @@ -0,0 +1,170 @@ +***На сервере: + +```bash +sudo su +apt update && apt upgrade -y +apt install -y wireguard + +cd /etc/wireguard + +wg genkey | tee privatekey | wg pubkey | tee publickey + +chmod 600 privatekey +cat privatekey +``` + +**Редактируем/создаем: vim wg0.conf** +```sh +# - заменить на свой !!! +[Interface] +PrivateKey = +Address = 10.0.0.1/24 +ListenPort = 51830 +PostUp = iptables -A FORWARD -i %i(wg0) -j ACCEPT; iptables -t nat -A POSTROUTING -o -j MASQUERADE +PostDown = iptables -D FORWARD -i %i(wg0) -j ACCEPT; iptables -t nat -D POSTROUTING -o -j MASQUERADE + +[Peer] +# user_1 Publickey +Publickey = +AllowedIPs = 10.0.0.2/32 + +[Peer] +# user_2 Publickey** +Publickey = +AllowedIPs = 10.0.0.3/32 + +[Peer] +# user_3 Publickey +Publickey = +AllowedIPs = 10.0.0.4/32 +``` + +```sh +echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf +sysctl -p + +net.ipv4.ip_forward=1 + +systemctl enable wg-quick@wg0.service + +>Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick.service + +systemctl start wg-quick@wg0.service +systemctl status wg-quick@wg0.service + +systemctl restart wg-quick@wg0.service +systemctl status wg-quick@wg0.service + +systemctl daemon-reload + +sudo wg show + +#################################### +# ОБЯЗАТЕЛЬНО ПРОВЕРЯЙТЕ ФАЕРВОЛ !!! +sudo ufw status +sudo ufw allowed http +sudo ufw allowed https +#################################### +``` +===================================== +***Генерация ключей клиента: + +`wg genkey | tee /etc/wireguard/_key/win_home_priv | wg pubkey | tee /etc/wireguard/win_home_pub` + + +***На компьютере-клиенте: +```sh +sudo apt install wireguard resolvconf -y +vim Documents/new_wg.conf +``` + +***Конфигурация клиента: + vim wg0.conf +```bash +[Interface] +PrivateKey = +Address = 10.10.10.2/32 +DNS = 8.8.8.8,77.88.8.8 + +[Peer] +PublicKey = +Endpoint = :51830 +AllowedIPs = 0.0.0.0/0 # (весь трафик через WireGuard) >>> 10.10.10.0/24 +PersistentKeepalive = 20 +``` + +```sh +systemctl enable wg-quick@wg0 +systemctl start wg-quick@wg0.service +systemctl restart wg-quick@wg0.service +systemctl status wg-quick@wg0.service + +systemctl daemon-reload + +curl ifconfig.me + +sudo wg show + +``` +===================================== +***GUI для Wireguard: +``` +wget https://github.com/UnnoTed/wireguird/releases/download/v1.0.0/wireguird_amd64.deb +sudo dpkg -i ./wireguird_amd64.deb + + +nm-connection-editor +nmcli + +wg-quick up wg0-client +wg-quick down wg0-client +``` +===================================== +### Настройка VPN с WireGuard и LDAP за пару шагов  + +Представь, как удобно: ты настраиваешь VPN, а доступ автоматически контролируется через LDAP. Никакого хаоса с ключами, всё централизовано. Вот как это сделать, чтобы всё работало чётко. + +### **1. Настраиваем WireGuard**   + +Сначала давай поднимем сам VPN:   +1. Устанавливаешь WireGuard:   +   `sudo apt install wireguard + +2. Генерируешь ключи: +   `wg genkey | tee privatekey | wg pubkey > publickey + +3. Делаешь конфиг /etc/wireguard/wg0.conf: +   ```sh +[Interface] +   PrivateKey = <твой_приватный_ключ> +   Address = 10.0.0.1/24 +   ListenPort = 51820 + +   [Peer] +   PublicKey = <публичный_ключ_клиента> +   AllowedIPs = 10.0.0.2/32 +   ``` + +4. Включаешь VPN: +   `sudo wg-quick up wg0 + +Теперь у тебя рабочий VPN, но это только начало. + +--- +### **2. Подключаем LDAP**   + +Теперь сделаем так, чтобы только проверенные пользователи могли подключаться:   + +1. Установи LDAP-клиент:   +   `sudo apt install ldap-utils + +2. Проверяешь связь с сервером: +   `ldapsearch -x -H ldap:// -D "cn=admin,dc=example,dc=com" -W + +3. Подключаешь проверку пользователей через LDAP. Например, перед выдачей ключей скрипт проверяет, есть ли юзер в базе:   +   `ldapsearch -x -b "dc=example,dc=com" "uid=<имя_пользователя>" + +4. Для автоматизации можно настроить генерацию конфигов и ключей через API или свои скрипты.   +### **Почему это круто?**   + +Тебе больше не нужно вручную раздавать доступы или следить за кучей ключей. Всё централизовано: добавил юзера в LDAP — он тут же получил доступ к VPN. Удобно, чисто, профессионально. \ No newline at end of file diff --git a/LINUX/WORDPRESS.md b/LINUX/WORDPRESS.md new file mode 100644 index 0000000..68cfc81 --- /dev/null +++ b/LINUX/WORDPRESS.md @@ -0,0 +1,471 @@ +## Установка WordPress: техническая часть + +### Проверим пользователя + +Убедимся, что мы находимся в нужной папке (директории) и не под пользователем root: + +``` +serveruser@ИМЯСЕРВЕРА:/root$ +``` + +Если у Вас как на примере выше (вместо serveruser может быть другой пользователь, главное, чтобы не root), то все хорошо. А если у Вас так: + +``` +root@ИМЯСЕРВЕРА:~# +``` + +То выполите инструкции по созданию нового пользователя из этой статьи: [Установка Nginx, MySQL 8, PHP8.1-FPM на Ubuntu 22.04 LTS с нуля](https://dnevnik.dev/2022/07/11/ustanovka-nginx-mysql-8-php8-1-fpm-na-ubuntu-22-04-lts-s-nulya/). + +### Скачаем WordPress + +Перейдем в нужный каталог, введем: + +``` +cd /var/www/ +``` + +Затем, нужно создать каталог для нашего будущего сайта (у меня НАЗВАНИЕ_САЙТА это dnevnik): + +``` +sudo mkdir НАЗВАНИЕ_САЙТА +sudo chown -R www-data:www-data НАЗВАНИЕ_САЙТА +sudo find /var/www/НАЗВАНИЕ_САЙТА/ -type d -exec chmod 750 {} \; +sudo find /var/www/НАЗВАНИЕ_САЙТА/ -type f -exec chmod 640 {} \; +``` + +Если нужно проверить, свободно ли выбранное Вами название сайта, то сделать это можно здесь: [https://reg.ru](https://www.reg.ru/domain/new/?rlink=reflink-10793423). + +Переместимся в созданный каталог, и скачаем WordPress: + +``` +cd НАЗВАНИЕ_САЙТА +sudo -u www-data wget https://wordpress.org/latest.tar.gz +``` + +Распакуем архив: + +``` +sudo -u www-data tar -xzvf latest.tar.gz +``` + +И удалим его: + +``` +sudo -u www-data rm latest.tar.gz +``` + +Затем переместим содержимое папки wordpress в родительскую для ее директорию: + +``` +sudo -u www-data mv wordpress/* . +``` + +И удалим папку wordpress: + +``` +sudo -u www-data rm -R wordpress +``` + +### Создадим базу данных в MySQL + +Войдем в командную строку MySQL: + +``` +sudo mysql +``` + +Создадим новую базу данных: + +``` +CREATE DATABASE НАЗВАНИЕ_САЙТА; +``` + +Создадим нового пользователя: + +``` +CREATE USER 'НАЗВАНИЕ_САЙТА'@'localhost' IDENTIFIED BY 'aef@234R345t2iJhfvar'; +``` + +«aef@234R345t2iJhfvar» — это пароль пользователя НАЗВАНИЕ_САЙТА. + +Дадим пользователю НАЗВАНИЕ_САЙТА права на базу данных НАЗВАНИЕ_САЙТА: + +``` +GRANT ALL ON НАЗВАНИЕ_САЙТА.* TO 'НАЗВАНИЕ_САЙТА'@'localhost'; +``` + +Выйдем из командной строки MySQL: + +``` +exit +``` + +Теперь давайте войдем в командную строку MySQL под новым MySQL-пользователем: + +``` +mysql -u НАЗВАНИЕ_САЙТА -p +``` + +Вас попросят ввести пароль, введите его. Если Вы не меняли его в примере выше, то он будет такой: + +``` +aef@234R345t2iJhfvar +``` + +Вот мы и вошли под новым пользователем. Посмотрим, какие базы данных ему видны, введем: + +``` +SHOW DATABASES; +``` + +Результат будет такой: + +``` ++---------------------------+ +| Database | ++---------------------------+ +| information_schema | +| НАЗВАНИЕ_САЙТА | ++---------------------------+ +2 rows in set (0.06 sec) +``` + +Видим нашу базу НАЗВАНИЕ_САЙТА, отлично, выйдем из командной строки MySQL: + +``` +exit +``` + +Давайте двигаться дальше, настроим Nginx. + +### Настроим Nginx + +Тут нужно сказать, что я буду иметь в виду под «НАЗВАНИЕ_САЙТА», «НАЗВАНИЕ_САЙТА.ДОМЕН» и «www.НАЗВАНИЕ_САЙТА.ДОМЕН». + +На примере моего сайта это будет так: + +НАЗВАНИЕ_САЙТА = dnevnik +НАЗВАНИЕ_САЙТА.ДОМЕН = dnevnik.dev +www.НАЗВАНИЕ_САЙТА.ДОМЕН = www.dnevnik.dev + +Если Вам нужен домен, советую приобретать его здесь: [https://reg.ru](https://www.reg.ru/domain/new/?rlink=reflink-10793423). К примеру, домен этого сайта (dnevnik.dev) зарегистрирован именно там. + +Создадим новый конфигурационный файл для Nginx, для этого введем: + +``` +sudo vim /etc/nginx/sites-available/НАЗВАНИЕ_САЙТА +``` + +Команда выше создаст новый пустой файл. Вставим в него содержимое: + +``` +server { + listen 80; + server_name НАЗВАНИЕ_САЙТА.ДОМЕН www.НАЗВАНИЕ_САЙТА.ДОМЕН; + root /var/www/НАЗВАНИЕ_САЙТА; + + index index.html index.htm index.php; + + location / { + try_files $uri $uri/ /index.php$is_args$args; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; + } + + location ~ /\.ht { + deny all; + } +} +``` + +И для сохранения файла, нажмите «:wq», а затем Enter. Файл сохранен. + +Активируем конфигурацию этой командой: + +``` +sudo ln -s /etc/nginx/sites-available/НАЗВАНИЕ_САЙТА /etc/nginx/sites-enabled/ +``` + +Перезапустим Nginx, чтобы изменения вступили в силу: + +``` +sudo systemctl reload nginx +``` +======================================== +Сначала вы проверяете, что порт 80 уже работает, + +``` +sudo netstat -plunt | grep 80 + +tcp6 0 0 :::80 :::* LISTEN 1573456/apache2 +``` + +Если он запущен, то отключите apache: + +``` +sudo service apache2 stop +``` + +Теперь запустите Nginx: + +``` +sudo service nginx start +``` +======================================== + +Теперь нужно настроить WordPress. + +### Настроим WordPress + +Переместимся в директорию сайта: + +``` +cd /var/www/НАЗВАНИЕ_САЙТА +``` + +Переименуем файл wp-config-sample.php: + +``` +sudo -u www-data mv wp-config-sample.php wp-config.php +``` + +И откроем его для редактирования: + +``` +sudo -u www-data vim wp-config.php +``` + +Увидим что-то вроде этого: + +``` + +Теперь можно выполнять различные операции над файлами. Чтобы узнать, какие +команды доступны, введите директиву help или знак вопроса (?). Команды, кото­ +рые вы увидите, очень похожи на команды FTP (более подробно с FTP мы позна­ +комимся в главе 10, см. также приложение /). Для отключения от ресурса необхо­ +димо выполнить команду exit. + +#========================================== +### Настройка sendmail + +Основной конфигурационный файл, который вам понадобится, — `/etc/sendmail.cf` или +`/etc/mail/sendmail cf`. Если файла не существует, то, скорей всего, sendmail не установ­ +лен, что случается в установке дистрибутива по умолчанию. Устанавливаем: +`sudo apt-get install sendmail +После установки сразу же должна начаться автоматическая настройка. Если и по­ +сле этого файла конфигурации не оказалось в системе, то выполните эту команду: +sudo sendmaiIconfig +Программа начальной настройки запросит пути к конфигурационным файлам* Со­ +гласитесь со значениями по умолчанию, но обратите внимание, какие пути у вас +спрашивают. В последнем релизе дистрибутива Ubuntu версия sendmail предлагает +использовать путь /etc/mail/ для всех файлов. +Сервер sendmail имеет плохую репутацию в связи со сложностью его настройки. +Действительно, стоит лишь взглянуть на размер файла sendmail.cf, и становится жут­ +ко — это 32 килобайта (более 1000 строк). А если заглянуть внутрь файла, то станет +еще страшнее от непонятных ключей и директив. +В файле конфигурации sendmail все параметры сгруппированы по разделам. Раз­ +биение оформляется в виде следующих строк: +```sh +################## +# Local info # +################## +``` +Столь «красивое» оформление означает, что далее следует раздел Local info. По­ +добных секций несколько — в частности, обычно присутствуют такие: +□ Local info — локальная информация, основные сведения о сервере и домене; +□ options — настройки работы программы sendmail; +□ Message precedences — приоритеты сообщений; +□ Trusted users — доверенные пользователи; +□ Format of headers — форматы Заголовков. +Рассмотреть все настройки в этой книге невозможно — в моей системе этот конфи­ +гурационный файл занимает 50 Кбайт. Если расписывать каждый параметр, понадо­ +бится отдельное издание. Наша цель— эффективность и безопасность, поэтому +рассмотрим только те настройки, которые касаются этих вопросов, и испытаем +sendmail в действии. +Для упрощения конфигурирования sendmail в последних версиях этого почтового +сервиса используется новый файл — sendmail.mс (МС означает Minimal Configuration или +минимальная конфигурация), который можно найти в каталоге /etc/mail. +```sh +divert(-1) +dnl This is the sendmail macro config file. If you make changes to this +dnl file, you need the sendmail-cf rpm installed and then have to +dnl generate a new /etc/sendmail.cf by running the following command: +dnl Это файл макроконфигурации sendmail. Если вы делаете изменения в этом +dnl файле, вам нужна инсталляция rpm sendmail-cf, с помощью которой можно +dnl сгенерировать новый /etc/sendmail.cf, запустив команду: +dnl +dnl +m4 /etc/mail/sendmail.me > /etc/sendmail.cf +dnl +include('/usr/share/sendmail-cf/m4/cf .m4’) +VERSIONID('linux setup for ASPLinux’)dnl +OSTYPE('linux') +dnl Uncomment and edit the following line if your mail needs to be +dnl sent out through an external mail server: +dnl Раскомментируйте следующую строку, если вам нужно посылать почту +dnl через внешний почтовый сервер: +dnl define('SMART_HOST','smtp.your.provider') +define('confDEF_USER_ID',''8:12'')dnl +undefine('UUCP_RELAY')dnl +undefine('BITNET_RELAY')dnl +``` +Файл sendmail.me имеет более простой формат по сравнению со старым sendmail.cf, +благодаря чему уменьшается вероятность допустить ошибку при его конфигуриро­ +вании. После внесения изменений его необходимо скомпилировать (перевести файл +sendmail.mс в формат sendmail.cf) специальной командой, в результате чего получает­ +ся файл /etc/sendmail.cf. +Мы в основном будем рассматривать параметры, которые нужно устанавливать +в файле sendmail.cf, а если описывается параметр файла sendmail.mс, я буду явно ука­зывать на это. +Иногда при неправильных настройках загрузка Linux может зависать при старте +сервиса sendmail. Это происходит из-за того, что ваш почтовый сервер не может +определить имя компьютера. Откройте файл /etc/hosts. В нем чаще всего будет в на­личии только одна строка: +127.0.0.1 localhost.localdomain localhost + +Подробно с этим файлом мы познакомимся в главе 77, когда станем рассматривать +DNS. Сейчас нам надо знать, что эта строка описывает IP-адрес 127.0.0.1, который +соответствует имени localhost. В любой системе такие адрес и имя указывают на +вашу локальную машину. Когда в сетевых программах вы указываете localhost, то +это имя преобразуется в IP-адрес 127.0.0.1. +Настройка DNS может быть очень важна для правильной отправки почты. Допус­тим, что у меня есть домен www.flenov.ru. Этот домен может загружать веб-сайт, а +может отправлять почту, если послать что-либо на почтовый ящик info@flenov.ru +(в реальности такой ящик не существует). В обоих 'случаях домен один и тот же, но +веб-сервер и почтовый сервер могут находиться на разных серверах с разными IP. +Настройка DNS позволяет указать, какой IP-адрес у веб-сервера и какой адрес +у почтового. +Для почтового сервера нужно будет в настройки DNS добавить следующие строки: +IN MX 10 mx.flenov.ru. +mx.flenov.ru. IN АААА 1р_адрес_в_формате^6 +mx.flenov.ru. IN А 1р_адрес_в_формате^4 +Домен Fienov.ru поменяйте здесь на свой, и точка после него не случайна. +Ну и домен этот должен быть прописан в host-файле: +127.0.0.1 flenov.ru +Пока мы с DNS еще не знакомы, поэтому в sendmail можно для тестов использовать +имя компьютера, которое вы указали во время установки ОС Linux. Выполните +команду hostname, чтобы это имя узнать. В моем случае это FienovM. Но на деле все +сетевые обращения происходят не по имени, а по IP-адресу, и если sendmail не мо­жет определить адрес по имени FienovM, происходит зависание. Чтобы исправить +эту ситуацию, добавьте в файл /etc/hosts строку вида: +192.168.77.1 FlenovM +FlenovM +Не забудьте только заменить приведенный здесь параметр FienovM на имя вашего +компьютера и, разумеется, указать свой IP-адрес. После этого программу sendmail +можно помещать в автозапуск, и она будет работать великолепно даже с настрой­ +ками по умолчанию. +Для каждого пользователя системы автоматически создается почтовый ящик, и ес­ +ли сервис sendmail запущен, то им уже можно пользоваться. Все почтовые ящики +хранятся в каталоге /var/spool/mail/. Их имена соответствуют именам пользователей. +Так, для учетной записи root ящик будет расположен в файле /var/spool/mail/root. +Для работы с почтой нам нужен почтовый клиент, который будет отправлять пись­ +ма серверу и принимать от него новые сообщения. Таких программ существует +множество, и в некоторых дистрибутивах Linux предлагается аж семь различных +клиентов. Какой выберете вы, зависит только от личных предпочтений. +В общем-то можно обойтись и без клиента, а соединение с сервером осуществлять +напрямую через сервис Telnet, благо команды SMTP достаточно просты и ими легко пользоваться. В этом случае для отправки почты нужно подключиться к пор­ту 25 (порт SMTP), а для получения — к 110 (порт POP3). +#### Полезные команды +Давайте рассмотрим некоторые команды, которые помогут вам в администрирова­ +нии sendmail-сервера: +□ hoststat— показать состояние хостов, которые недавно работали с локальным +почтовым сервером. Команда является эквивалентом sendmail -bh, которая по +умолчанию неактивна; +□ mailq — отобразить краткую информацию о сообщениях в очереди, ожидающих +обработки. Пример результата выполнения команды: + +/var/spool/mqueue (1 request) +--- Q-ID----—Size—------Q-Time----- ---- Sender/Recipient----- +jOIAnST11838 6 Tue Jan 18 13:49 +(host map: lookup (flenovm.ru): deferred) + + +Из первой строки видно, что в очереди находится одно сообщение. Вторая стро­ка включает дату посылки и адрес отправителя: fienov@fienovm.ru. В последней +строке отображается получатель сообщения: root@f lenovm. ru; +□ mailstats — отобразить статистику сообщений и количества байтов; +□ sendmail — запустить сервер sendmail. Используя эту команду с различными +ключами, можно увидеть достаточно много полезной информации. За более +подробной справкой следует обратиться к документации: man sendmail. +#### Только отправка почты +Очень часто почтовые сервисы используют только для отправки почты. Например, +на веб-серверах sendmail может стоять лишь для того, чтобы можно было отослать +письмо прямо из сценариев на Perl или РНР. Если ваш сервер не должен принимать +писем, то необходимо запретить режим приема. Для этого откройте файл /etc/ +sysconfig/sendmail и измените его содержимое: +DEAMON=yes +QUEUE=”qlh” +Вторая строка задает параметры, которые будут передаваться программе sendmail +при запуске. Чтобы возобновить прием почты, измените значение qih на ьа. +Если у вас нет файла /etc/sysconfig/sendmail (он используется не во всех дистрибути­ +вах), то придется редактировать сценарий /etc/rc.d/init.d/sendmail. Найдите в этом фай­ +ле параметры, которые передаются программе, и измените их на qih прямо в тексте +сценария. + +Для защиты сервера от DoS-атак со стороны хакера нам помогут следующие пара­ +метры сервиса sendmail: +□ MaxDeamonChiidren— ограничение количества одновременно запущенных про­ +цессов. С помощью этого параметра мы можем защитить ресурсы сервера (про­ +цессор) от излишней перегрузки. По умолчанию установлено значение 12, но +для мощного компьютера его можно повысить, чтобы эффективнее использо­ +вать процессор, а для слабого — уменьшить; +□ connectionRateThrottie— максимальное количество открываемых соединений +в секунду. По умолчанию этот параметр равен 3, и повышать его без особой на­ +добности не стоит, разве что вы уверены в производительности сервера. + +#========================================== +### Локальный файл hosts + +Мы уже знаем, что изначально для сопоставления имен и адресов использовался +файл /etc/hosts. Это текстовый файл с записями типа: +127.0.0.1 localhost.localdomain localhost +192.168.77.1 FlenovM +Каждая строка — это соответствие IP-адреса его имени. По умолчанию в файле +будет всего две строки, как в приведенном примере. Первая строка — это «пет­ +ля». Напоминаю, что во всех компьютерах имя localhost и IP-адрес 127.0.0.1 ука­ +зывают на текущую машину. Это значит, что, если нужно выполнить ping, адре­ +совав запросы на локальный компьютер, можно написать: +ping 127.0.0.1 +Во второй записи устанавливается соответствие между IP-адресом, заданным для +вашего сетевого интерфейса, и символьным именем. Здесь моей сетевой карте при­ +своен адрес 192.168.77.1, И ему соответствует ИМЯ FlenovM. Это значит, что при вы­ +полнении команды ping можно указывать или IP-адрес, или имя компьютера. +Следующие две команды идентичны: +ping 192.168.77.1 +ping FlenovM +При выполнении второй команды сначала происходит обращение к файлу /etc/hosts, +который вернёт программе адрес 192.168.77.1 и уже на него направится эхо-запрос. +А что будет использоваться для поиска адреса первым: файл /etc/hosts или DNS-база +данных? Это зависит от настроек ОС. Посмотрим на файл /etc/host.conf. В нем нахо­ +дится строка: +order hosts,bind +Директива order как раз и задает порядок просмотра. В нашем случае на первом +месте находится файл /etc/hosts, и только после этого будет запущена команда bind +для выполнения запроса к DNS-серверу. Что это нам дает? А то, что можно увели­ +чить скорость доступа к основным серверам. Допустим, что вы каждый день посе­ +щаете сайт www.redhat.com. При этом каждый раз происходит запрос к DNS- +серверу, что может приводить к задержке в пару секунд перед началом загрузки +страницы. Чтобы ускорить этот процесс, можно вручную прописать в файле +/etc/hosts следующую запись: +209.132.183.105 +www.redhat.com +Вн и м ан и е! +Адрес 209.132.183.105 действительно соответствует сайту www.redhat.com на мо­ +мент подготовки этого издания книги, но может измениться. +Еслй сайт по каким-либо причинам перестал загружаться, то необходимо удалить +Соответствующую ЗаПИСЬ ИЗ файла hosts И С ПОМОЩЬЮ КОМаНДЫ ping redhat.com +проверить связь с сервером, а заодно и уточнить его адрес. В ответ на эту директи­ +ву на экране обязательно отображается реальный IP-адрес, с которым происходит +обмен эхо-сообщениями. Благо IP-адреса у большинства сайтов изменяются редко, +так что, один раз добавив такую запись в локальный файл /etc/hosts, можно сэконо­ +мить достаточно много времени и нервов в случае проблем с DNS-сервером, пото­ +му что запросов к нему отправляться не будет. +#### Внешние DNS-серверы +Если в локальном файле /etc/hosts не найдено записи о нужном имени, то компьютер +должен запросить эту информацию у DNS-сервера. Для этого нужно знать IP-адрес +этого самого сервера. Как система его узнает? Из файла /etc/resolv.conf, который +должен выглядеть примерно следующим образом: +search' FlenovM +domain domain.name +nameserver 10.1.1.1 +nameserver 10.1.1.2 + +В первой строке находится команда search с параметром (сервер поиска имени хос­ +та). В вашем файле, скорее всего, есть эта запись, и в качестве сервера вписано имя +вашего компьютера. Здесь может быть перечислено несколько серверов, разделен­ +ных пробелами или символами табуляции. Например: +search FienovM MyServer +Поиск на локальном сервере происходит довольно быстро, а вот на удаленных — +может отнять достаточно много времени. +Вторая строка содержит команду domain с параметром. Пользователи иногда любят +задавать имя компьютера без указания домена — например, redhat вместо +redhat. com. Вы должны задать полное имя узла. Чаще всего этот параметр настраи­ +вается в локальных сетях со специфичным именем домена. +Оставшиеся две строки содержат команду nameserv с параметром. Это внешний +DNS-сервер, которому будут направляться запросы. В системе их может быть не­ +сколько (в настоящее время для большинства дистрибутивов не более трех). Они +будут опрашиваться в порядке указания в файле, пока искомый адрес не будет +найден. +В большинстве случаев достаточно и одного сервера, потому что все они работают +рекурсивно. Но я рекомендую указывать два. Бывают случаи, когда один DNS- +сервер выходит из строя, тогда второй спасает положение и вступает в работу. +#### Настройка DNS-сервиса +В настоящее время наиболее распространенным сервисом DNS для Linux является +bind. Для этого сервиса существует программа bindconf, которая имеет графический +интерфейс и проста в использовании. Зайдите в графическую оболочку и в консоли +выполните команду: +bindconf & +Знак & говорит о том, что, запустив программу, консоль не должна дожидаться ее +завершения. Это очень удобно при запуске графических утилит, чтобы они не оста­ +навливали работу консоли. Учтите, что если закрыть окно консоли, то все про­ +граммы, запущенные с ключом &, тоже закроются. +На рис. 11.2 изображено запущенное приложение для настройки DNS-сервиса. +В центре показано окно, которое открывается по нажатию кнопки Добавить. Как +видите, достаточно только выбрать тип зоны и ввести имя домена — и все готово. +Несмотря на наличие простой графической программы, мы рассмотрим конфигура­ +ционные файлы, которые могут использоваться сервисом DNS. Их прямое редакти­ +рование позволит сделать более тонкую настройку, и вы лучше будете понимать +процесс работы DNS. +Настройка DNS-сервера начинается с файла /etc/named.conf. Пример его содержимо­ +го приведен в листинге 11.1. +```sh +options { +directory "/var/named/"; +}; +zone ”." { +type hint; +file "named.ca" ; +}; +zone "sitename.com" { +type mastery­ +file "sitename.zone"; +}; +zone "10.12.190.in-addr.arpa" { +type mastery­ +file "10.12.190.in-addr.arpa.zone"; +}; +``` +В этом примере файл разбит на четыре раздела, каждый из которых имеет следую­ +щий формат: +тип имя { +Параметр1; +Параметр2; +}; +Давайте рассмотрим назначение разделов. Первым идет options: +options { +directory "/vaг/named/"; +}; +В фигурных скобках только один параметр— directory, который указывает на +домашний каталог DNS-сервера. Все его файлы будут располагаться там. +Остальные разделы имеют тип zone и через пробел в кавычках содержат имя зоны. +В каждом из них по два параметра: type (определяет тип зоны) и file (файл, в ко­ +тором содержится описание). +Самая первая зона в нашем примере— zone ".". Что это за зона в виде точки? +Вспомните структуру DNS, которую мы рассматривали в начале главы. В базе дан­ +ных DNS так обозначается корень иерархии. Получается, что раздел описывает +корневую зону. Тип зоны hint, т. е. здесь хранятся лишь ссылки на DNS-cepfeepw. +Поскольку это корневая зона, то и ссылки будут на корневые серверы. +В параметре file указывается имя файла, содержащего все ссылки на корневые +серверы. В системе этого файла может и не быть, потому что информация в нем +подвержена изменениям, и лучше всего получить его последнюю версию с сервера +internic.net. Для этого выполните команду: +dig 0rs.internic.net . ns > named.са +А можно скачать этот файл непосредственно с FTP-сервера internic.net по адресу +ftp://ftp.rs.internic.net/domain/named.root и поместить в каталог /var/named. +Перейдем к следующему разделу zone "sitename.com". Здесь описывается зона +sitename.com. Тип записи master, значит, ваш DNS-сервер будет главным, а все +остальные станут только сверяться с ним и кэшировать информацию. Сведения об +этой зоне будут храниться в файле sitename.zone рабочего каталога. В нашем случае +это: /var/named. +Следующая зона описывает обратное преобразование IP-адресов 190.12.10.* в име­ +на. Тип записи — снова master, и в последней строке указан файл, где будет нахо­диться описание зоны. + +#========================================== +### Журналирование + +В Linux работают одновременно сразу несколько журналов, и по содержащейся +в них информации вы сможете вычислить хакера и увидеть, когда он проник в сис­ +тему, а также узнать еще много интересного. Так как журналирование — один из +инструментов обеспечения безопасности, мы рассмотрим журналы достаточно +подробно. Это позволит вам лучше контролировать свои владения. +#### Основные команды +Информация о текущих пользователях системы сохраняется в файле /var/run/utmp. +Если попытаться посмотреть его содержимое, например, командой cat, то ничего +хорошего нашему взору не откроется. Этот журнал хранит данные не в текстовом, +а бинарном виде, и получение информации из него возможно только с помощью +специализированных программ (команд). +who +Команда who позволяет узнать, кто сейчас зарегистрирован в системе и сколько вре­ +мени он в ней находится. Информация, как уже было отмечено, извлекается из +файла /var/run/utmp. Введите эту команду, и на экране появится список примерно сле­ +дующего вида: +robert , ttyl +Dec 8 10:15 +root +tty2 +Dec 8 11:07 +Из этого списка становится ясно, что пользователь robert работает за первым тер­ +миналом (ttyl) и вошел в систему 8 декабря в 10 часов 15 минут, а через 52 минуты +со второго терминала вошел пользователь root. +Большинство хакеров при входе в систему выполняют эту команду, чтобы выяс­ +нить, есть ли сейчас в системе администратор. Если пользователь root присутству­ +ет, то начинающие хакеры часто уходят, т. к. опасаются, что их знаний не хватит, +чтобы остаться незамеченными. При этом, вероятно, потом они вернутся. +А это еще одна причина, по которой администратор не должен входить в систему +под учетной записью root. Лучше всего работать как простой пользователь, а когда +не хватает прав, то переключаться на привилегированного. На такой случай я создал +учетную запись, для которой установил UID равным нулю. Она позволяет получить +доступ ко всей системе, и при этом имеет имя, отличное от root, и не вызывает по­ +дозрений, когда я под ним работаю. Так что в моей системе никогда нельзя увидеть +пользователя root. +users +Команда users также позволяет вытащить из журнала /var/run/utmp список всех поль­ +зователей, которые сейчас зарегистрированы в системе. +В этом журнале информация хранится временно — только в период присутствия +пользователя. Когда он выходит из системы, соответствующая запись удаляется. +После этого выяснить, кто и когда работал, удастся только из журнала /var/log/wtmp. +Это также бинарный файл, и его содержимое можно увидеть с помощью специали­ +зированных программ. +last +Команда last позволяет выяснить, когда и сколько времени определенный пользо­ +ватель находился в системе. В качестве параметра ей передается интересующее +имя. Например, следующая директива отображает время входа и продолжитель­ +ность нахождения в системе пользователя robert: +last Robert +Выполнив команду, вы увидите на экране примерно следующий текст: +robert +ttyl +Thu Dec 2 12:17 - 12:50 (00:33) +По этой записи можно понять, что robert находился за терминалом (ttyl), зашел +в систему 2 декабря на 33 минуты (с 12:17 до 12:50). Если пользователь работал не +локально, а через сеть, то будет отображена информация о хосте, с которого он +входил в систему. +Если выполнить эту команду для себя, то может вывалиться такой список, что чи­ +тать его будет невозможно, потому что вы довольно часто работаете в системе. +Чтобы ограничить выводимые данные, можно указать ключ -п и количество ото­ +бражаемых строк. Например, следующая команда выдаст информацию о последних +пяти входах: +last -п 5 robert +history +Команда history выводит историю выполненных в консоли команд. Список может +быть достаточно большим. Вы можете ограничить список, указав после имени +команды число. Следующий пример покажет только последние 10 выполненных +в консоли команд: +history 10 +lastlog +Если выполнить команду lastlog, то она выведет на экран перечень всех пользова­ +телей с датами их последнего подключения к системе. Пример результата ее вы­ +полнения можно увидеть в листинге 12.1. +Список состоит из четырех колонок: +“1 имя пользователя из файла/etc/passwd; +□ порт или терминал, на который происходило подключение; +□ адрес компьютера, если вход был по сети; +□ время входа. +С помощью lastlog удобно контролировать системные записи. У них дата послед­ +него входа должна быть **Never logged in**, потому что под ними нельзя войти +в систему (в качестве командных оболочек установлены /bin/false, /dev/null, /sbin/nologin +и др.). Если вы заметили, что кто-либо вошел в систему через одну из этих учетных +записей, то это значит, что хакер использует ее, изменив настройки. +Простая замена командной оболочки в файле /etc/passwd может открыть хакеру +«потайную дверь», и администратор не заметит этой трансформации. Но после +выполнения команды lastlog все неявное становится явным. +Обращайте внимание на тип подключения и адрес. Если что-то вызывает подозре­ +ние, то можно выявить атаку на этапе ее созревания. +Isof +С помощью команды lsof можно определить, какие файлы и какими пользователя­ +ми открыты в текущий момент. Результат ее выполнения приведен в листинге 12.2. +Это далеко не полный результат. Даже если вы сейчас один работаете с системой, +количество открытых файлов может исчисляться парой десятков, и число их замет­ +но растет, если в системе несколько пользователей, — ведь один файл может от­ +крываться несколько раз каждым из них. Это касается в основном системных кон­ +фигурационных файлов. +#### Пользовательские журналы +Все команды, выполненные пользователем, сохраняются в файле .bash_history (если +используется интерпретатор команд /bin/bash), который находится в пользователь­ +ском домашнем каталоге. Когда вы определили, под какой учетной записью в сис­ +теме находился взломщик, его действия можно проследить по этому журналу. +Вы сможете узнать, какие команды или программы выполнялись, и эта информация +подскажет, как злоумышленник проник в систему и что изменил. Если хакер добавил +пользователя или модифицировал какой-либо важный системный файл, то вы это +увидите, сможете вернуть все в исходное состояние и тем самым быстро закрыть +«двери» в системе, которые открыл хакер. + +#========================================== +### Резервирование в Linux + +Самый простой вариант создания резервной копии — использование команды ср +(копирование файлов). Только при копировании необходимо обязательно сохранять +права доступа к файлу. Вот как может выглядеть команда, сохраняющая каталог +/home на примонтированный к системе диск /mnt/resdisk: +ср -a /home /mnt/resdisk +Здесь я использовал ключ -а, который равносилен указанию сразу трех ключей +(-dpR): +□ -d — не следовать по символьным ссылкам. Мы копируем каталог в таком виде, +как он есть; +□ -р — сохранять права доступа к файлу; +□ -R — копировать каталоги рекурсивно, чтобы на архивный диск попали все фай­ +лы и подкаталоги. +Получается, что команда, показанная ранее, идентична следующей: +ср -dpR /home /mnt/resdisk +С помощью этой директивы мы создаем полную копию каталога. А как можно со­ +хранить изменения? Для этого необходимо произвести копирование на тот же диск, +только с указанием ключа -и: +ср -аи /home /mnt/resdisk +При этом будут скопированы все файлы из каталога /home, дата изменения которых +позже, чем у документов из каталога /mnt/resdisk. +#### Утилита tar +Копировать по одному файлу не очень удобно. Лучше, когда все находится под од­ +ной крышей. В Linux есть утилита tar, которая собирает все файлы в один. Этот +процесс называют архивированием, но вы должны учитывать, что tar не сжимает +файлы. Если вы объединяете файлы общим размером в 2 Мбайт, то архив будет +иметь размер чуть больше (размер всех файлов плюс заголовок tar). +Преимущество сборки целого каталога в один файл состоит в том, что им проще +потом управлять и сжимать специализированными программами. +Для архивирования как минимум нужно выполнить команду: +tar cf архив.tar каталог +Здесь у нас два параметра: +П с — указывает на необходимость создания архива; +□ f — назначает архивный файл или устройство. По умолчанию используется уст­ +ройство /dev/rmtO. +Итак, для архивирования каталога /home выполняем следующую команду: +tar cf backup.tar /home +При использовании параметров cf в архиве сохраняется и путь к файлам. Если рас­ +паковать созданный нами архив, то в результате в текущем каталоге будет создан +каталог home, а в нем уже будут располагаться все пользовательские каталоги. На­ +пример, если запустить команду разархивирования в каталоге /home, то каталоги +пользователей окажутся в /home/home, а если находиться в /etc, то пользователи уви­ +дят свои каталоги в /etc/home. +Чтобы добиться правильного результата, нужно перейти в корень диска и выпол­ +нять команду там: +cd / +tar xf /home/backup.tar +Здесь мы из корневого каталога разархивируем резервную копию, которая находит­ +ся в файле /home/backup.tar. +Помимо этого, для архивных операций могут пригодиться следующие ключи ути­ +литы tar: +□ v— вывести на экран информацию об архивируемом (или распаковываемом) +в данный момент файле; +□ z — найти и обработать при распаковке GZIP-архивы; +□ р — разархивировать всю информацию о безопасности; +□ d — найти различия между архивом и файлами системы; +О t — просмотреть содержимое архива; +□ и — обновить файлы в архиве, которые были изменены; +□ n date — добавить в архив только те файлы, которые изменены позже указанной +даты. Параметр date должен быть заменен необходимой датой; +□ р — не удалять первый символ /. В этом случае, в каком каталоге вы ни запусти­ +те разархивирование, файлы попадут на свое родное место. +С помощью утилиты tar можно архивировать сразу несколько каталогов. Следую­ +щая команда помещает в архив каталоги /home и /etc: +tar cf backup.tar /home /etc +Чтобы просмотреть содержимое архива, можно выполнить команду: +tar tvf backup.tar +В ответ на это на экране будут показаны все файлы и каталоги архива, их права +доступа и владельцы. +Посмотрите на последнюю колонку, где показано расположение файла. Обратите +внимание, что путь не начинается с символа /, указывающего на корень диска. По­ +этому такой архив нужно распаковывать в корне, иначе он будет создаваться +в текущем каталоге. +С помощью tar очень удобно и легко создавать резервные копии, которые содержат +только изменения. Для этого мы просто задаем ключ -д и указываем какой-то файл, +который будет использоваться для отслеживания того, какие файлы уже резервиро­ +вались и какая версия уже находится в архиве. +Давайте рассмотрим все это на примере: +tar -cf backupO.tar -g home-flenov.snar /home/flenov +Здесь: +□ c — указывает на необходимость создания архива; +□ f — указывает на то, что мы хотим задать определенное имя файла и это имя +идет сразу после ключа: backupO.tar; +□ g — указывает на то, что нужно копировать только изменения. После этого клю­ +ча надо указать файл, где будут храниться изменения. В качестве его имени я +использую полный путь к нему, просто вместо слэшей указываю символ тире. +Я заметил, что очень часто таким файлам дают расширение snar. Я точно не +знаю, но мне кажется, что это объединение двух слов: sn, которое указывает +на слово snapshot (снимок), и аг, которое указывает на архив tar. Возможно, я тут +не прав, но в любом случае расширение может быть и другим; +□ ну и в конце идет каталог, резервную копию которого вы хотите создать. +Запустите команду: tar создаст полную резервную копию, если файл flenov.snar не +существует. +Теперь попробуйте изменить пару файлов или создать новый и снова выполнить +команду: +tar -cf backupl.tar -g home-flenov.snar /home/flenov +Я увеличил число в имени файла архива с 0 до 1. В этот файл уже попадут только +изменения с момента последней резервной копии. +#### Утилита gzip +В ОС Linux есть достаточно много различных утилит для упаковки данных. Наибо­ +лее популярной из них является gzip. Преимущество архивирования перед простой +упаковкой данных заключается в том, что результирующая копия занимает меньше +места, а значит, носитель для резервирования понадобится меньшего объема. +Чаще всего копируются документы, размер которых в заархивированном виде мо­ +жет уменьшаться на 90%. Текстовые данные сжимаются намного лучше, чем про­ +граммы. +Недостаток архивирования — возрастает нагрузка на процессор, и может потребо­ +ваться больше времени на создание полной копии. Однако за счет того, что архив +занимает намного меньше места, его копирование на сетевые ресурсы или запись +на съемные носители (ZIP, JAZ, CD-R/RW, DVD-R/RW и др.) производится быст­ +рее. В итоге может выйти, что затраты времени на копирование и процессорного +времени на архивирование окажутся идентичны затратам на копирование без архи­ +вирования или даже меньше. +Прежде чем сжимать какой-либо файл, рекомендуется подготовить TAR-архив. По­ +том достаточно выполнить команду упаковки: +gzip -уровень файл.tar +В качестве ключа -уровень нужно указать степень компрессии. Максимальный уро­ +вень равен 9. После этого указывается имя TAR-архива. Давайте сожмем архивный +файл, который мы создали из каталога /home, применяя наибольшую компрессию. +Выполните следующую команду: +gzip -9 backup.tar +Теперь просмотрите содержимое каталога (команда is). Обратите внимание, что +файла backup.tar больше нет. Вместо него появился файл backup.tar.gz, размер кото­ +рого значительно уменьшился. +Чтобы разархивировать такой файл, можно пользоваться все той же командой tar, +только необходимо указать ключи xf z: +cd / +tar xfz /home/backup.tar. gz +Эта команда сначала разархивирует GZ-файл и тут же распакует TAR-архив. +Если необходимо из GZ-файла снова получить TAR-архив (без его распаковки), то +можно выполнить команду: +gzip -d /home/backup.tar.gz +После этого вы снова увидите файл backup.tar, а файл backup.tar.gz исчезнет. +Теперь вы готовы написать свой сценарий, который будет собирать каталоги для +архивирования в TAR-файл, а затем сжимать его, чтобы уменьшить размер. Но +можно не использовать две команды, а обойтись одной. Вот как это делается: +tar cvf - /home | gzip -9с > backup.tar.gz +Здесь мы собираем в TAR-архив каталог /home и тут же сжимаем его утилитой gzip. +Помимо gzip для архивирования иногда используется утилита compress, но ее воз­ +можности по сжатию ниже, и к тому же вокруг нее возникали скандалы и разбира­ +тельства по поводу лицензии. Большинство администраторов уже перешли на ис­ +пользование gzip, и я вам рекомендую с самого начала привыкать к этой программе. +#### Утилита dump +Все предыдущие команды, которые мы рассматривали в этой главе, не являются +специализированными командами резервирования. Это просто команды копирова­ +ния и архивирования файлов. А вот утилита dump предназначена именно для соз­ +дания резервной копии файловой системы Ext (поддерживаются версии, начиная со +второй). +Для выполнения резервной копии нужно как минимум указать: +□ -п — уровень резервной копии, где п может изменяться от о до 9. При значе­ +нии о создается полная резервная копия. Уровни выше о означают формирова­ +ние резервной копии изменений, произошедших с момента последней полной +резервной копии или создания копии с меньшим уровнем; +□ -и— требование при удачном завершении резервирования обновить файл +/etc/dumpdates, в котором хранятся даты создания резервных копий; +□ -f файл— имя файла или устройство, на которое нужно производить резервное +копирование. +Итак, простейшая команда создания полной резервной копии выглядит следующим +образом: +dump -Ou -f /home/backup.bak +Для сохранения изменений нужно изменить уровень, указав значение больше нуле­ +вого, например: +dump — lu -f /home/backup.bak +Для восстановления файлов из архива служит команда restore. Но прежде чем ее +запускать, вы должны убедиться, что находитесь в каталоге, который принадлежит +восстанавливаемой файловой системе. +В команде restore достаточно только указать ключ -f и файл, который нужно вос­ +становить. Если применить ключ -i, то вы попадаете в интерактивный режим, +в котором можно задать файлы для восстановления. Интерактивный режим похож +на режим командной строки, только вместо реальной файловой системы в нем вы +путешествуете по архиву. При этом можно выполнять следующие директивы: +□ help — вывести краткую помощь по доступным командам; +□ is — отобразить содержимое текущего каталога; +□ pwd — показать текущий каталог; +□ add каталог — добавить в список для восстановления указанный в качестве ар­ +гумента каталог; +□ cd — сменить текущий каталог; +□ delete каталог — удалить из списка восстановления каталог, указанный в каче­ +стве параметра; +□ extract — восстановить все файлы из созданного списка; +□ quit — ВЫХОД. + +#========================================== +### CHAGE + +Как заставить пользователя менять пароли через определенные промежутки време­ +ни? Нет, не нужно ходить и нудить ему над ухом — есть способ проще и намного +эффективнее. В Linux имеется утилита chage, которая запускается следующим об­ +разом: +chage параметры пользователь +В качестве параметра можно указывать следующие ключи: +□ -mN— минимальное число дней (n ) д о смены пароля. Указав это значение чуть +меньше, чем максимальный период (см. следующий параметр), вы защитите +систему от нежелательной смены паролей. Это значит, что если хакер захватит +учетную запись, он не сможет изменить пароль. Конечно же, злоумышленник +тоже может выполнить команду chage, но только если у него есть права админи­ +стратора. Три-четыре дня разницы между минимальным и максимальным значе­ +нием необходимы для того, чтобы пользователь смог сменить пароль, пока он не +устарел. Устанавливать разницу меньше трех дней нежелательно, потому что +существуют выходные, и если срок действия попадет на воскресенье, пользо­ +ватель не успеет сменить пароль. По умолчанию используется значение -1, что +соответствует отсутствию проверки; +□ -м N — максимальный диапазон в днях (n ), в течение которого действует пароль. +После этого пароль считается недействительным, и пользователь не сможет вой­ +ти в систему. По умолчанию установлено 99999, что соответствует бесконечно­ +сти, а значит, пароль никогда не устареет; +□ -d N— дата последнего изменения пароля. Параметр N указывает количество +дней начиная с 1 января 1970 года. Если установить юоо, то получится 27 сен­ +тября 1972 года. Чтобы не высчитывать дату в днях, можно указать ее явным +образом в формате ГГГГ-ММ-ДЦ; +□ -Е дата — дата окончания действия пароля; +□ -I N— период в днях, после которого неиспользуемая учетная запись блокиру­ +ется. Рекомендую указать не менее 3 и не более 4 дней, чтобы приостановить +действие записи на время отпуска или болезни работника; +□ -w n — количество дней до окончания срока действия пароля, когда пользовате­ +лю будет выводиться предупредительное сообщение. Нежелательно указывать +менее 3 дней, чтобы не попасть на выходные; +□ -1 пользователь — с этим параметром команда может вызываться любыми поль­ +зователями и позволяет им узнать информацию о времени жизни их пароля. +Чтобы получить сведения о пароле root, выполните директиву: +chage -1 root. +Результат выполнения команды имеет следующий вид: +Password Expires: Never +Password Inactive:Never +Minimum: +-1 +Maximum: +99999 +Warning: +Inactive: +-1 +-1 +Last Change: +Feb 04, 2004 +Account Expires: +Never +Здесь отображаются следующие значения: +• Minimum — минимальный срок действия пароля; +• Maximum— максимальный период для пользования паролем; +• warning— количество дней, за которые будет выдаваться предупреждение +о завершении срока действия пароля; +• inactive— максимальное количество дней, в течение которых учетная за­ +пись может не активироваться; +• Last change — последняя дата изменения; +• Password Expires — дата окончания действия пароля; +• Password inactive — дата, когда пароль стал неактивным; +• Account Expires — дата окончания действия учетной записи. +Чтобы задать максимальное количество дней жизни пароля в 60 дней, выполните +команду: +chage -М 60 robert +Слишком частая смена паролей приводит к тому, что пользователи просто не успе­ +вают запомнить их. Из-за этого сложные комбинации начинают писать на бумаге, +чтобы случайно не забыть, или просто меняют пароль на старый. Ваша задача — +контролировать замену, и в то же время не стоит заставлять пользователя делать +это слишком часто. Период в 2-3 месяца (или 60-90 дней) считается вполне прием­ +лемым. +А как проверить, что выбран достаточно сложный пароль и при этом не указан снова +старый? В этом нам поможет РАМ-модуль pam_cracklib.so, который выполняет +основные проверки и позволяет сделать их сложнее. Например, нельзя будет устано­ +вить старый пароль или воспользоваться большей его частью. + +#========================================== diff --git a/LINUX/iso fs _ ISO9660.md b/LINUX/iso fs _ ISO9660.md new file mode 100644 index 0000000..0ca6fa5 --- /dev/null +++ b/LINUX/iso fs _ ISO9660.md @@ -0,0 +1,46 @@ +Так, а чем по своей сути вообще является iso файл? Грубо говоря, это несжатый архив с точной копией данных блочного устройства **(hdd, ssd, cd)** в формате файловой системы **ISO9660**: + +`file linuxmint-22.1-xfce-64bit.iso + +linuxmint-22.1-xfce-64bit.iso: ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) ... (bootable) + +В зависимости от содержимого образ может быть загрузочным и не загрузочным. Давайте из приведенного выше описания iso-шника выведем возможные способы работы с ним: +1) он представляет собой архив - его можно **распаковать**; +2) он содержит файловую систему ISO9660 - его можно **монтировать**; + +Начнем с "**распакоуки**". Для этого можем воспользоваться утилитой **7z**: + +`sudo apt install p7zip-full +$ 7z x linux*.iso -o./extract + +После завершения процесса мы вольны вносить в файловую структуру свои коррективы. После правок нужно будет заново собрать установочный iso образ. Для этого есть утилитка **mkisofs**, которая корректно собирает **ISO9660** архивы из файлов и каталогов. + +**Второй способ** - монтировать образ и скопировать его содержимое.  + +В привычном для нас понимании, монтирование относится к блочным устройствам **(usb, ssd, hdd)**, которые содержат определенную файловую систему **(exFAT, ext, zfs)**. Такой механизм позволяет нам получить доступ к содержимому носителей. + +Но вот в чем дело, **iso** файл не является **блочным устройством** и его нельзя просто так примонтировать... Ничего, есть решение - механизм **loop device**. + +**Loop device** — это виртуальное блочное устройство, которое позволяет использовать обычный ресурс с файловой системой, как физический девайс. Через него можно смонтировать образ и получить доступ к его файловой системе.  + +Посмотреть то, какое устройство с каким ресурсом соотносится, можно через команду **losetup**: + +`sudo losetup -a + +/dev/loop13: [64512]:2672215 (/path/to/output.iso) + +Для того, чтобы создать и монтировать "**loop device**", используем **mount**: + +$ sudo mount -o loop test.iso ./mnt_point + +Теперь, т.к. файловая система **ISO9660** является "**read-only**", нам нужно скопировать все содержимое образа в отдельный каталог: + +`mkdir new_mnt_point + +`cp -rT mnt_point new_mnt_point + +Далее "по уму" редактируем образ и пересобираем его с помощью **mkisofs**: + +`sudo mkisofs -o ./new.iso -quiet -R -b boot/grub/bios.img -no-emul-boot -boot-load-size 4 -boot-info-table ./new_mnt_point + +Если все сделано правильно, на выходе мы получим "**bootable**" образ. \ No newline at end of file diff --git a/LINUX/tr.md b/LINUX/tr.md new file mode 100644 index 0000000..34a584a --- /dev/null +++ b/LINUX/tr.md @@ -0,0 +1,84 @@ +**Прокачиваемся в tr** + +Более глубокий взгляд на tr +`cat file | tr [:lower:] [:upper: ] + +Сегодня у нас на разборе одна из культовых утилит "**tr**". Используется она для форматирования текста: удаления и замены символов. + +Чаще всего можно встретить в паре со сторонними командами, которые выводят в **stdout** текстовый поток: **cat, head, echo** и т.д. + +Команда имеет следующий вид: + +$ tr флаг SET1 [SET2] + +Сетами представлены наборы символов, с которыми **tr** будет работать. Второй набор не всегда используется.  + +Команда разбирает текст посимвольно и выполняет операцию для каждого элемента отдельно. + +Флаги команды tr: +1) **-d (--delete)**: удаляет элементы из первого набора: +$ echo "Hello 123 world" | tr -d ' a-zA-Z' +123 +1) **-c (--complement)**: обработать каждый символ, который не входит в набор "**SET1**": +$ echo "Hello 123 world" | tr -cd 'a-zA-Z\n' +Helloworld + +В примере мы удалили все символы, которые не входят в перечисление '**a-zA-Z\n**'; + +Таким же макаром можно все буквы удалить и оставить только цифры: + +$ cat customer.csv + +USA,1234567890 + +Canada,0987654321 + +$ cat customer.csv | tr -cd '0-9\n' + +1234567890 + +0987654321 + +1) **-s (--squeeze-repeats)**: cжимает повторяющиеся символы из первого набора до одного: + +$ echo "Hello    World" | tr -s ' ' + +Hello World + +1) **-t (--truncate-set1)**: обрезает первый набор до длины второго: + +$ echo "abcdef" | tr -t 'abcdef' '123' + +123def + +Если длина первого набора больше и мы не указываем флаг, каждый последующий его символ, который (**по номеру > конец "SET2"**), будет заменен: + +$ echo "abcdef" | tr 'abcdef' '123' + +123333 + +При своем дефолтном поведении, программа заменяет символы из "**SET1**" на элементы "**SET2**": + +$ echo "Hello World" | tr 'a-z' 'A-Z' + +HELLO WORLD + +Команда умеет парсить шаблоны: **[:upper:], [:lower:]** и т.д. Детальнее можно ознакомиться в мануале: + +$ echo "hello world" | tr [:lower:] [:upper:] + +HELLO WORLD + +Данные на вход можно получить и через файлик. Для этого мы используем перенаправление: + +$ cat infile + +www.baeldung.com + +$ tr 'a-z' 'A-Z' < infile + +WWW.BAELDUNG.COM + +Измененные данные нужно куда-то записать? Правильно, перенаправляем вывод: + +$ tr 'a-z' 'A-Z' < infile > outfile \ No newline at end of file diff --git "a/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\276\320\267\321\200\320\270\321\202\320\265\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" "b/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\276\320\267\321\200\320\270\321\202\320\265\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" new file mode 100644 index 0000000..4e359d0 --- /dev/null +++ "b/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\320\261\320\275\320\260\321\200\321\203\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\276\320\267\321\200\320\270\321\202\320\265\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" @@ -0,0 +1,27 @@ +Этот скрипт помогает находить потенциально вредоносные или несанкционированные процессы, которые маскируются под системные, используют необычные порты или расположены в нетипичных путях. +```sh +#!/bin/bash + +echo "Поиск подозрительных процессов..." + +# Процессы, запущенные из /tmp, /dev, /run — подозрительно +echo "Процессы из временных директорий:" +ps axeo pid,comm,args | grep -E '/(tmp|dev|run)/' | grep -v grep + +# Процессы без имени (заглушки или rootkit-обфускация) +echo -e "\n❓ Процессы без имени:" +ps -eo pid,comm | awk '$2 == "[]" || $2 == ""' + +# Подозрительные net-соединения (в обход ssh, http, https) +echo -e "\n🌐 Нетипичные входящие соединения:" +sudo lsof -i -nP | grep LISTEN | grep -Ev ':(22|80|443)' | grep -v "COMMAND" +``` + +🟢 Ищет процессы в нестандартных директориях (/tmp, /dev) +🟢 Показывает безымянные процессы — возможные признаки rootkit +🟢 Выводит порты, на которых слушают нетипичные демоны + +➡️ **Можно добавить в crontab для ежедневного обновления**: + +`0 * * * * /path/to/proc_check.sh >> /var/log/proc_scan.log + diff --git "a/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\267\320\260\320\262\320\270\321\201\321\210\320\270\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" "b/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\267\320\260\320\262\320\270\321\201\321\210\320\270\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" new file mode 100644 index 0000000..bb7ee74 --- /dev/null +++ "b/LINUX/\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\267\320\260\320\262\320\270\321\201\321\210\320\270\321\205 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\320\276\320\262 \320\262 Linux.md" @@ -0,0 +1,20 @@ +Этот скрипт проверяет системную нагрузку, выявляет зависшие процессы (с высоким временем работы) и автоматически завершает их, если они мешают работе системы. +```sh +#!/bin/bash + +# Пороговое время работы процесса (в секундах) +THRESHOLD=600 + +# Поиск и завершение зависших процессов +ps -eo pid,etimes,comm --no-headers | while read pid etime command; do + if [ "$etime" -gt "$THRESHOLD" ]; then + echo "Процесс $command (PID $pid) завис! Завершаем..." + kill -9 "$pid" + fi +done +``` + +🟢 Скрипт автоматически ищет процессы, которые работают дольше указанного времени, и принудительно завершает их. +🟢 Полезен для предотвращения зависания системы из-за долгих или неответственных процессов. + +Можно расширить функционал и добавить отправку уведомлений в Telegram, чтобы контролировать, какие процессы были завершены. \ No newline at end of file diff --git "a/LINUX/\320\221\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214 Linux - \320\277\321\200\320\276\321\201\321\202\321\213\320\265 \321\210\320\260\320\263\320\270.md" "b/LINUX/\320\221\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214 Linux - \320\277\321\200\320\276\321\201\321\202\321\213\320\265 \321\210\320\260\320\263\320\270.md" new file mode 100644 index 0000000..d6da61c --- /dev/null +++ "b/LINUX/\320\221\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214 Linux - \320\277\321\200\320\276\321\201\321\202\321\213\320\265 \321\210\320\260\320\263\320\270.md" @@ -0,0 +1,29 @@ +Linux сам по себе безопасная система, но небольшие улучшения могут значительно повысить её защиту. Эти команды и практики помогут вам укрепить систему. + +**Обновить пакеты и установить критические исправления** +`sudo apt update && sudo apt upgrade + +**Включить автоматическую установку обновлений безопасности** +`sudo apt install unattended-upgrades +`sudo dpkg-reconfigure unattended-upgrades + +**Установить и настроить брандмауэр UFW** +`sudo apt install ufw +`sudo ufw enable +`sudo ufw default deny incoming +`sudo ufw default allow outgoing +`sudo ufw allow ssh + +**Проверить активные сетевые соединения** +`sudo lsof -i -P -n | grep LISTEN + +**Проверить наличие rootkit'ов** +`sudo apt install rkhunter +`sudo rkhunter --check + +🟢 unattended-upgrades автоматически ставит обновления +🟢 ufw защищает от несанкционированного доступа +🟢 rkhunter помогает находить потенциальные угрозы + +🗣 Регулярная проверка и настройка безопасности особенно важна для серверов и публичных систем. + diff --git "a/LINUX/\320\221\321\213\321\201\321\202\321\200\320\276 \320\277\320\276\321\201\320\274\320\276\321\202\321\200\320\265\321\202\321\214 \320\262\320\265\321\200\321\201\320\270\321\216 \320\270 \320\275\320\260\320\267\320\262\320\260\320\275\320\270\320\265 \320\264\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260 linux.md" "b/LINUX/\320\221\321\213\321\201\321\202\321\200\320\276 \320\277\320\276\321\201\320\274\320\276\321\202\321\200\320\265\321\202\321\214 \320\262\320\265\321\200\321\201\320\270\321\216 \320\270 \320\275\320\260\320\267\320\262\320\260\320\275\320\270\320\265 \320\264\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260 linux.md" new file mode 100644 index 0000000..7a44420 --- /dev/null +++ "b/LINUX/\320\221\321\213\321\201\321\202\321\200\320\276 \320\277\320\276\321\201\320\274\320\276\321\202\321\200\320\265\321\202\321\214 \320\262\320\265\321\200\321\201\320\270\321\216 \320\270 \320\275\320\260\320\267\320\262\320\260\320\275\320\270\320\265 \320\264\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\260 linux.md" @@ -0,0 +1,4 @@ +а так же на базе чего он построен. + +==`cat /etc/*release* + diff --git "a/LINUX/\320\230\321\201\320\277\321\200\320\260\320\262\320\270\321\202\321\214 USB, \321\201\320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\203\321\216 \320\272\320\260\320\272 read-only \320\262 Linux.md" "b/LINUX/\320\230\321\201\320\277\321\200\320\260\320\262\320\270\321\202\321\214 USB, \321\201\320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\203\321\216 \320\272\320\260\320\272 read-only \320\262 Linux.md" new file mode 100644 index 0000000..b74f25d --- /dev/null +++ "b/LINUX/\320\230\321\201\320\277\321\200\320\260\320\262\320\270\321\202\321\214 USB, \321\201\320\274\320\276\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\203\321\216 \320\272\320\260\320\272 read-only \320\262 Linux.md" @@ -0,0 +1,39 @@ +Иногда Linux монтирует флешку или диск в режиме только для чтения (`read-only`), что блокирует любые операции записи. Вот пошаговое решение: + +🔹 Шаг 1: Проверка и исправление файловой системы + +`sudo umount /dev/sdX1 +`sudo fsck -f /dev/sdX1 + +Замените sdX1 на имя вашего устройства (узнать можно через `lsblk`). + +🔹 Шаг 2: Примонтировать с правами на запись + +`sudo mount -o remount,rw /dev/sdX1 + +🔹 Шаг 3: Физическая защита от записи + +Некоторые USB-накопители имеют переключатель блокировки записи. Убедитесь, что он отключён. + +🔹 Шаг 4: Аппаратная блокировка из-за износа + +Если dmesg показывает: + +Write-protect is on + +— это может означать, что флешка изношена и контроллер принудительно заблокировал запись. Здесь помочь может только замена. + +🔹 Шаг 5: Очистка и форматирование (если данные не важны) + +`sudo wipefs -a /dev/sdX +`sudo mkfs.vfat /dev/sdX1 + +📌 Быстрая таблица + +| 🚩 Проблема | 💡 Решение | +|-------------------------------|----------------------------------------| +| Ошибки в файловой системе | `fsck` и перемонтирование | +| Случайный `read-only` | `mount -o remount,rw` | +| Защита от записи физическая | Проверить переключатель | +| Аппаратная блокировка | Устройство под замену | +| Данные не важны | `wipefs` + `mkfs` | diff --git "a/LINUX/\320\232\320\260\320\272 \321\200\320\260\320\267\320\261\320\270\321\202\321\214 \321\204\320\260\320\271\320\273 \320\275\320\260 \321\207\320\260\321\201\321\202\320\270.md" "b/LINUX/\320\232\320\260\320\272 \321\200\320\260\320\267\320\261\320\270\321\202\321\214 \321\204\320\260\320\271\320\273 \320\275\320\260 \321\207\320\260\321\201\321\202\320\270.md" new file mode 100644 index 0000000..88b812e --- /dev/null +++ "b/LINUX/\320\232\320\260\320\272 \321\200\320\260\320\267\320\261\320\270\321\202\321\214 \321\204\320\260\320\271\320\273 \320\275\320\260 \321\207\320\260\321\201\321\202\320\270.md" @@ -0,0 +1,71 @@ +В некоторых случаях один файл нужно разбить на несколько частей, например, для загрузки либо копирования в случае слишком большого размера. Проще всего это сделать с помощью утилиты ==split. + +Команда используется для разбивки файлов по размеру, количеству строк и на определенное количество составных частей. +### Разбить по размеру + +Для этого используем опцию "-b", определяющую максимальный размер элемента. За основу возьмем файлик в 721 байт. Его нужно разбить на части по 100 байт. Для удобства зададим префикс имени "file-part_": + + +`$ ls -l +`721 Apr 20 13:11 file_orig + + +`$ split -b 100 ./file_orig ./file-part_ + + +Помимо оригинала появятся еще 8 файлов: + + +`$ ls -l +`721 Apr 20 13:11 file_orig +`100 Apr 20 13:12 file-part_aa +`... +`21 Apr 20 13:12 file-part_ah + + +Разбить по количеству строк + +Может быть нужно разбить один текстовый документ на несколько, с количеством строк "<= n". В этом вопросе полезной окажется опция "-l". Команда поделит большой log-файл на части по 10 тысяч строк в каждом: + + +`$ split -l 1000 ~/Logs/log ~/Logs/log-part_ + +### Разбить на определённое количество файлов + +Еще одна интересная задача, в решении которой поможет опция "-n". Размер будет, по возможности, поделен поровну. Достаточно прописать итоговое количество файлов и запустить команду: + + +`$ split -n 3 ./file_orig ./file-part_ + + +`$ ls -l +`240 Apr 20 13:31 file-part_aa +`240 Apr 20 13:31 file-part_ab +`241 Apr 20 13:31 file-part_ac +`721 Apr 20 13:11 file_orig + + +Настройка имени частей файла + +Как мы уже поняли, для split префикс определяет название части файла, после чего идет дефолтный суффикс из двух латинских букв. + +С помощью опций можно изменить его длину "-a", переключиться на числа "-d" или hex-символы "-x". В последних двух сценариях получится выбрать начальную точку отчета "--numeric-suffixes" для чисел и "--hex-suffixes" для hex-символов. + +Возьмем задачу – разделить текстовый файл на 3 части равного размера, чтобы каждый из них имел префикс "file-part_" и числовой суффикс из одного символа, начиная с 1: + + +$ split -a 1 --numeric-suffixes=1 -n 3 ./file_orig ./file-part_ + + +$ ls -l +240 Apr 20 13:36 file-part_1 +240 Apr 20 13:36 file-part_2 +241 Apr 20 13:36 file-part_3 + + +Объединение частей файла + +Следующий шаг – объединение нескольких частей в единый файл. Для этих целей отлично подойдет утилита cat. Сначала нужно задать имена частей, потом итоговый файл: + + +`cat ~/Archive/split-archive.part_* > ~/Archives/cat-archive.tar.gz diff --git "a/LINUX/\320\232\320\260\320\272 \321\203\320\264\320\260\320\273\321\217\321\202\321\214 \321\201\321\201\321\213\320\273\320\272\320\270.md" "b/LINUX/\320\232\320\260\320\272 \321\203\320\264\320\260\320\273\321\217\321\202\321\214 \321\201\321\201\321\213\320\273\320\272\320\270.md" new file mode 100644 index 0000000..404e9a9 --- /dev/null +++ "b/LINUX/\320\232\320\260\320\272 \321\203\320\264\320\260\320\273\321\217\321\202\321\214 \321\201\321\201\321\213\320\273\320\272\320\270.md" @@ -0,0 +1,28 @@ +В общем-то, задача довольно примитивная, но и пост получится не гигантский. Посмотрим на несколько команд, которые помогут более эффективно расправляться с ссылками. + +Обычно мы как проверяем ссылку - выполняем "ls -l" и смотрим на тип: + +`$ ls -l +`lrwxrwxrwx ... sftp-server -> openssh/sftp-server + + +Если будем работать через find, руками тип смотреть не придется. Для фильтрации по символьным ссылкам у нас есть опция "-type l": + + +`$ find /usr/lib -type l +`/usr/lib/gvfs/gvfsd-afp +`/usr/lib/libmultipath.so + + +Если мы переживаем, что удалим что-то лишнее, можем проверить путь к файлу, на который указывает ссылка. Для этого нужно для вывода команды выполнить "-exec ls -l {} \": + + +`$ find /usr/lib -type l -exec ls -l {} \; +`/usr/lib/gvfs/gvfsd-afp -> ../../libexec/gvfsd-afp +`/usr/lib/libmultipath.so -> libmultipath.so.0 + + +Напоследок разберемся с поиском и удалением битых ссылок, которые никуда не ведут. Для такой цели подойдет параметр "-xtype l": + + +`$ find ~/broken_links/ -xtype l \ No newline at end of file diff --git "a/LINUX/\320\233\320\276\320\263\320\270 \320\262 Linux.md" "b/LINUX/\320\233\320\276\320\263\320\270 \320\262 Linux.md" new file mode 100644 index 0000000..6357dc5 --- /dev/null +++ "b/LINUX/\320\233\320\276\320\263\320\270 \320\262 Linux.md" @@ -0,0 +1,226 @@ +# Как разбирать: journalctl, grep, awk и sed + +Каждый админ хотя бы раз сталкивался с ситуацией, когда сервер внезапно начинает тупить: подвисают процессы, появляются странные задержки, что‑то перестаёт работать. И первая остановка в таком случае — это журналы событий. В Linux системные логи хранятся в **systemd‑journald**, а его главный инструмент для работы — `journalctl`. Но просто читать логи — это скучно. Разберем, **как фильтровать, искать ошибки, анализировать данные и автоматизировать разбор логов** с помощью `grep`, `awk`, `sed` и других утилит. + +#### Работа с journalctl + +Самый простой способ заглянуть в системные журналы — просто вызвать `journalctl`: + +``` +journalctl +``` + +Но если сервер работает долго, логов там будет много. Выведем их без постраничного режима: + +``` +journalctl --no-pager +``` + +Если команда зависает, скорее всего, журнал слишком большой. Ограничим его по времени, например, **выведем логи за последний час**: + +``` +journalctl --since "1 hour ago" +``` + +Теперь можно быстро отследить недавние события. + +#### Как понять, что произошло после перезагрузки? + +Если сервер неожиданно перезагрузился, полезно посмотреть, что записалось в логи **после старта**: + +``` +journalctl -b +``` + +Если система несколько раз перезагружалась, можно посмотреть события после конкретного запуска, например, **минус первый перезапуск**: + +``` +journalctl -b -1 +``` + +Это поможет понять, что произошло перед падением системы. + +#### Фильтрация по сервису + +Чтобы разобраться в проблемах конкретного сервиса, например, `nginx`, используем флаг `-u`: + +``` +journalctl -u nginx.service --no-pager +``` + +Пример вывода: + +``` +Feb 02 10:15:00 myserver nginx[1234]: Starting nginx: [OK] +Feb 02 10:16:00 myserver nginx[1234]: 502 Bad Gateway +``` + +Можно дополнительно **сортировать логи от новых к старым**: + +``` +journalctl -u nginx.service --reverse +``` + +#### grep для поиска ошибок + +Журналы бывают огромными, но нам нужны только ошибки. Отфильтруем их с помощью `grep`: + +``` +journalctl -u nginx.service | grep "error" +``` + +Пример вывода: + +``` +Feb 02 11:20:00 myserver nginx[5678]: error: failed to bind socket +Feb 02 11:22:00 myserver nginx[5678]: error: no permission to access /var/www/html +``` + +Чтобы **не зависеть от регистра**, используем `-i`: + +``` +journalctl -u nginx.service | grep -i "error" +``` + +Теперь `ERROR`, `Error` и `error` будут найдены. + +Иногда важно видеть не только саму ошибку, но и контекст вокруг. Например, **две строки до и после найденного слова**: + +``` +journalctl -u nginx.service | grep -A 2 -B 2 "error" +``` + +Так можно увидеть, что происходило **до и после ошибки**. + +#### Выбираем нужные данные с awk + +Журналы содержат много лишней информации. Например, оставим **только дату, время и сообщение**: + +``` +journalctl -u nginx.service | awk '{print $1, $2, $3, $6}' +``` + +Вывод: + +``` +Feb 02 12:00:00 Starting +Feb 02 12:05:00 error: +Feb 02 12:10:00 Listening +``` + +Если сообщения длинные, можно **обрезать текст**: + +``` +journalctl -u nginx.service | awk '{print substr($0, index($0,$6))}' +``` + +Это оставит только само сообщение без метаданных. + +#### Очистка логов с sed + +Некоторые логи содержат ненужные теги или мусорные символы. Например, уберём всё, что находится в квадратных скобках `[INFO]`: + +``` +journalctl -u nginx.service | sed 's/\[.*\]//g' +``` + +Исходный лог: + +``` +Feb 02 13:30:00 myserver nginx[1234]: [INFO] Server started +``` + +После обработки: + +``` +Feb 02 13:30:00 myserver nginx[1234]: Server started +``` + +Также можно **заменить текст**, например, заменить `error` на `!!!ERROR!!!` для выделения: + +``` +journalctl -u nginx.service | sed 's/error/!!!ERROR!!!/g' +``` + +#### Автоматический сбор ошибок + +Допустим, мы нужно **каждый день автоматически собирать ошибки Nginx** и записывать их в файл. Используем **crontab** и скрипт: + +``` +journalctl -u nginx.service --since "1 day ago" | grep -i "error" | awk '{print $1, $2, $3, $6, $7, $8}' > /var/log/nginx_errors.log +``` + +Этот код: + +1. Берёт логи Nginx за последние 24 часа. +2. Ищет строки с `"error"`. +3. Оставляет только дату, время и сообщение. +4. Записывает результат в `/var/log/nginx_errors.log`. +#### Вывод логов в реальном времени + +А если хочется **смотреть логи в реальном времени**, то спользуйте флаг `-f`: + +``` +journalctl -u nginx.service -f= +``` + +Это как `tail -f`, но для journalctl — вы сразу увидите, если сервис упадёт. + +===================================== +## Расположение логов по умолчанию + +Большинство файлов логов Linux находятся в папке **/var/log/** вы можете список файлов логов для вашей системы с помощью команды ls: + + `ls -l /var/log/` + +Ниже мы рассмотрим 20 различных файлов логов Linux, размещенных в каталоге **/var/log/**. Некоторые из этих логов встречаются только в определенных дистрибутивах. + +- **/var/log/messages** - содержит глобальные системные логи Linux, в том числе те, которые регистрируются при запуске системы. В этот лог записываются несколько типов сообщений: это почта, cron, различные сервисы, ядро, аутентификация и другие. +- **/var/log/dmesg** - содержит сообщения, полученные от ядра. Регистрирует много сообщений еще на этапе загрузки, в них отображается информация об аппаратных устройствах, которые инициализируются в процессе загрузки. Можно сказать это еще один лог системы Linux. Количество сообщений в логе ограничено, и когда файл будет переполнен, с каждым новым сообщением старые будут перезаписаны. Вы также можете посмотреть сообщения из этого лога с помощью команды dmseg. +- **/var/log/auth.log** - содержит информацию об авторизации пользователей в системе, включая пользовательские логины и механизмы аутентификации, которые были использованы. +- **/var/log/boot.log** - Содержит информацию, которая регистрируется при загрузке системы. +- **/var/log/daemon.log** - Включает сообщения от различных фоновых демонов +- **/var/log/kern.log** - Тоже содержит сообщения от ядра, полезны при устранении ошибок пользовательских модулей, встроенных в ядро. +- **/var/log/lastlog** - Отображает информацию о последней сессии всех пользователей. Это нетекстовый файл, для его просмотра необходимо использовать команду lastlog. +- **/var/log/maillog /var/log/mail.log** - журналы сервера электронной почты, запущенного в системе. +- **/var/log/user.log** - Информация из всех журналов на уровне пользователей. +- **/var/log/Xorg.x.log** - Лог сообщений Х сервера. +- **/var/log/alternatives.log** - Информация о работе программы update-alternatives. Это символические ссылки на команды или библиотеки по умолчанию. +- **/var/log/btmp** - лог файл Linux содержит информацию о неудачных попытках входа. Для просмотра файла удобно использовать команду last -f /var/log/btmp +- **/var/log/cups** - Все сообщения, связанные с печатью и принтерами. +- **/var/log/anaconda.log** - все сообщения, зарегистрированные при установке сохраняются в этом файле +- **/var/log/yum.log** - регистрирует всю информацию об установке пакетов с помощью Yum. +- **/var/log/cron** - Всякий раз когда демон Cron запускает выполнения программы, он записывает отчет и сообщения самой программы в этом файле. +- **/var/log/secure** - содержит информацию, относящуюся к аутентификации и авторизации. Например, SSHd регистрирует здесь все, в том числе неудачные попытки входа в систему. +- **/var/log/wtmp или /var/log/utmp -** системные логи Linux**,** содержат журнал входов пользователей в систему. С помощью команды wtmp вы можете узнать кто и когда вошел в систему. +- **/var/log/faillog** - лог системы linux, содержит неудачные попытки входа в систему. Используйте команду faillog, чтобы отобразить содержимое этого файла. +- **/var/log/mysqld.log** - файлы логов Linux от сервера баз данных MySQL. +- **/var/log/httpd/ или /var/log/apache2** - лог файлы linux11 веб-сервера Apache. Логи доступа находятся в файле access_log, а ошибок в error_log +- **/var/log/lighttpd/** - логи linux веб-сервера lighttpd +- **/var/log/conman/** - файлы логов клиента ConMan, +- **/var/log/mail/** - в этом каталоге содержатся дополнительные логи почтового сервера +- **/var/log/prelink/** - Программа Prelink связывает библиотеки и исполняемые файлы, чтобы ускорить процесс их загрузки. /var/log/prelink/prelink.log содержит информацию о .so файлах, которые были изменены программой. +- **/var/log/audit/**- Содержит информацию, созданную демоном аудита auditd. +- **/var/log/setroubleshoot/ -** SE Linux использует демон setroubleshootd (SE Trouble Shoot Daemon) для уведомления о проблемах с безопасностью. В этом журнале находятся сообщения этой программы. +- **/var/log/samba/** - содержит информацию и журналы файлового сервера Samba, который используется для подключения к общим папкам Windows. +- **/var/log/sa/** - Содержит .cap файлы, собранные пакетом Sysstat. +- **/var/log/sssd/** - Используется системным демоном безопасности, который управляет удаленным доступом к каталогам и механизмами аутентификации. + +## Просмотр логов в Linux + +Смотрим лог **/var/log/dmesg**, с возможностью прокрутки: + `less /var/log/dmesg` + +Просмотр логов Linux, в реальном времени: + `tail -f /var/log/dmesg` + +Открываем лог файл dmesg: + `cat /var/log/dmesg` + +Первые строки dmesg: + `head /var/log/dmesg` + +Выводим только ошибки из /var/log/messages: + `grep -i error /var/log/dmesg` +  +===================================== diff --git "a/LINUX/\320\236\320\277\321\202\320\270\320\274\320\270\320\267\320\260\321\206\320\270\321\217 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\270 Linux - \321\203\321\201\320\272\320\276\321\200\321\217\320\265\320\274 \321\201\321\202\320\260\321\200\321\202 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" "b/LINUX/\320\236\320\277\321\202\320\270\320\274\320\270\320\267\320\260\321\206\320\270\321\217 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\270 Linux - \321\203\321\201\320\272\320\276\321\200\321\217\320\265\320\274 \321\201\321\202\320\260\321\200\321\202 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" new file mode 100644 index 0000000..65ead09 --- /dev/null +++ "b/LINUX/\320\236\320\277\321\202\320\270\320\274\320\270\320\267\320\260\321\206\320\270\321\217 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\270 Linux - \321\203\321\201\320\272\320\276\321\200\321\217\320\265\320\274 \321\201\321\202\320\260\321\200\321\202 \321\201\320\270\321\201\321\202\320\265\320\274\321\213.md" @@ -0,0 +1,26 @@ +Со временем Linux-система может загружаться медленнее из-за лишних сервисов. Эти команды помогут проанализировать и ускорить процесс загрузки. + +Посмотреть общее время загрузки системы +`systemd-analyze + +Показать список сервисов и их время загрузки +`systemd-analyze blame + +Проверить, какие службы запускаются при старте +`systemctl list-unit-files --state=enabled + +Отключить ненужный сервис +`sudo systemctl disable имя_сервиса + +Установить задержку старта для тяжёлого сервиса +`sudo systemctl edit имя_сервиса + +В открывшемся файле добавить: +`[Service] +`ExecStartPre=/bin/sleep 30 + +🟢 systemd-analyze показывает время загрузки системы +🟢 systemctl позволяет отключать или откладывать запуск лишних служб +🟢 Оптимизация автозагрузки ускоряет старт системы + +🗣 Регулярная проверка и настройка автозагрузки особенно важна для серверов и рабочих станций с ограниченными ресурсами. diff --git "a/LINUX/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \320\270 \321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\201\321\202\320\260\321\200\321\213\321\205 \321\217\320\264\320\265\321\200.md" "b/LINUX/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \320\270 \321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\201\321\202\320\260\321\200\321\213\321\205 \321\217\320\264\320\265\321\200.md" new file mode 100644 index 0000000..a9745c8 --- /dev/null +++ "b/LINUX/\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \320\270 \321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\201\321\202\320\260\321\200\321\213\321\205 \321\217\320\264\320\265\321\200.md" @@ -0,0 +1,78 @@ +```sh +ls /boot + +sudo uname -a + +sudo apt list --installed | egrep "linux-image | linux-headers" + +dpkg --list | egrep "linux-image | linux-headers" + +# Здесь **rc** - означает, что пакет был установлен, но уже удален, а **ii** - что пакет сейчас установлен. На основе полученного списка вы можете удалить любую версию, например, 4.15.0-91: + +sudo apt purge linux-image-4.15.0-66-generic linux-headers-4.15.0-91-generic + +# Удалить все старые ядра: +sudo apt --purge autoremove +sudo apt autoremove +sudo update-grub + + +``` + +========================================== +#### Как очистить сервер от мусора + +Со временем сервер обрастает мусором: логи, временные файлы, старые кэши. Разберем команды по удалению всего этого добра. Бонусом в конце будет готовый файл для запуска скрипта с логированием, который будет каждый день удалять все ненужное 🙂 + +Команда для удаления .log-файлов старше 7 дней: + +`find /var/log -type f -name "*.log" -mtime +7 -delete + +find - команда поиска файлов +/var/log - папка, где хранятся логи +"-type f" - ищем только файлы +-name "*.log" - по шаблону *.log +"-mtime +7" - старше 7 дней +-delete - сразу удалять + +Очистить systemd-журналы: + +`journalctl --vacuum-time=7d + +Эта команда удаляет внутренние журналы системы, которым больше 7 дней. Такие журналы хранят события: старты, ошибки, перезагрузки, службы — всё, что происходило в системе. Обычно занимают много места, особенно если сервер работает давно. + +Очистить временные файлы: + +`rm -rf /tmp/* /var/tmp/* + +Удаляет всё из временных директорий. Будь осторожен, если на сервере кто-то работает прямо сейчас. + +Очистить кэш и мусор после установки пакетов: + +`apt clean && apt autoremove -y + +"apt clean" - очищает кэш установленных .deb файлов +"apt autoremove" - удаляет больше не нужные зависимости +"-y" - выполнять без лишних вопросов + +Ниже прикладываю готовый файл. Его нужно будет сделать исполняемым и можно добавить в crontab с запуском в каждое воскресенье в 0:00. Все результаты будут сохраняться в файл "/var/log/server-cleanup.log": + +```sh +#!/bin/bash + +LOG_FILE="/var/log/server-cleanup.log" +echo "[$(date)] Очистка начата" >> "$LOG_FILE" + +find /var/log -type f -name "*.log" -mtime +7 -delete >> "$LOG_FILE" 2>&1 +journalctl --vacuum-time=7d >> "$LOG_FILE" 2>&1 +rm -rf /tmp/* /var/tmp/* >> "$LOG_FILE" 2>&1 +apt clean && apt autoremove -y >> "$LOG_FILE" 2>&1 + +echo "[$(date)] Очистка завершена" >> "$LOG_FILE" + +sudo chmod +x /usr/local/bin/clean-server.sh + +sudo crontab -e + +0 0 * * 0 /usr/local/bin/clean-server.sh +``` diff --git "a/LINUX/\320\241\320\261\320\276\321\200\320\272\320\260 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274 \320\270\320\267 \320\270\321\201\321\205\320\276\320\264\320\275\320\276\320\263\320\276 \320\272\320\276\320\264\320\260 \320\262 Linux.md" "b/LINUX/\320\241\320\261\320\276\321\200\320\272\320\260 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274 \320\270\320\267 \320\270\321\201\321\205\320\276\320\264\320\275\320\276\320\263\320\276 \320\272\320\276\320\264\320\260 \320\262 Linux.md" new file mode 100644 index 0000000..9b11cd1 --- /dev/null +++ "b/LINUX/\320\241\320\261\320\276\321\200\320\272\320\260 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274 \320\270\320\267 \320\270\321\201\321\205\320\276\320\264\320\275\320\276\320\263\320\276 \320\272\320\276\320\264\320\260 \320\262 Linux.md" @@ -0,0 +1,42 @@ + +Иногда, случаются ситуации когда нам нужен какой-то софт, но для него нет пакета, или же версия пакета сильно отстает. Тут может пригодиться умение установки из исходников. + +Для большинства приложений процесс установки из исходного кода состоит из шагов, которые мы разберём на примере популярного инструмента для мониторинга процессов — **htop**.   + + 1️⃣ **Скачиваем исходный код** +Для этого найдите архив с исходниками на офциальном сайте или репозитории GitHub. Для нашего примера, скачаем архив исходников htop: + +`wget https://github.com/htop-dev/htop/archive/refs/tags/3.2.2.tar.gz + +2️⃣ **Распаковываем архив и переходим в каталог** +`tar -xvzf 3.2.2.tar.gz +`cd htop-3.2.2 + +3️⃣ **Устанавливаем зависимости** +Большинство программ требуют компилятора и библиотек. Убедитесь, что у вас установлен набор инструментов для сборки:   +`sudo apt update +`sudo apt install build-essential libncursesw5-dev + +**4️⃣ Конфигурируем сборку** +Подготовьте сборку для вашей системы. Это этап проверки зависимостей и настройки параметров:   +`./autogen.sh +`./configure + +Если программа не поддерживает autogen.sh, обычно достаточно только ./configure.  Используется для проверки окружения и создания Makefile, который нужен для компиляции. + +5️⃣ **Компилируем программу** +`make + +Процесс может занять некоторое время в зависимости от мощности системы. + +**6️⃣ Устанавливаем программу** +Завершаем установку в системный каталог: +`sudo make install + +7️⃣ **Проверяем установку** +Для проверки, что мы установили все корректно, проверим версию: +`htop --version + +➡️ Если вам нужно выполнить установку в пользовательский каталог, то можем указать префикс конфигурации: +`./configure --prefix=$HOME/local + diff --git "a/LINUX/\320\241\320\272\321\200\321\213\321\202\321\213\320\265 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\321\213 \320\270 rootkits, \320\272\320\260\320\272 \320\275\320\260\320\271\321\202\320\270 \320\275\320\265\320\262\320\270\320\264\320\270\320\274\320\272\321\203 \320\262 Linux.md" "b/LINUX/\320\241\320\272\321\200\321\213\321\202\321\213\320\265 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\321\213 \320\270 rootkits, \320\272\320\260\320\272 \320\275\320\260\320\271\321\202\320\270 \320\275\320\265\320\262\320\270\320\264\320\270\320\274\320\272\321\203 \320\262 Linux.md" new file mode 100644 index 0000000..7202ac0 --- /dev/null +++ "b/LINUX/\320\241\320\272\321\200\321\213\321\202\321\213\320\265 \320\277\321\200\320\276\321\206\320\265\321\201\321\201\321\213 \320\270 rootkits, \320\272\320\260\320\272 \320\275\320\260\320\271\321\202\320\270 \320\275\320\265\320\262\320\270\320\264\320\270\320\274\320\272\321\203 \320\262 Linux.md" @@ -0,0 +1,40 @@ +Иногда ps, top и даже htop не показывают зловредный процесс, хотя ты точно знаешь — он где-то сидит.  + +Вот как найти спрятанное 👇 + +🔍 **1. chkrootkit — проверка на известные rootkit'ы** +```sh +sudo apt install chkrootkit +sudo chkrootkit +``` +📌 Ищет признаки заражения, подмену системных утилит, скрытые процессы, ловушки ядра. + +🛡 **2. rkhunter — глубокий аудит системы** +```sh +sudo apt install rkhunter +sudo rkhunter --check +``` +📌 Проверяет бинарники, конфиги, права, подозрительные изменения. + +🫥 **3. unhide — находим скрытые процессы** +```sh +sudo apt install unhide +sudo unhide proc +sudo unhide sys +``` +📌 Сравнивает процессы в /proc, syscalls и ps. Помогает, если ps не показывает, но процесс явно есть. + + 🧩**4. auditctl — аудит системных вызовов** + ```sh + sudo apt install auditd +sudo auditctl -a exit,always -F arch=b64 -S execve +``` +📌 Ловит каждый execve, даже если процесс мгновенно скрывается. Идеально для отлова аномалий. + + +🧠 **Что делать, если ps и top молчат, а диск, сеть и CPU загружены?** + +✅ Смотри /proc, ищи "дырки" в PID   +✅ Используй lsof, netstat, ss — они могут показать процессы, которых нет в ps   +✅ Сравни /bin/ps с версией из пакета (debsums, rpm -V)   +✅ Запусти live-дистрибутив и просканируй систему снаружи \ No newline at end of file diff --git "a/LINUX/\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274.md" "b/LINUX/\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274.md" new file mode 100644 index 0000000..9977ef4 --- /dev/null +++ "b/LINUX/\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274.md" @@ -0,0 +1,26 @@ +```sh +sudo apt remove name_progr +sudo apt purge name_progr +apt list --installed + + +snap list +sudo snap remove name_progr + + +sudo apt autoremove +sudo apt autoclean + + +# Удаление программ без пакетного менеджера + +cd /папка/с/исходниками +sudo make uninstall + +# Первая команда переходит в папку с исходниками, вторая - удаляет программу. Если скрипта не сохранилось, то вы можете скачать его из интернета. Иначе программу не удалить. Еще один вариант установки программ - с помощью скрипта из официального сайта. Такие программы удалить намного проще. Они устанавливаются, как правило, в одну папку, для них существует специальный каталог в файловой системе Linux. Здесь они создают новую папку, где расположены все их файлы, включая исполняемые и файлы настроек. Например, чтобы удалить браузер Google Chrome, установленный, таким образом, нужно набрать: + + sudo rm -Rf /opt/google-chrome/ + +# Возможно, после удаления программы, вам стоит проверить папку /etc, так как там обязательно должны были остаться файлы настроек пути к библиотекам этой программы, исполняемым файлам и файлы сервисов. + +``` \ No newline at end of file diff --git "a/LINUX/\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217 \321\201\320\270\321\201\321\202\320\265\320\274\320\260 Linux.md" "b/LINUX/\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217 \321\201\320\270\321\201\321\202\320\265\320\274\320\260 Linux.md" new file mode 100644 index 0000000..177e091 --- /dev/null +++ "b/LINUX/\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217 \321\201\320\270\321\201\321\202\320\265\320\274\320\260 Linux.md" @@ -0,0 +1,176 @@ +#========================================== + +Помимо единственного корневого раздела root, присутствуют подкаталоги, к которым привязаны соответствующие каталоги. Типовая структура первых двух уровней выглядит так: + +├── bin -> usr/bin +├── boot +│ ├── grub +│ └── lost+found +├── dev +│ ├── block +│ └── … +├── etc +│ ├── … +│ ├── update-manager +│ ├── update-motd.d +│ └── xdg +├── home +├── lib -> usr/lib +├── lib32 -> usr/lib32 +├── lib64 -> usr/lib64 +├── libx32 -> usr/libx32 +├── lost+found +├── media +├── mnt +├── opt +├── proc +│ ├── … +│ └── tty +├── root +├── run +│ └── … +├── sbin -> usr/sbin +├── srv +├── sys +├── tmp +│ └── … +├── usr +└── var + +Каждый файл в ФС Линукса имеет конкретный индекс Inode. У одного файла в такой структуре может быть несколько имен, т.е. путей. В структуре системы файлы могут различаться, но на жестком диске им соответствует один файл. Такое свойство называют перекрестной иерархичностью — ветви дерева пересекаются. + +Inode — индексный дескриптор, который используется в UNIX-системах. В нем хранятся все мета-данные о файле: владелец, время последнего обращения, размер, другая информация. + +Каталог можно переместить в другую ФС, после этого его дескриптор будет создан заново. Только после этого исходник будет удален. В пределах одной системы изменится только путь файла. Каталоги и файлы существуют до момента, пока хранятся данные об их имени или пути к ним. При удалении этой информации блоки освобождаются под другие файлы. + +В числе других особенностей Linux — ссылки двух типов: + +- жесткая ссылка (то есть hard link) — путь файла, заданный командой ls -li; +- символьная ссылка (symbolic link) — файл стандарта UNIX с текстовой строкой, задающей путь к оригинальному файлу. + +Существует также суперблок, где хранятся все параметры ФС — общее количество блоков и Inode, наличие свободных блоков и данные о них. Суперблок должен сохранять целостность — это напрямую влияет на стабильность и работу всей системы. Для безопасности в Линукс создается несколько копий для восстановления информации в случае ее потери. + +## Ключевые директории и их назначение + +В Linux директория — фундаментальный элемент системы. Это каталог (папка), где содержатся другие файлы, расположенные согласно иерархии. Отправной точкой, а точнее, базой выступает корневой каталог «/», на котором выстраивается вся система. + +В некоторых источниках этот каталог сравнивают с диском С на винде, но это не совсем корректное сравнение — в Линуксе нет буквенных дисков. В Windows дополнительный раздел расположен на диске D, в Линукс это будет отдельная папка с тем же корнем. Иными словами, путь к любому файлу проходит через корень. + +Пример. Файл /home/user/alien имеет структуру root -> home -> user -> documents, и никакую другую. + +Рассмотрим наиболее востребованные директории и их функции. + +### Пользовательские файлы /bin и /sbin + +В этой директории расположены бинарные исполняемые файлы, которые требуются для загрузки системы и ее работы. Именно здесь вы найдете команды ls, cp, grep, mv, ping и прочие утилиты, доступные каждому юзеру. В /usr/bin хранятся и такие приложения, как браузер Chrome, Firefox и другие. + +В каталоге /sbin, который имеет схожую конфигурацию, содержатся важные исполняемые файлы для системного администрирования. Это iptables, reboot, fdisk и т.д.. + +### Пользовательские данные /home (домашняя папка) + +В этом каталоге хранится домашняя папка с личными файлами и настройками. Например, если ваше имя юзера — denis, у вас будет домашняя папка /home/denis. Сюда записываются, например, скачанные файлы. Если пользователей несколько, они будут записывать файлы в свои папки. Для изменения других системных файлов потребуются права root. + +### Конфигурационные файлы /etc + +Это место хранения файлов конфигурации — сетевых настроек, приложений, файлов инициализации различных служб (серверов печати, хостов и т.д). Папка крайне важна для работы всей системы. При необходимости общие файлы можно редактировать вручную в текстовом редакторе. + +### Файлы устройств /dev и системные файлы /proc + +В директории /dev хранятся интерфейсы системных и периферийных устройств — дисков, принтеров, динамиков и прочих. В Линуксе устройства представлены в виде файлов. Стоит понимать, что это не совсем файлы в том виде, к которому мы привыкли. Псевдоустройства из этого каталога — это, например, генераторы случайных чисел /dev/random. + +Файлы ядра и процессов содержатся в каталоге /proc. В нем, как и в /dev, нет стандартных файлов, а есть специфические области данных о системах и процессах. Здесь есть информация о процессоре /proc/cpuinfo; сведения о памяти, используемой системой — /proc/meminfo; время — /proc/uptime. Тут же содержится информация о системных ресурсах. + +### Переменные (изменяемые) данные /var + +В этой директории лежат данные, которые в процессе работы системы постоянно меняются. Сюда относятся логи, кэши, системные журналы, почтовые очереди и прочие файлы, создаваемые программами. + +Это записываемая директория, которая в стандартном режиме доступна только для чтения. Логи содержатся в /var/log, базы данных в /var/lib, файлы для перезагрузки в /var/tmp. + +### Статические файлы для загрузки /boot + +Это важные файлы для загрузки ОС, в том числе ядра Линукс. Запуск системы без этой папки проблематичен. При этом файлы конфигурации загрузчика находятся в другой папке — /etc, о которой мы писали выше. + +### Общие файлы библиотеки /lib + +В директории /lib находятся файлы, которые обеспечивают работу системных программ и ядра. Эти данные приложения и бинарные файлы /bin и /sbin используют для выполнения заданных функций. + +### Съемный носитель /media + +В этом директории монтируются съемные носители. К примеру, когда вы используете компакт-диск или флешку, автоматически создается каталог. Юзеры получают полный доступ к содержимому носителей. + +### Временные файлы /tmp + +В директории хранятся временные файлы, которые создаются приложениями в процессе работы. При перезагрузке содержимое этого каталога, как правило, очищается. Можно удалить файлы без перезагрузки с помощью соответствующих утилит. + +### Восстановленные данные /lost+found + +В любой ФС Linux есть такая директория. Если в системе случится сбой, при следующей загрузке произойдет автоматическая проверка, и любые обнаруженные поврежденные файлы отправятся в каталог /lost+found, чтобы пользователь при необходимости смог восстановить данные. + +### Файлы состояния приложений /run + +Относительно новая директория в Линукс. Здесь хранятся необходимые приложениям временные файлы — сокеты, идентификаторы процессов и другие. В отличие от каталога /tmp данные в /run нельзя удалить. + +## Типы файлов в Linux + +Линукс подчиняется концепции «Всё есть файл», то есть работа с системой — это по сути взаимодействие с файлами. Применяются разные файлы, используемые как для стандартных данных, так и для устройств. + +Плюс этой концепции в том, что система не тратит ресурсы на реализацию отдельных API для каждого приложения, так как все стандартные программы и процессы реализуются через работу с файлами. + +Рассмотрим типы файлов, которые используются в Linux: + +- Обычные (regular). Это стандартные файлы, используемые чаще других — данные, текст, исходный код, медиа и все остальное; +- Файлы устройств. Сюда входят символьные и блочные файлы (char и block devices), представляющие внешние устройства — принтеры, жесткий диск и другие; +- Именованные каналы. Файлы named pipes требуются для взаимодействия между процессами и передачи данных; +- Ссылки. Используется два типа ссылок. Символические (так называемые симлинки) — работают как ярлыки для указания других каталогов и файлов; жесткие — отвечают за альтернативные способы доступа к физическим данным на диске и выступают дубликатами файлов, но без их фактического дублирования; +- Каталоги. Папки со ссылками на файлы и другие папки. Отвечают за организацию данных и их распределение по категориям, упрощают доступ к различным разделам; +- Сокеты. Файлы, предназначенные для обмена данными при выполнении рабочих задач. Используются как внутри системы, так и при взаимодействии устройств друг с другом. По сути, это своего рода почтовые службы, с помощью которых программы пересылают информацию друг другу; +- Двери. Еще один механизм, ответственный за взаимодействие между процессами.  + +В Линукс у каждого типа файла своя задача в системе управления. Такая схема работы обеспечивает мощность, придает ей гибкость и устойчивость. Поскольку внешние устройства представлены блочными файлами, с ними можно работать с помощью стандартных методов. + +## Управление файловой системой + +Через консоль управления (терминал) в Linux доступен целый арсенал для работы с директориями и файлами. + +Основные команды управления: + +- `Is`. Просмотр содержимого папки и навигация. При использовании с различными опциями возможности расширяются, например, команда ls -l создает  подробный список; +- `cd`. Путь к папке — меняет текущую директорию на указанную пользователем; +- `pwd`. Обозначает текущие местоположение юзера в структуре каталогов; +- `mkdir`. Используется для создания новой папки с присвоением ей имени; +- `cp`. Копирует файлы из исходной папки в целевую; +- `mv`. Перемещает или переименовывает каталоги и файлы; +- `rm`. Удаляет указанные файлы; +- `cat`. Выводит содержимое указанного файла в окно панели управления; +- `less`. Используется для постраничного пролистывания файла; +- `touch`. Создает новый пустой файл (с новым именем); +- `ln -s`. Генерирует символьную ссылку, указывающую на выбранный каталог или файл; +- `which`. Демонстрирует пошаговый путь к исполняемым файлам; +- `nano`. Используется для текстовой редактуры файла; +- `locate`. Применяется для поиска файлов по заданным шаблонам.  + +Указанные выше команды формируют основу для взаимодействия с ФС. При необходимости используется более расширенный список. + +## Монтирование и файловые системы Linux + +Монтирование — подключение файловых систем, жестких дисков и внешних носителей, получение доступа к ним, ручное и автоматическое отключение. При загрузке ядро устройства на Linux автоматически монтирует разделы, считывая данные из конфигурации /etc/fstab. + +При подключении устройств каталог ассоциируется с ними с помощью драйвера, которому передается сгенерированная ссылка. В случае успешного взаимодействия ядро вносит данные в таблицу монтирования. + +Монтирование системы реализуется с помощью команд mount и umount, подготавливающих устройства и точки монтирования. Они реализуют автоматическое подключение ФС. К виртуальной машине подключается диск /dev/sdc, на котором создаются разделы для файловой системы. После создания точки монтирования процесс загрузки ФС запускается. + +Какие файловые системы на Linux наиболее востребованные: + +- Ext. Первая ФС, разработанная специально для Линукс. Система значительно превзошла предыдущие решения по производительности и функционалу; +- Ext2. Улучшенная версия первой ФС. Повышает надежность, улучшает управление и позволяет работать с большим количеством данных и файлов; +- Ext3. Третье поколение ФС для Линукс. Поддерживает журналирование, что делает работу более стабильной и минимизирует риски потери данных после сбоев системы; +- Ext4. Новейшая версия с повышенной эффективностью и масштабируемостью. Технически более совершенный вариант, упрощающий работу с большим объемом данных;  +- JFS. Разработка компании IBM. Эффективно использует ресурсы, отличается высокой производительностью, рассчитана на сильные нагрузки; +- XFS. Высокопроизводительная ФС, разработанная компанией SGI. Подходит для работы с серверами и системами хранения данных;  +- ReiserFS. Разработка программиста Ганса Райзера. Главная особенность — возможность при необходимости увеличивать размер блока, тем самым избегая фрагментации; +- Btrfs. Продукт компании Oracle. Обеспечивает гибкость при управлении данными, предоставляет опции оперативной проверки и восстановления файлов, интегрирует разные устройства в единую ФС;  +- Swap. Позволяет использовать дисковое пространство как виртуальную память, если физические возможности RAM исчерпаны. Технически этот инструмент нельзя назвать файловой системой, но он обеспечивает широкие возможности для управления данными в Линукс.  + +ОС Linux уникальна в плане адаптации к разным сценариям использования, поскольку поддерживает работу многих файловых систем. Функциональное разнообразие обогащает платформу, позволяя тестировать и внедрять в практику множество полезных инноваций. + +> При этом у пользователя всегда есть свобода выбора — например, между стабильностью линейки Ext и гибкими возможностями файловых систем XFS, JFS. Безграничные возможности выбора отражают дух сообщества Linux, где независимые разработчики постоянно предлагают новые решения, обеспечивая постоянное развитие экосистемы. \ No newline at end of file -- cgit v1.2.3