04
Мар
2019

Bash: 23 продвинутые команды для глубокого изучения Linux

Знать всё: продвинутые команды Bash для глубокого погружения в терминал с разбором внутреннего устройства Linux. Bash Уже освоили команды Bash для новичков? Тогда двигаемся дальше, к продвинутому уровню.

Пробуждаем силу суперпользователя

Посмотрите на команду whoami, которая проверяет имя пользователя:
geekpress@proglib:~$ whoami
geekpress
А вот как можно запустить команду bash от имени другого пользователя, с sudo -u username:
geekpress@proglib:~$ sudo -u test touch def && ls -l
total 0
-rw-r--r-- 1 test test 0 Jan 11 20:05 def
Когда не указан флаг -u, команда выполняется от имени суперпользователя root без ограничений:
geekpress@proglib:~$ sudo touch ghi && ls -l
total 662936
-rw-r--r-- 1 root      root              0 Feb 27 14:35 ghi
drwxr-xr-x 4 geekpress geekpress      4096 Feb  5 23:54 go
Хотите стать другим пользователем? С su это реально. Чтобы вернуться в свою учетную запись, используйте exit:
geekpress@proglib:~$ su luser
Password: 
$ whoami
luser
$ exit

geekpress@proglib:~$ whoami
geekpress
Суперпользователь – единственный пользователь, который может устанавливать программы, создавать новых юзеров и все в таком духе. Иногда можно забыть об этом и получить ошибку:
geekpress@proglib:~$ apt install golang
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
Введите команду заново, используя sudo:
geekpress@proglib:~$ sudo apt install golang
Reading package lists...
Или используйте !! для возврата к предыдущей команде:
geekpress@proglib:~$ apt install golang
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

geekpress@proglib:~$ sudo !!
sudo apt install golang
Reading package lists...
По умолчанию после использования sudo система не запрашивает пароль в течении 15 минут. А вот далее для sudo нужно заново вводить пароль суперпользователя.

Разбираемся с правами доступа

Файлы доступны для чтения (r), записи (w) и исполнения (x) пользователям или группам. Просматривайте права доступа к файлам с помощью ls -l:
geekpress@proglib:~$ ls -lh
total 648M
-rw-r--r-- 1 root      root         0 Feb 27 14:35 ghi
drwxr-xr-x 4 geekpress geekpress 4.0K Feb  5 23:54 go
Права представлены первыми десятью символами. Первый символ представляет тип файла: d – директория, l – ссылка, - – файл. Дальше следуют три группы из трёх символов, которые отражают разрешения пользователя, владельца, группы и остальных пользователей. r означает, что группа или пользователь имеют права на чтение файла. w – это права на изменение, а x – на выполнение. Пока что ничего сложного, правда? Эти разрешения также представляются трехзначным числом, где x увеличивает значение на 1, w, если включен, – на 2 и r – на 4. Поэтому в бинарном представлении, директории выше имеют права доступа 644 и 755. Например r-x -> 101 -> 5. Следующие строки – имя и группа владельца. За ними следуют размер, дата последнего изменения и название файла. Флаг -h означает «human-readable» и печатает 4.0K вместо 4096 байт. chmod изменяет разрешения файла, устанавливая биты доступа:
geekpress@proglib:~$ chmod 777 public && chmod 000 topsecret && ls -h
total 750M
-rwxrwxrwx 1 geekpress geekpress    0 Feb 27 16:14 public
---------- 1 geekpress geekpress    0 Feb 27 16:14 topsecret
Или добавлением и удалением разрешений флагами + и -:
geekpress@proglib:~$ chmod +rwx topsecret && chmod -w public && ls -lh
chmod: public: new permissions are r-xrwxrwx, not r-xr-xr-x
total 750M
-r-xrwxrwx 1 geekpress geekpress    0 Feb 27 16:14 public
-rwxr-xr-x 1 geekpress geekpress    0 Feb 27 16:14 topsecret
chown изменяет владельца:
geekpress@proglib:~$ sudo chown luser public
chgrp меняет группу владельцев:
geekpress@proglib:~$ sudo chgrp luser 1 && ls -lh
total 750M
-rw-r--r-- 1 geekpress luser        0 Feb 27 16:48 1
-rw-r--r-- 1 geekpress geekpress    0 Feb 27 16:48 2
-rw-r--r-- 1 geekpress geekpress    0 Feb 27 16:48 3

Управляем пользователями и группами

