aboutsummaryrefslogtreecommitdiff
path: root/content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md')
-rw-r--r--content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md404
1 files changed, 404 insertions, 0 deletions
diff --git a/content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md b/content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md
new file mode 100644
index 0000000..34ad9d9
--- /dev/null
+++ b/content/weblog/2018-12-31_intro-to-linux-and-bash-pt2/index.ru.md
@@ -0,0 +1,404 @@
++++
+title = "Intro to Linux and the Bash command line, pt II"
+date = 2018-12-31T09:20:00Z
++++
+
+И так, год подходит к концу, и я так еще не написал вторую часть туториала про
+Bash и Linux. Надо бы написать хотя бы один пост в этом, последнем месяце года.
+
+<!-- more -->
+
+В этой части, я расскажу чуть больше про инструменты и команды в 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 возможных сочетании прав, и вот почему у нас восьмеричная система.
+Следующая таблица поможет определить отношение нужной цифры для определенного
+сочетания прав
+
+<table>
+ <tbody>
+ <tr>
+ <td>Восьмеричная система</td>
+ <td>Двоичная система</td>
+ </tr>
+ <tr>
+ <td>0</td>
+ <td>001</td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>001</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>010</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>011</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>100</td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td>101</td>
+ </tr>
+ <tr>
+ <td>6</td>
+ <td>110</td>
+ </tr>
+ <tr>
+ <td>7</td>
+ <td>111</td>
+ </tr>
+ </tbody>
+</table>
+
+Зная как переводятся цифры в двоичную становится намного проще знать к какой
+комбинации прав она относится, ибо каждая цифра в сочетании трех бинарных цифр
+относится к одному виду прав в выше указанному порядке (r, w, x). Если у нас
+единица (1) это означает что есть данное право, а ноль (0) означает его
+отсуствие. И так, например, 6 означает что у нас есть право на чтение и запись,
+поскольку 6 = 110 = rw-.
+
+Допустим что мы хотим поменять права доступа к файлу таким образом чтобы
+владелец мог читать, записывать и выполнять; группа имела право на чтения и
+выполнения; и остальные могли только выполнять. Для этого мы ввели что-то
+подобное
+
+```sh
+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. Например, допустим мы хотим поменять пользователя,
+которого владеет файлом
+
+```sh
+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, в любом случае
+быстрый поиск в интернете поможет вам найти информацию о том как поменять
+настройки прав в вашем дистрибутиве/ОС.
+
+А теперь допустим что вы хотели поменять и пользователя и группу которому
+принадлежит файл, в таком случае мы бы ввели следующее
+
+```sh
+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.
+
+## Эпилог/Советы
+
+В предыдущей части я забыл написать о том как ввести пути с пробедами. Нельзя
+просто так печатать пути с пробелами, ибо пробел означает переход к следующему
+аргументу.
+
+Есть два способа печатать пути, названия файлов и другие аргументы с пробелами.
+Первый способ - кавычки. Например
+
+```sh
+user@host:~/Documents$ rm "Shopping List.txt"
+```
+
+Второй - экранирования символа с помощью символа "\" перед пробелом. Например
+
+```sh
+user@host:~/Documents$ rm Shopping\ List.txt
+```
+
+Еще одно о чем я хотел рассказать - мануалы (man). Почти (если не все)
+дистрибутивы Линукса имеют мануалы.
+
+Не всегда необходимо обращаться к интернету если вы забыли как пользоваться
+определнной командой. Если вы однажды оказались без интернета и вы хотите
+узнать побольше об одной команде, man отличный оффлайн ресурс.
+
+Не говоря уже о том что проще и быстрее делать все сразу с терминала не
+переключаясь к браузеру чтобы искать нужную информацию.
+
+Чтобы прочитать мануал определенной команды, введите man и затем название
+команды. Например "man chmod".
+
+Вы можете пользоваться клавишами vim (hjkl) для перемещения. Введите /<термин>
+чтобы искать этот термин, а затем нажмите на n чтобы найти следующее совпадение.
+
+Это все на данный момент. С новым 2019-м годом!