Введение в Linux и Bash, часть II

Published Dec 31, 2018 09:20 UTC on Yaroslav's weblog

И так, год подходит к концу, и я так еще не написал вторую часть туториала про Bash и Linux. Надо бы написать хотя бы один пост в этом, последнем месяце года.

В этой части, я расскажу чуть больше про инструменты и команды в Linux и Unix-подобных системах, которые вам пригодятся при работе в терминале. Все или большинство из этих программ являются частью основного набора программ и утилит большинства бистрибутивов Linux и Unix/Unix-подобных систем.

Работа с файлами

В предыдущей части я стал объяснять подробно как работать с файлами. Однако, возможность манипулировать файлы является очень полезным и важным функционалом компьютерных систем.

Создать файл

Обычно, если хотим создать файл, мы используем определенную программу специально предназначена для создания и редактирования определенного вида файлов. Например, vim для редактирования и записи текстовых файлов. Однако есть утилита которая позволяет создавать пустые файлы - touch.

Вы можете создать пустой файл введя touch и последовательно название или путь файла который вы хотите создать, например

user@host:~$ touch example.txt

А теперь у нас пустой файл в "/home/user/example.txt". Но, я немного соврал, когда сказал что данная команда для того чтобы создавать пустые файлы. На самом деле, она сначала проверяет наличия файла, затем, если он существует, она редактировает его даты и время доступа и редактирования, иначе он создает пустой файл, как в данном случае. Очень редко когда данная команда на самом деле понадобится, поскольку в большинство случаях сами программы для редактирования файлов могут также их создавать. Тем не менее бывают случаи когда она может пригодится.

Создать директорий

Сейчас у нас будет что-то поинтереснее, как создать директорий. Создавать директории довольно просто, команда - mkdir. Например

user@host:~$ mkdir foo

Мы только что создали директорий "foo" в "/home/user/". Не забудьте что мы всегда передаем путь файла, будь они относительными или абсолютными (если вы не помните что это значит, прочитайте первую часть). В данном случае, мы используем относительный путь содержающий только название директория.

Если бы мы использовали абсолютный путь, он выглядел бы таким образом - "/home/user/foo". Нам бы пришлось убедиться в том что директории "home" и "user" существуют. Однако, существует очень подезный флажок, которые мы можем передать команде, чтобы она создавала родительские директории при необходимости - -p

user@host:~$ mkdir -p /tmp/foo/bar

Если директории "tmp" и/или "foo" не существуют, он их автоматический сделает, вместе с "bar" внутри их.

Перемещение и переименования

Это довольно просто, и обе действия можно выполнить одной командой - mv, что происходит с английского move.

Если вам необходимо переименовать файл или директорий, переместите его в тот же самый директорий, с новым/другим названием, например

user@host:~$ mv untitled titled

А вот если потребуется переместить в другую локацию, просто укажите путь новой локации в качестве второго аргумента. Не забудьте что оба аргумента являются путями, либо относительными либо абсолютными

user@host:~$ mv titled Documents/titled

Копировать

Копирование похоже на перемещения, отличие просто в названии команды - cp.

user@host:~$ cp titled Documents/titled2

Однако, копирование директории отличается немного от копирования файлов. Чтобы копировать директории, нужно использовать флаг -r. Он указывает что операция должна быть рекурсивной, то есть, нужно скопировать каждый файл и поддиректорию внутри директории (и файлы внутри этих поддиректории и в поддиректории поддиректории и... ну то есть, рекурсия) в указанный путь. То есть что-то похоже на это

user@host:~$ cp -r dir dir-copy

Удалить

Удалять файлы довольно просто, достаточно ввести rm а затем путь файла

user@host:~$ rm title

Однако, чтобы удалять директории не так просто. Один способ - использовать команду rmdir, но она только работает на пустых директориях.

Второй вариант, использовать ту же команду что и для файлов, но используя флаг -r чтобы удалить файлы рекурсивно, также как и с командой cp. Будьте внимательные при использовании этой команды, ибо она удаляет все файлы внутри директории, вместе с директорией.

Итак, чтобы удалить директорию и все содержимое, нам понадобиться ввести следующую команду

user@host:~$ rm -r dir

У этой команды есть еще один флаг, чтобы принудительно удалить файлы без вопросов - флаг -f. Этот аргумент может пригодится, например, когда нужно удалить сразу несколько файлов, и среди них есть специльные файлы, как скрытые файлы (те, у которых точка перед названием) и вам не хочется подтвердить действие перед каждым файлом.

Следует быть ОЧЕНЬ осторожным перед тем как использовать этот флаг, особенно если вы собираетесь ввести команду под root пользователем. Поверьте, вам будет очень неприятно если вы введете например "sudo rm -rf /" и у вас полетят полностью система и файлы. Если вы не садист, конечно.