Переходим к самому интересному списку команд bash, а именно к тем, которые затрагивают юзеров и группы. users отображает авторизованных пользователей. Некоторые из них могут быть авторизованы несколько раз, например, при разных сессиях ssh.
geekpress@proglib:~$ users
geekpress neo neo neo neo neo trinity trinity
Чтобы посмотреть всех пользователей (даже тех, кто не авторизован), проверьте /etc/passwd. Но не вносите изменения в файл! Вы можете повредить его и сделать невозможной авторизацию пользователей.
geekpress@proglib:~$ alias au="cut -d: -f1 /etc/passwd \
> | sort | uniq" && au
 _apt
agentsmith
geekpress...
Добавляйте пользователей командой useradd:
geekpress@proglib:~$ sudo useradd morpheus && au
_apt
agentsmith
morpheus...
Удаляйте их командой userdel:
geekpress@proglib:~$ sudo userdel agentsmith && au
_apt
geekpress
morpheus...
groups показывает группы, в которых состоит текущий пользователь:
geekpress@proglib:~$ groups
geekpress cdrom floppy sudo audio dip video plugdev netdev bluetooth
Нужно посмотреть все группы в системе? Для этого есть команда /etc/groups. Не модифицируйте файл, если не уверены в том, что делаете.
geekpress@proglib:~$ alias ag=“cut -d: -f1 /etc/group \
> | sort” && ag
adm
avahi
daemon...
Добавляйте группы с помощью groupadd:
geekpress@proglib:~$ sudo groupadd matrix && ag
adm
avahi
matrix...
А удаляйте посредством groupdel:
geekpress@proglib:~$ sudo groupdel matrix && ag
adm
avahi
daemon...

Работаем с текстом

uniq печатает повторяющиеся строки:
geekpress@proglib:~$ printf "hello\nBash" > a && printf "hello\nagain\nBash" > b
geekpress@proglib:~$ uniq a
hello
Bash
sort сортирует строки по алфавиту или номеру:
geekpress@proglib:~$ sort a
Bash
hello
diff покажет отличия между двумя файлами:
geekpress@proglib:~$ diff a b
1a2
> again
cmp показывает отличия в байтах:
geekpress@proglib:~$ cmp a b
a b differ: byte 7, line 2
cut используется для деления строки на разделы и подходит для обработки CSV. -d указывает символ деления, а -f – отрезок для печати:
geekpress@proglib:~$ printf "192.168.1.1" > z

geekpress@proglib:~$ cut -d'.' z -f2
168
sed меняет строки:
geekpress@proglib:~$ echo "abc" | sed s/abc/xyz/
xyz
Вообще, sed – чрезвычайно мощная утилита, и ее полное описание не представляется возможным в рамках данной статьи. Утилита является полной по Тьюрингу, поэтому может делать все, что доступно в любом другом языке программирования. sed работает с регулярными выражениями, печатает строки по шаблону, редактирует текстовые файлы и многое другое. Хотите узнать больше о чудо-команде? Не вопрос. Полезные ссылки для изучения sed:

Ищем и сопоставляем

grep ищет строки в файлах по заданному шаблону:
geekpress@proglib:~$ grep -e ".*go.*" ./README.md 
Some of the tools, `godoc` and `vet` for example, are included in binary Go
`go get`.
The easiest way to install is to run `go get -u golang.org/x/tools/...`. You can
also manually git clone the repository to `$GOPATH/src/golang.org/x/tools`.
...
Или по заданному слову:
geekpress@proglib:~$ grep "geekpress" /etc/passwd
geekpress:x:1000:1000:geekpress,,,:/home/geekpress:/bin/bash
Используйте расширенные регулярные выражения с помощью флага -E, сопоставляйте несколько строк одновременно (-F) и рекурсивно выполняйте поиск по файлам в каталоге (-r). awk – это язык сопоставления шаблонов, построенный для чтения и манипулирования файлами данных, таких как CSV. Как правило, grep хорош для поиска строк и шаблонов, sed – для замены строк в файлах, а awk – для извлечения строк и шаблонов в целях анализа. В качестве демонстрации способностей awk возьмем файл, содержащий два столбца данных:
geekpress@proglib:~$ printf "A 10\nB 20\nC 60" > file
Зациклим строки, добавим число к сумме, увеличим счетчик, найдем среднее:
geekpress@proglib:~$ awk 'BEGIN {sum=0; count=0; OFS=" "} {sum+=$2; count++} END {print "Average:", sum/count}' file
Average: 30
awk, как и sed, является полной по Тьюрингу. Обе команды чрезвычайно полезны в сопоставлении по шаблону и в обработке текста. Для их описания будет мало и книги, поэтому читайте о них больше в отдельных статьях!

