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

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

Уже освоили команды 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, Пн-Вс). Это отображается пятью звездочками в начале. Замените звезды нужным числом, чтобы настроить расписание.

Хотите больше команд Bash и информации о Linux? Вас заинтересуют:

Источник: 101 команда Bash для начинающих и экспертов

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