Пример ситуации когда данное сочетание флагов с командой rm может пригодится это, когда вам необходимо удалить репозиторий git, поскольку в них содержатся множество специальных скрытых файлов, которые git использует затем чтобы следить за коммитами и прочее. Пример использования команды

user@host:~$ rm -rf somerepo

Контроль доступа

В Unix и Unix-подобных системах существует довольно прочная система для контроля прав доступа. Она позволяет определять полномочия определеных пользователей или групп пользователей над определенными файлам, создавая безопасную среду для компьютеров с множество пользователями.

У каждого файла три вида прав доступа, которые определяют что можно с ними делать. Каждое право обозначается одной буквой английского алфавита

  • r - чтение: пользователь имеет право читать данный файл.
  • w - запись: пользователь может писать/редактровать данный файл (включая возможность его удалять).
  • x - выполнение: файл может быть выполнен пользователем, если он является программой или скриптом.

Так же существует три разных наборов человек к которым могут относится права доступа

  • u - пользователь/владелец: пользователь, которому принадлежит файл. Обычно это тот же самый пользователь, который создал файл, но владелца можно поменять.
  • g - группа: каждый принадлежит определенной группе пользователей. Это может быть группа одного пользователя (у каждого пользователя есть своя однопользовательская группа), или общая группа.
  • o - другие: Все остальные кто не являются владелцем или ну состоит в группе.

Если вы читали первую часть туториала, вы наверное помните что я рассказывал про команду "ls -l" чтобы посмотреть дополнительную информацию о файлах, включая права доступа

user@host:~/Documents$ ls -l
drwxr-xr-x  2 user user  4.0K Jul  18 04:20 Books
-rwxr-xr--  1 user group 350  Jul  18 04:20 run.py
-rw-r--r--  1 user user  1.2M Jul  18 04:20 picture.png

Первые десять символов в каждой строке - права доступа для файла в данной строке.

Первый символ в данном сочетаний символов определяет является ли файл обычным файлом или другим видом. Если первым символом является буква d, то это директория, если там просто черточка (тире/дефис), то это обычный файл. Там также может быть другая буква, как например l для ссылок, но это уже не входит в рамках данного поста.

Следующие 9 символов разделяются в свое время в сочетание из трех символов, каждое для определенного набора пользователей. Первые три символа после символа вида файла это права для владелца, следующие три для группы, и последние три для отсальных.

В каждом из этих сочетании из трех букв, права доступа в порядке чтение, запись, выполнение. Наличие буквы означает что у данного набора пользвателей данно это право, отсуствие значит нет такого права для данного набора пользоваетелей.

Возьмем в качестве примера файл "run.py". Исходя из информации на экране мы можем определить что это обычный файл (нет буквы d), владелец (user) имеет право читать, записывать и выполнять его; группа пользователей (в группе group) имеет право на чтение и выполнения, но не записи; и остальные только могут его читать.

Наверное вы заметили что почти всегда у директории присуствует право на выполнение (буква x), однако это означает что-то немножко иное в отличие от файлов. Буква "x" у директориях означает что есть право на вход в директорию и есть доступ к файлам внутри директории. Право на чтения директории всего лишь означает что можно смотреть на то какие файлы содержатся в директории, и право на запись означает что есть то чтобы записывать файла внутри директории.

Изменить права

Существует очень полезная команда которая позволяет менять права на доступ файлов - chmod.

Чтобы изменить права на файле, необходимо ввести chmod и затем права и путь файла. Есть два способа чтобы менять права, легкий но более долгий способ используя буквы, и более быстрый но не совсем легкий используя восмеричный код. Начнем с более легкого.

Более легкий способ состоит из трех частей

  • Кто - пользователь/владелец, группа, остальные или все (u, g, o, или a)
  • Дать или отменить право, "+" чтобы дать, "-" чтобы отменить
  • Право которое мы меняем - чтение, запись или испольнение (r, w, или x)

Допустим у нас есть скрипт для которого мы хотим дать право на запуск для всех пользователей.

user@host:~/Documents/stuff$ ls -l
-rw-r--r-- 1 user group  420  April 20 6:59  script.sh
user@host:~/Documents/stuff$ chmod a+x script.sh
-rwxr-xr-x 1 user group  420  April 20 6:59  script.sh

Как можно заметить, после запуска команды все пользователи компьютера имеют право на выполнения скрипта. А теперь допустим что мы передумали и хотим отменить право выполнения для всех пользователей кроме владелца, мы могли бы ввести o-r и затем g-r, но мы можем также совмещать следующим образом

user@host:~/Documents/stuff$ chmod go-r script.sh
-rwx--x--x 1 user group  420  April 20 6:59  script.sh