Копируем файлы по SSH

ssh – это сетевой протокол взаимодействия машин под управлением Unix-подобных ОС:
geekpress@proglib:~$ ssh –p <port> geekpress@192.xxx.xxx.100
Last login: Thu Feb 28 13:33:30 2019 from 192.xxx.xxx.102
Заметьте, как поменялось приглашение после авторизации на другой машине:
geekpress@office exit
logout
Connection to 192.xxx.xxx.100 closed.
Создадим новый файл на своей машине:
geekpress@proglib:~$ echo "blabla" > blabla
Скопируем файл на удаленный компьютер с помощью scp:
geekpress@proglib:~$ scp –P <port> blabla geekpress@192.xxx.xxx.100:~
blabla                                         100%    0     0.0KB/s   00:00
Зайдем на удаленную машину:
geekpress@proglib:~$ ssh –p <port> andrew@192.xxx.xxx.100
Last login: Thu Feb 28 13:45:30 2019 from 192.xxx.xxx.102
И увидим наш файл:
geekpress@office:~$ ls
blabla  projects  pdfs

geekpress@office:~$ cat blabla
blabla
А как насчет оптимизации процесса? Здесь пригодится rsync – инструмент копирования файлов, который минимизирует объем копируемых данных путем поиска различий между файлами. Предположим, есть директории a и b, содержащие один и два файла соответственно:
geekpress@proglib:~/a$ ls && ls ../b
file0
file0  file1
Синхронизируем директории, копируя только отсутствующие файлы:
geekpress@proglib:~/a$ rsync -av ../b/* .
sending incremental file list...
Теперь a и b содержат одинаковые файлы:
geekpress@proglib:~/a$ ls
file0 file1
rsync работает по ssh:
geekpress@office:~/dir0$ ls

geekpress@office:~/dir0$ rsync -avz -e "ssh -p <port>" geekpress@192.xxx.xxx.102:~/dir1/* .
receiving incremental file list
file 0
file 1

sent 44 bytes  received 99 bytes  128.88 bytes/sec
total size is 0  speedup is 0.00

geekpress@office:~/dir0$ ls
file 0  file 1

Запускаем длительные процессы

Иногда соединение ssh может прерваться из-за неполадок с сетью или оборудованием. При этом процессы, запущенные отключившимся пользователем, прерываются. Команда nohup предотвращает прерывания процессов даже после отключения пользователя. Отличная страховка! Вот как ею пользоваться. Запустим команду yes с nohup:
geekpress@proglib:~$ nohup yes &
[1] 31232
ps покажет процессы, запущенные текущим пользователем:
geekpress@proglib:~$ ps | sed -n '/yes/p'
31283 pts/0    00:00:07 yes
Теперь выйдем из сессии, зайдем снова и увидим, что процесс исчез:
geekpress@proglib:~$ ps | sed -n '/yes/p'
Но постойте! Процесс виден в выводе команд top и htop:
geekpress@proglib:~$ top -bn 1 | sed -n '/yes/p'
31578 anatoly   20   0    5840    760    688 D   0.0  0.0   0:00.69 yes
Завершим процесс командой kill -9 с указанием PID:
geekpress@proglib:~$ kill -9 31578
[1]+  Killed                  nohup yes
Проверим видимость в top и увидим, что процесса нет, потому что он был завершен:
geekpress@proglib:~$ top -bn 1 | sed -n '/yes/p'
cron предоставляет легкие автоматизацию и планирование. Можно настроить задачи в текстовом редакторе командой crontab -e. Вставим следующую строку:
* * * * * date >> ~/datefile.txt
Теперь cron вызывает команду date каждую минуты и записывает вывод в текстовый файл оператором >>:
geekpress@proglib:~$ head ~/datefile.txt
Thu Feb 28 17:06:01 GMT 2019
Thu Feb 28 17:07:01 GMT 2019
Thu Feb 28 17:08:01 GMT 2019
Удалите строку в crontab, чтобы остановить выполнение задачи. cron можно настроить на выполнение задач поминутно в течении каждого часа (0 — 59), ежечасно в течении дня (0-23), ежедневно в течении месяца (1-31), ежемесячно в течении года (1-12) или в указанные дни недели (0-6, Пн-Вс). Это отображается пятью звездочками в начале. Замените звезды нужным числом, чтобы настроить расписание.
Share

Тебе может это понравится...