+++ title = "Введение в Linux и Bash, часть II" date = 2018-12-31T09:20:00Z +++ И так, год подходит к концу, и я так еще не написал вторую часть туториала про Bash и Linux. Надо бы написать хотя бы один пост в этом, последнем месяце года. В этой части, я расскажу чуть больше про инструменты и команды в Linux и Unix-подобных системах, которые вам пригодятся при работе в терминале. Все или большинство из этих программ являются частью основного набора программ и утилит большинства бистрибутивов Linux и Unix/Unix-подобных систем. ## Работа с файлами В предыдущей части я стал объяснять подробно как работать с файлами. Однако, возможность манипулировать файлы является очень полезным и важным функционалом компьютерных систем. ### Создать файл Обычно, если хотим создать файл, мы используем определенную программу специально предназначена для создания и редактирования определенного вида файлов. Например, vim для редактирования и записи текстовых файлов. Однако есть утилита которая позволяет создавать пустые файлы - touch. Вы можете создать пустой файл введя touch и последовательно название или путь файла который вы хотите создать, например ```sh user@host:~$ touch example.txt ``` А теперь у нас пустой файл в "/home/user/example.txt". Но, я немного соврал, когда сказал что данная команда для того чтобы создавать пустые файлы. На самом деле, она сначала проверяет наличия файла, затем, если он существует, она редактировает его даты и время доступа и редактирования, иначе он создает пустой файл, как в данном случае. Очень редко когда данная команда на самом деле понадобится, поскольку в большинство случаях сами программы для редактирования файлов могут также их создавать. Тем не менее бывают случаи когда она может пригодится. ### Создать директорий Сейчас у нас будет что-то поинтереснее, как создать директорий. Создавать директории довольно просто, команда - mkdir. Например ```sh user@host:~$ mkdir foo ``` Мы только что создали директорий "foo" в "/home/user/". Не забудьте что мы всегда передаем путь файла, будь они относительными или абсолютными (если вы не помните что это значит, прочитайте первую часть). В данном случае, мы используем относительный путь содержающий только название директория. Если бы мы использовали абсолютный путь, он выглядел бы таким образом - "/home/user/foo". Нам бы пришлось убедиться в том что директории "home" и "user" существуют. Однако, существует очень подезный флажок, которые мы можем передать команде, чтобы она создавала родительские директории при необходимости - -p ```sh user@host:~$ mkdir -p /tmp/foo/bar ``` Если директории "tmp" и/или "foo" не существуют, он их автоматический сделает, вместе с "bar" внутри их. ### Перемещение и переименования Это довольно просто, и обе действия можно выполнить одной командой - mv, что происходит с английского move. Если вам необходимо переименовать файл или директорий, переместите его в тот же самый директорий, с новым/другим названием, например ```sh user@host:~$ mv untitled titled ``` А вот если потребуется переместить в другую локацию, просто укажите путь новой локации в качестве второго аргумента. Не забудьте что оба аргумента являются путями, либо относительными либо абсолютными ```sh user@host:~$ mv titled Documents/titled ``` ### Копировать Копирование похоже на перемещения, отличие просто в названии команды - cp. ```sh user@host:~$ cp titled Documents/titled2 ``` Однако, копирование директории отличается немного от копирования файлов. Чтобы копировать директории, нужно использовать флаг -r. Он указывает что операция должна быть рекурсивной, то есть, нужно скопировать каждый файл и поддиректорию внутри директории (и файлы внутри этих поддиректории и в поддиректории поддиректории и... ну то есть, рекурсия) в указанный путь. То есть что-то похоже на это ```sh user@host:~$ cp -r dir dir-copy ``` ### Удалить Удалять файлы довольно просто, достаточно ввести rm а затем путь файла ```sh user@host:~$ rm title ``` Однако, чтобы удалять директории не так просто. Один способ - использовать команду rmdir, но она только работает на пустых директориях. Второй вариант, использовать ту же команду что и для файлов, но используя флаг -r чтобы удалить файлы рекурсивно, также как и с командой cp. Будьте внимательные при использовании этой команды, ибо она удаляет все файлы внутри директории, вместе с директорией. Итак, чтобы удалить директорию и все содержимое, нам понадобиться ввести следующую команду ```sh user@host:~$ rm -r dir ``` У этой команды есть еще один флаг, чтобы принудительно удалить файлы без вопросов - флаг -f. Этот аргумент может пригодится, например, когда нужно удалить сразу несколько файлов, и среди них есть специльные файлы, как скрытые файлы (те, у которых точка перед названием) и вам не хочется подтвердить действие перед каждым файлом. Следует быть ОЧЕНЬ осторожным перед тем как использовать этот флаг, особенно если вы собираетесь ввести команду под root пользователем. Поверьте, вам будет очень неприятно если вы введете например "sudo rm -rf /" и у вас полетят полностью система и файлы. Если вы не садист, конечно. Пример ситуации когда данное сочетание флагов с командой rm может пригодится это, когда вам необходимо удалить репозиторий git, поскольку в них содержатся множество специальных скрытых файлов, которые git использует затем чтобы следить за коммитами и прочее. Пример использования команды ```sh user@host:~$ rm -rf somerepo ``` ### Контроль доступа В Unix и Unix-подобных системах существует довольно прочная система для контроля прав доступа. Она позволяет определять полномочия определеных пользователей или групп пользователей над определенными файлам, создавая безопасную среду для компьютеров с множество пользователями. У каждого файла три вида прав доступа, которые определяют что можно с ними делать. Каждое право обозначается одной буквой английского алфавита * r - чтение: пользователь имеет право читать данный файл. * w - запись: пользователь может писать/редактровать данный файл (включая возможность его удалять). * x - выполнение: файл может быть выполнен пользователем, если он является программой или скриптом. Так же существует три разных наборов человек к которым могут относится права доступа * u - пользователь/владелец: пользователь, которому принадлежит файл. Обычно это тот же самый пользователь, который создал файл, но владелца можно поменять. * g - группа: каждый принадлежит определенной группе пользователей. Это может быть группа одного пользователя (у каждого пользователя есть своя однопользовательская группа), или общая группа. * o - другие: Все остальные кто не являются владелцем или ну состоит в группе. Если вы читали первую часть туториала, вы наверное помните что я рассказывал про команду "ls -l" чтобы посмотреть дополнительную информацию о файлах, включая права доступа ```sh 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) Допустим у нас есть скрипт для которого мы хотим дать право на запуск для всех пользователей. ```sh 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, но мы можем также совмещать следующим образом ```sh 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 |