А теперь пора выучить быстрый способ. Его сложнее запомнить, поскольку еще нужны базовые понимания двоичной системы счисления. Грубо говоря, оно работает подовая три цифры в восьмеричной системе счисления (то есть 0-7) каждая из которых обозначает бит права для каждого набора пользователей (пользователь/владелец, группа, другие).

Получается у нас три возможные права (чтение, запись и выполнение) и 2^3 нам дает 8 возможных сочетании прав, и вот почему у нас восьмеричная система. Следующая таблица поможет определить отношение нужной цифры для определенного сочетания прав

Восьмеричная система Двоичная система
0 001
1 001
2 010
3 011
4 100
5 101
6 110
7 111

Зная как переводятся цифры в двоичную становится намного проще знать к какой комбинации прав она относится, ибо каждая цифра в сочетании трех бинарных цифр относится к одному виду прав в выше указанному порядке (r, w, x). Если у нас единица (1) это означает что есть данное право, а ноль (0) означает его отсуствие. И так, например, 6 означает что у нас есть право на чтение и запись, поскольку 6 = 110 = rw-.

Допустим что мы хотим поменять права доступа к файлу таким образом чтобы владелец мог читать, записывать и выполнять; группа имела право на чтения и выполнения; и остальные могли только выполнять. Для этого мы ввели что-то подобное

user@host:~/Documents/stuff$ chmod 751 script.sh
user@host:~/Documents/stuff$ ls -l
-rwxr-x--x 1 user group  420  April 20 6:59  script.sh

Если вы меняете права доступа директория, новые права будут изменены только для самой директории, не включая файлы и поддиректории внутри. Чтобы также изменить права для всех файлов внутри директории, необходимо использовать флаг рекурсии - -R (обратите внимания на то что, в chmod флаг рекурсии обозначается большой буквой R в отличие от cp или rm).

Поменять владелца

Менять владельца файла проще чем менять права. Чтобы поменять владельца необходимо использовать команду chown. Например, допустим мы хотим поменять пользователя, которого владеет файлом

user@host:~/.logs$ ls -l
-rw-r--r-- 1 root root  69  April 20 6:59  some.log
user@host:~/.logs$ sudo chown user some.log
user@host:~/.logs$ ls -l
-rw-r--r-- 1 user root  69  April 20 6:59  some.log

Поскольку файл не принадлежал тому же самому владельцу с которого мы выполняем команды, нам необходимо выполнить команду через sudo чтобы повысить наши права. Чтобы иметь возможность повышать права вашего пользователя, необходимо чтобы ваш пользователь состоял в файле "sudoers" и/или в группе "wheel" зависимо от дистрибутива/ОС. В большинство случаев (если вы пользуетесь "домашним/дестктопным" дистро) у вас уже будут права на sudo, в любом случае быстрый поиск в интернете поможет вам найти информацию о том как поменять настройки прав в вашем дистрибутиве/ОС.

А теперь допустим что вы хотели поменять и пользователя и группу которому принадлежит файл, в таком случае мы бы ввели следующее

user@host:~/.logs$ ls -l
-rw-r--r-- 1 root root  69  April 20 6:59  some.log
user@host:~/.logs$ sudo chown user:group some.log
user@host:~/.logs$ ls -l
-rw-r--r-- 1 user group  69  April 20 6:59  some.log

Также как и с chmod, если вам необходимо поменять владелца рекурсивной в директории, вам нужно использовать флаг -R.

Эпилог/Советы

В предыдущей части я забыл написать о том как ввести пути с пробедами. Нельзя просто так печатать пути с пробелами, ибо пробел означает переход к следующему аргументу.

Есть два способа печатать пути, названия файлов и другие аргументы с пробелами. Первый способ - кавычки. Например

user@host:~/Documents$ rm "Shopping List.txt"

Второй - экранирования символа с помощью символа "" перед пробелом. Например

user@host:~/Documents$ rm Shopping\ List.txt

Еще одно о чем я хотел рассказать - мануалы (man). Почти (если не все) дистрибутивы Линукса имеют мануалы.

Не всегда необходимо обращаться к интернету если вы забыли как пользоваться определнной командой. Если вы однажды оказались без интернета и вы хотите узнать побольше об одной команде, man отличный оффлайн ресурс.

Не говоря уже о том что проще и быстрее делать все сразу с терминала не переключаясь к браузеру чтобы искать нужную информацию.

Чтобы прочитать мануал определенной команды, введите man и затем название команды. Например "man chmod".

Вы можете пользоваться клавишами vim (hjkl) для перемещения. Введите /<термин> чтобы искать этот термин, а затем нажмите на n чтобы найти следующее совпадение.

Это все на данный момент. С новым 2019-м годом!