Статьи

Командная строка — ваш лучший друг

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


Да, это тот белый (или зеленый) на черном экране, где таинственный текст течет и странные команды выполняются. Я знаю замечательных программистов, которые никогда не используют CLI; Тем не менее, я также знаю основных пользователей компьютеров, которые делают все в CLI вместо графического интерфейса пользователя (GUI). У них есть консольные приложения для просмотра веб-страниц и файловой системы, чтения почты, просмотра изображений и редактирования текста. Они даже смотрят видео на YouTube и читают PDF-файлы без графического интерфейса!

Каждый человек должен найти свой лучший рабочий процесс. Некоторые предпочитают графический интерфейс, а другие наслаждаются CLI.

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


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

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

Каждый человек должен найти свой лучший рабочий процесс.

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

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

Консоли и терминалы в конечном итоге объединяются в одно устройство, наиболее известным из которых является терминал VT, эмулированный в современных дистрибутивах Linux.

Оболочка — это настоящая программа, способная считывать вводимые пользователем данные и отображать результат на экране. Оболочка может быть текстовой (как CLI) или графической (как Windows GUI). В современных вычислениях оболочка — это гораздо больше, чем простой интерфейс между пользователем и системой. Он отвечает за управление процессами, окнами, приложениями, командами и другими аспектами системы.

CLI — это оболочка, которая предлагает пользователю текстовый интерфейс.

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

В большинстве современных дистрибутивов Linux, а также Mac OSX используется оболочка, называемая BASH. Solaris и OpenIndiana по умолчанию используют KornShell, что является еще одним вариантом BASH. Обратите внимание, что этот урок будет сосредоточен на BASH.

Пользователи Windows также могут использовать BASH. Распространяется с Cygwin и MinGW.


В большинстве современных дистрибутивов Linux, а также Mac OSX используется оболочка, называемая BASH.

BASH расшифровывается как Bourne Again Shell. Он был выпущен в 1989 году как реинкарнация Bourne Shell, тогдашней оболочки по умолчанию в системах Unix. Он был запрограммирован Стивеном Борном и пришел на смену Thompson Shell, первому программному обеспечению для UNIX. Старая оболочка Bourne Shell все еще присутствует в некоторых системах Unix. Обычно вы можете найти его как /bin/sh . Однако даже это было заменено на BASH в большинстве современных дистрибутивов; Оба /bin/sh и /bin/bash являются исполняемыми файлами для BASH.

Единственное, что у вас всегда будет, это подсказка BASH. Это история сама по себе, и мы могли бы потратить весь этот урок на то, как ее настроить и персонализировать. Вместо этого мы обсудим только основы в этом уроке.

1
csaba@csaba-pc ~/Personal/Programming/NetTuts $

Вот как выглядит моя подсказка. Первым словом, csaba является мое имя пользователя, затем @ и имя хоста моего компьютера, а затем текущая папка. Символ » ~ » обозначает домашний каталог текущего пользователя — /home/csaba , в моем случае. Строка заканчивается на $ . Все, что я печатаю после $ это команда, которую я хочу, чтобы моя оболочка выполнила.

Root is Special: если вы являетесь пользователем root, приглашение заканчивается символом # вместо $ .

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

BASH имеет набор специальных переменных PS1 , PS2 , PS3 и PS4 , которые управляют содержимым подсказки на разных этапах выполнения программы. Мы будем говорить только о PS1 в этом уроке. Вы можете проверить, что содержит переменная PS1 с помощью следующей команды:

1
2
csaba@csaba-pc ~/Personal/Programming/NetTuts $ echo $PS1
\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]

Здесь вы видите мою подсказку, за которой следует команда echo $PS1 и вывод команды. В BASH вы ставите знак доллара перед именем переменной, когда хотите прочитать ее содержимое. Команда echo просто выводит все, что получает в качестве параметра. Если параметр является переменной, его значение отображается на экране.

Выход представляет формат. \[\033[01;32m\] — это код цвета для зеленого, а \u представляет имя пользователя текущего пользователя. Маркер \h обозначает имя хоста, а \[\033[01;34m\] — это код цвета для синего цвета. \w — текущий каталог, а \[\033[00m\] — светло-серый цвет для всего, что следует (команды, которые я печатаю). Ниже приведен скриншот, чтобы вы могли лучше визуализировать результат.

Есть специальные символы, которым предшествует «\», которые имеют свое особое значение. В противном случае «\» обозначает escape-символ для последующего (как в цветовых кодах). Ниже приведен полный список специальных символов, которые вы можете использовать в приглашении BASH, приведенный в официальном руководстве BASH:

  • \a — символ колокольчика ASCII (07)
  • \d — дата в формате «день недели месяц дата» (например, «вторник 26 мая»)
  • \D{format} — формат передается в strftime (3), а результат вставляется в строку приглашения; пустой формат приводит к представлению времени, зависящему от локали. Брекеты обязательны
  • \e — escape-символ ASCII (033)
  • \h — имя хоста до первого `. ‘
  • \H — имя хоста
  • \j — количество заданий, которыми в данный момент управляет оболочка
  • \l — базовое имя терминального устройства оболочки
  • \n — перевод строки
  • \r — возврат каретки
  • Каждая из этих команд способна на большее, чем то, что я рассмотрел в этом уроке.

  • \s — имя оболочки, базовое имя $ 0 (часть после последней косой черты)
  • \T — текущее время в 12-часовом формате ЧЧ: ММ: СС
  • \t — текущее время в 24-часовом формате ЧЧ: ММ: СС
  • \@ — текущее время в 12-часовом формате
  • \A — текущее время в 24-часовом формате ЧЧ: ММ
  • \u — имя пользователя текущего пользователя
  • \v — версия bash (например, 2.00)
  • \V — выпуск bash, версия + уровень патча (например, 2.00.0)
  • \w — текущий рабочий каталог с сокращением $ HOME тильдой (использует значение переменной PROMPT_DIRTRIM)
  • \W — базовое имя текущего рабочего каталога, с $ HOME, сокращенным до тильды
  • \! — номер истории этой команды
  • \# — номер команды этой команды
  • \$ — если эффективный UID равен 0, a #, иначе $
  • \nnn — символ, соответствующий восьмеричному числу nnn
  • \\ — обратный слеш
  • \[ — начать последовательность непечатаемых символов, которые можно использовать для встраивания последовательности управления терминалом в приглашение
  • \] — завершить последовательность непечатаемых символов

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
csaba@csaba-pc ~ $ mkdir ~/tmp/NetTuts
csaba@csaba-pc ~ $ cd ~/tmp/NetTuts/
csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./AnotherDir
csaba@csaba-pc ~/tmp/NetTuts $ mkdir ./SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/aFile
csaba@csaba-pc ~/tmp/NetTuts $ touch ./SecondDir/AnotherFile
csaba@csaba-pc ~/tmp/NetTuts $ cd ./SecondDir/
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ pushd ~/tmp/NetTuts
~/tmp/NetTuts ~/tmp/NetTuts/SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 16
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ popd
~/tmp/NetTuts/SecondDir
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al
total 8
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 aFile
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 AnotherFile
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $

Построчное объяснение:

Если вы root, приглашение заканчивается символом # вместо $ .

  1. Создайте каталог с именем NetTuts в / home / csaba / tmp.
  2. Измените текущий каталог на новый созданный каталог.
  3. Создайте каталог с именем «AnotherDir» внутри текущего каталога.
  4. Создайте каталог с именем «SecondDir» внутри текущего каталога.
  5. Создайте два пустых файла внутри «SecondDir» с помощью сенсорной команды.
  6. Измените текущий каталог на SecondDir.
  7. Используйте pushd, чтобы изменить каталог на ~ / tmp / NetTuts, чтобы поместить наш текущий каталог в стек.
  8. Список всех файлов в ~ / tmp / NetTuts
  9. Вернитесь в наш предыдущий каталог, введя команду popd, которая извлекает (и удаляет) верхний каталог из стека.
  10. Перечислите снова содержимое и увидите два файла, которые мы создали несколькими шагами выше.

Конечно, у вас есть всемогущий файловый менеджер для командной строки, который называется Midnight Commander. Просто запустите mc commdn, чтобы начать его использовать. Он также имеет встроенный текстовый редактор (с подсветкой кода) для большого количества языков, а также интеллектуальные отступы и другие функции. Это не полноценный редактор, на самом деле это довольно простой инструмент для простого и быстрого редактирования. Вы можете просто выбрать любой файл и нажать F4, или вы можете открыть файл прямо в редакторе, не запуская mc.

1
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ mcedit ./aFile

Каждая команда должна взаимодействовать со средой командной строки. Команды требуют ввода и обеспечения вывода. Стандартный ввод относится к источнику, откуда команда может читать информацию. Это клавиатура по умолчанию, и ее часто называют «stdin». Стандартный вывод — это место, куда будет отправлен вывод команды. По умолчанию это текущая консоль, и ее обычно называют «stdout». Стандартная ошибка относится к месту, где команда выводит свои ошибки. Это текущая консоль по умолчанию, и многие называют ее «stderr».

То, что мы определили до сих пор, просто утверждает, что команда может читать с клавиатуры и выводить свои результаты, как хорошие, так и плохие, на экран.

В Unix (и подобных системах) все является файлом. Ваша клавиатура — это файл, ваша мышь — это файл, ваш экран — это файл, программы — в файлах, текст — в файлах и т. Д.

Файловый дескриптор — это целое число, которое ядро ​​операционной системы использует для ссылки на открытые файлы. Каждая система имеет как минимум три файловых дескриптора:

  • Дескриптор № 0 — стандартный ввод.
  • Дескриптор № 1 — стандартный вывод.
  • Дескриптор № 2 — стандартная ошибка.

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

1
$ someCommand <

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

1
$ someCommand < /your/file.txt

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

1
2
3
4
5
6
7
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al
total 8
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 aFile
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 AnotherFile
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $

Вы можете отправить этот результат в файл с помощью следующей команды:

1
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ ls -al > ./ThirdFile

Содержание ThirdFile:

1
2
3
4
5
6
total 12
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r—r— 1 csaba csaba 12 Feb 19 21:19 aFile
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 AnotherFile
-rw-r—r— 1 csaba csaba 0 Feb 24 00:06 ThirdFile

Допустим, мы хотим перейти к родительской папке, перечислить все ее файлы и использовать команду для добавления списка в существующий файл. Оператор > перенаправляет вывод в файл и перезаписывает этот файл; поэтому мы не можем его использовать. Мы можем, однако, использовать >> (двойной > ), чтобы добавить новые данные в существующий файл.

1
2
3
4
5
6
7
8
csaba@csaba-pc ~/tmp/NetTuts/SecondDir $ cd ..
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 16
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ ls -al >> ./SecondDir/ThirdFile

И содержимое нашего файла:

01
02
03
04
05
06
07
08
09
10
11
total 12
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r—r— 1 csaba csaba 12 Feb 19 21:19 aFile
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 AnotherFile
-rw-r—r— 1 csaba csaba 0 Feb 24 00:06 ThirdFile
total 16
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir

Мы можем комбинировать наши знания и перенаправлять stderr, stdin и stdout различными способами. На самом деле команды ниже делают то же самое:

1
2
csaba@csaba-pc ~/tmp/NetTuts $ ls -al > ./SecondDir/ThirdFile
csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1> ./SecondDir/ThirdFile

Во второй команде мы указали источник как стандартный вывод ( 1> ) прямо перед перенаправлением. Также обратите внимание, что между 1 и > нет пробела. Фактически, размещение пробела между двумя символами делает 1 параметром, а > автоматически подразумевает перенаправление стандартного вывода. Два выражения ниже делают то же самое и отличаются от приведенных выше:

1
2
csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 > ./SecondDir/ThirdFile
csaba@csaba-pc ~/tmp/NetTuts $ ls -al 1 1> ./SecondDir/ThirdFile

Конечно, это приводит к ошибке: «ls: невозможно получить доступ 1: нет такого файла или каталога» — если у вас действительно нет каталога с именем 1 . Это заставляет нас задуматься о следующих шагах, которые мы можем предпринять: перенаправление ошибок.

1
2
3
csaba@csaba-pc ~/tmp/NetTuts $ ls -al inexistenFilder > ./SecondDir/ThirdFile
ls: cannot access inexistenFilder: No such file or directory
csaba@csaba-pc ~/tmp/NetTuts $ ls -al inexistenFilder 2> ./SecondDir/ThirdFile

Как видите, первая команда выводит stderr в консоль и перенаправляет stdout в файл. Результатом первой команды является пустой файл и сообщение на экране. Вторая команда, однако, перенаправляет ошибки в наш файл. В результате, если бы были какие-либо выходные данные на стандартном выходе, они бы отображались на экране, а ошибки — в файле.

В основном у вас есть два варианта, когда вам нужно искать файлы в консоли. Первая — это команда locate . Обычно, но не обязательно, он устанавливается во многих современных дистрибутивах Linux. Команда updatedb индексирует ваши файлы и locate использует эту базу данных для поиска ваших файлов. На самом деле он не выполняет поиск в реальном времени, он просто ищет индексы в базе данных. Вот почему это приложение обычно запланировано на ежедневное updatedb .

Вторая команда называется, ну, find .

Эта команда выполняет поиск в реальном времени. Это точнее, чем locate , но, очевидно, гораздо медленнее. Давайте поиграем с этим немного:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 16
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./SecondDir/
total 16
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 .
drwxr-xr-x 4 csaba csaba 4096 Feb 19 21:09 ..
-rw-r—r— 1 csaba csaba 12 Feb 19 21:19 aFile
-rw-r—r— 1 csaba csaba 0 Feb 19 21:09 AnotherFile
-rw-r—r— 1 csaba csaba 61 Feb 24 00:23 ThirdFile
csaba@csaba-pc ~/tmp/NetTuts $ find .
./SecondDir/ThirdFile

Я напечатал две команды ls чтобы вы могли видеть структуру каталогов. Третья команда — наша find . Он имеет сложную систему параметров, которую я не буду здесь подробно описывать, но приведенный выше пример демонстрирует наиболее распространенное использование find . Первый параметр . каталог, в котором мы хотим искать.

Совет: ссылается на текущий каталог. .. относится к родительскому каталогу.

Второй параметр, который мы использовали для find был -name , за которым следовало имя файла. Мы можем использовать ? и * в параметре -name чтобы расширить наш поиск:

1
2
3
4
5
6
csaba@csaba-pc ~/tmp/NetTuts $ find .
./SecondDir/aFile
csaba@csaba-pc ~/tmp/NetTuts $ find .
./SecondDir/aFile
./SecondDir/AnotherFile
./SecondDir/ThirdFile

? обозначает любой отдельный символ, а * обозначает любое количество любых символов.

Далее мы создадим каталог и сделаем его нечитаемым для нашего пользователя. Мы еще не рассмотрели разрешения, но не волнуйтесь, мы скоро будем. Сейчас просто попробуйте следующее:

1
2
3
4
5
6
7
csaba@csaba-pc ~/tmp/NetTuts $ mkdir ThirdDir
csaba@csaba-pc ~/tmp/NetTuts $ chmod 000 ThirdDir
csaba@csaba-pc ~/tmp/NetTuts $ find .
./SecondDir/aFile
./SecondDir/AnotherFile
./SecondDir/ThirdFile
find: `./ThirdDir’: Permission denied

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

1
2
3
4
csaba@csaba-pc ~/tmp/NetTuts $ find .
./SecondDir/aFile
./SecondDir/AnotherFile
./SecondDir/ThirdFile

Мы перенаправили stderr в /dev/null . Это указывает на … ну ничего. Все, что вы добавите в /dev/null , просто исчезнет. Обычной практикой является отправка ошибок туда, где вы не хотите их видеть. Если вы предпочитаете результаты в файле и ваши ошибки отправляются в /dev/null , вы можете использовать несколько перенаправлений:

1
2
csaba@csaba-pc ~/tmp/NetTuts $ find .
csaba@csaba-pc ~/tmp/NetTuts $

Как видите, эта команда ничего не выводит на экран, потому что и ошибки, и стандартный вывод отправляются в разные файлы. Но что, если вы хотите, чтобы оба в одном файле? Ну, вы можете отправить stderr в стандартный вывод, а затем отправить стандартный вывод в файл:

1
find .

Перенаправления интерпретируются справа налево. Итак, первое, что происходит, это 2>&1 , который перенаправляет стандартную ошибку на стандартный вывод. Затем 1>./SecondDir/ThirdFile перенаправляет стандартный вывод (с ошибками уже в нем) в указанный файл.


Разрешения, обсуждаемые в этом руководстве, применимы к * nix операционным системам. Я не очень знаком с последними версиями Windows, но Microsoft использует другую концепцию для разрешений в своих файловых системах.

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

Вы можете найти список существующих на данный момент пользователей в файле /etc/passwd .

Группы перечислены в файле /etc/group . Группа имеет имя и идентификатор (известный как GID), а группа представляет собой контейнер с нулевым или большим количеством пользователей. Каждый пользователь обычно имеет как минимум одну соответствующую группу, имя которой совпадает с именем пользователя.

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

1
2
3
4
5
6
7
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
d——— 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

В нашей команде ls -al владелец каждого результата указывается как «группа пользователей» (в нашем примере это «csaba csaba»). Теперь мы изменим владельца AnotherDir следующим образом:

1
2
3
4
5
6
7
8
csaba@csaba-pc ~/tmp/NetTuts $ chown csaba:users ./AnotherDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
d——— 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

Команда chown означает «сменить владельца» и имеет простой синтаксис: chown user:group path . Пользователь может изменить владение группой только на одну из групп, членом которой он является, и обычный пользователь не может сменить владельца на другого пользователя, к которому у него нет доступа. Конечно, пользователь с правами администратора, такими как «root», может изменить владельца любого файла и установить его для любого пользователя и группы.

Существует три типа прав доступа к файлам:

  • r — читать
  • w — написать
  • x — выполнить

Обратите внимание: содержимое каталога может быть указано, если у него есть разрешения на выполнение.

Обратитесь к предыдущему примеру команды ls . Права доступа для каждого объекта файловой системы отображаются в начале каждой строки (эти символы rwx). Каждое разрешение может быть установлено (помечено буквой) или не задано (помечено тире: «-»).

Три типа разрешений применяются к трем категориям:

  • Пользователь — права для владельца пользователя.
  • Group — разрешения для группы владельцев
  • Другие — разрешения для других пользователей, пытающихся получить доступ к нашему файлу или папке.

Каталог под названием ThirdDir не имеет разрешений, поэтому даже его владелец не может получить к нему доступ.

1
2
3
chown: changing ownership of ‘./AnotherDir/’: Operation not permitted
csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir/*
ls: cannot access ./ThirdDir/*: Permission denied

Но его владелец имеет право изменить свои разрешения:

01
02
03
04
05
06
07
08
09
10
11
12
csaba@csaba-pc ~/tmp/NetTuts $ chmod +rwx ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir
total 8
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 .
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 ..
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

Команда chmod устанавливает глобальные разрешения для объекта файловой системы, и ее синтаксис: chmod +/-rights path . Использование + означает, что вы включаете право, а - означает, что вы удаляете право. Вы можете указать любую комбинацию прав. В предыдущем примере мы добавили разрешения на чтение, запись и выполнение в ThirdDir .

Обратите внимание: разрешения на чтение и выполнение, определенные таким образом, применяются к владельцу, группе и другим. Права на запись применяются только для текущего пользователя.

1
2
3
4
5
6
7
8
csaba@csaba-pc ~/tmp/NetTuts $ chmod +rw ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
dr-xr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

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

Но в какой-то момент все в вычислениях сводится к двоичной строке. Команда chown позволяет вам легко указывать разрешения, используя десятичное представление двоичных разрешений.

  • rwx : каждый бит установлен в 1: 111. В десятичном виде это 7.
  • rw- : обозначается как 110. В десятичном виде это 6.
  • rx : представляется как 101. Который в десятичном виде равен 5.
  • r-- : представлен как 100. Который в десятичном виде равен 4.
  • -wx : представлен как 011. Который в десятичной системе счисления равен 3.
  • -w- : представляется как 010. Который в десятичном виде равен 2.
  • --x : представляется как 001. В десятичном виде это 1.
  • --- : представляется как 000. Который в десятичном виде равен 0.

Команда chown может принимать строку из трех чисел от 0 до 7 . Каждая цифра представляет права для определенной категории по порядку: пользователь, группа, другие.

1
2
3
4
5
6
7
8
csaba@csaba-pc ~/tmp/NetTuts $ chmod 765 ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx—— 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
drwxrw-rx 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

Эта команда устанавливает права на чтение, запись и выполнение для владельца, чтение, запись и запрет на выполнение для группы, а также чтение, выполнение и запрет на запись для других.


Вот несколько самых полезных команд.

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

1
2
3
4
5
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile
./SecondDir/aFile
./SecondDir/AnotherFile
./SecondDir/ThirdFile
find: `./ThirdDir’: Permission denied

Grep ищет шаблон и выводит совпадающие строки. Вы можете дополнительно указать файл для поиска в качестве третьего параметра:

1
2
csaba@csaba-pc ~/tmp/NetTuts $ grep «AnotherFile» ./SecondDir/ThirdFile
./SecondDir/AnotherFile

При добавлении параметра --color выделяется соответствующее слово в результирующих строках.

Труба представлена ​​знаком | персонаж; он берет выходные данные одной команды и передает их второй команде. Это может показаться простым, но это огромная вещь. Этот единственный символ имеет десятки тысяч строк кода, чтобы вы могли сделать это:

1
2
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile |
./SecondDir/AnotherFile

Это фактически запускает команду cat и вместо вывода результатов в stdout передает этот вывод в grep . Команда grep использует эти данные и ищет строку «Другое». Результат идентичен нашему предыдущему примеру.

История UNIX: Это старое видео от AT & T. Это отличное видео, но перейдите к 4:56, если вас интересуют только ТРУБЫ.

Команда sed позволяет вам выполнять регулярные выражения на своем входе. Он может читать из файла или использоваться в конвейерной команде. Он выводит результат в стандартный вывод.

1
2
csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile |
./SecondDir/MyFile

Этот пример добавляет sed к нашей предыдущей команде. С помощью sed мы заменили строку «AnotherFile» на «MyFile» в выводе cat...grep . Довольно круто, правда?

Команда sed может принимать несколько параметров. Указание аргумента -e выполняет регулярное выражение для его ввода. Если вы не знакомы с регулярными выражениями, ознакомьтесь с этими другими учебными пособиями по Nettuts +: Введение в «Регулярные выражения: запуск и запуск » или Шпаргалки по регулярным выражениям .


Давайте представим, что вы часто выполняете следующую команду подключения ssh :

1
csaba@csaba-pc ~/tmp/NetTuts $ ssh [email protected] -p 8743

Вы можете сократить это, создав собственную команду, скажем, sshcon . Вы можете создавать свои собственные команды, используя псевдоним. Синтаксис псевдонима имеет вид: alias shorthand='original_command' .

1
csaba@csaba-pc ~/tmp/NetTuts $ alias sshcon=’ssh [email protected] -p 8743′

При sshcon выполняется более сложная команда ssh . Но псевдонимы временны; они забыты, когда вы выходите из системы. Одним из возможных решений является редактирование файла .bashrc .

Файл .bashrc обычно находится в вашем домашнем каталоге. Этот файл позволяет вам указать любую команду (команды), которую вы хотите выполнять при каждом открытии консоли или входе в оболочку. Давайте добавим вышеупомянутый псевдоним sshcon в этот файл.

1
csaba@csaba-pc ~/tmp/NetTuts $ mcedit ~/.bashrc

Добавьте свой код в конец файла, нажмите F2, чтобы сохранить файл, а затем дважды нажмите ESC, чтобы закрыть файл. Нажмите CTRL + D, чтобы выйти из оболочки. Откройте другую оболочку и попробуйте команду псевдонима. Вуаля.

Некоторые операционные системы, такие как Solaris, могут не иметь файла ~/.bashrc . В этом случае вы можете творить чудеса, отредактировав ~/.bash_profile . Фактически, ~/.bash_profile всегда присутствует во всех системах.

Скрытые файлы: файлы, начинающиеся с точки ( . ), Обозначают скрытый файл.


Давайте немного поиграем с сетью.

Команда ping — это простой способ проверить, работает ли сервер и доступен ли он.

01
02
03
04
05
06
07
08
09
10
csaba@csaba-pc ~/tmp/NetTuts $ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=44.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=47 time=65.6 ms
^C
— 8.8.8.8 ping statistics —
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 44.081/54.871/65.661/10.790 ms
csaba@csaba-pc ~/tmp/NetTuts $ ping inexistent.server
ping: unknown host inexistent.server

Его синтаксис прост: ping IP_address_or_name . Если сервер доступен, вы увидите список строк ответа с подробностями. Если это не так, в сообщении об ошибке указывается проблема.

Команда traceroute отображает маршрут прохождения пакета от вашего компьютера к устройству назначения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
csaba@csaba-pc ~/tmp/NetTuts $ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1 192.168.111.1 (192.168.111.1) 0.239 ms 0.322 ms 0.317 ms
 2 * * *
 3 95.77.39.65 (95.77.39.65) 45.754 ms 45.887 ms 46.024 ms
 4 ro-cj01a-rd4-xe-1-2-1-v1643.upcnet.ro (84.116.216.1) 83.121 ms ro-cj01a-rd4-xe-1-2-0-v1642.upcnet.ro (84.116.225.253) 83.289 ms ro-cj01a-rd4-xe-1-3-0-v1713.upcnet.ro (84.116.217.26) 83.119 ms
 5 84.116.217.93 (84.116.217.93) 83.153 ms 84.116.217.85 (84.116.217.85) 77.407 ms 77.350 ms
 6 84-116-131-53.aorta.net (84.116.131.53) 77.327 ms 53.442 ms 53.357 ms
 7 84.116.132.174 (84.116.132.174) 53.211 ms 48.923 ms 53.186 ms
 8 72.14.219.9 (72.14.219.9) 85.040 ms 72.14.214.29 (72.14.214.29) 67.289 ms 72.216 ms
 9 209.85.241.110 (209.85.241.110) 48.129 ms 47.389 ms 209.85.240.64 (209.85.240.64) 45.096 ms
10 72.14.239.62 (72.14.239.62) 47.254 ms 72.14.236.68 (72.14.236.68) 51.770 ms 72.14.239.62 (72.14.239.62) 43.242 ms
11 209.85.254.118 (209.85.254.118) 46.137 ms 209.85.254.116 (209.85.254.116) 52.165 ms 209.85.254.114 (209.85.254.114) 102.070 ms
12 * * *
13 google-public-dns-a.google.com (8.8.8.8) 47.471 ms 47.986 ms 43.645 ms

И * nix, и Windows имеют команду route . И несмотря на их небольшие различия в синтаксисе, их функциональность в основном одинакова. Эта команда позволяет нам увидеть текущую таблицу маршрутизации системы и, если необходимо, добавить / удалить статические маршруты.

1
2
3
4
5
6
csaba@csaba-pc ~/tmp/NetTuts $ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.111.1 0.0.0.0 UG 0 0 0 eno1
loopback localhost 255.0.0.0 UG 0 0 0 lo
192.168.111.0 * 255.255.255.0 U 1 0 0 eno1

Первый столбец — это пункт назначения, цель сетевого подключения или связи. Термин «по умолчанию» означает что-либо, не сопоставленное с чем-либо другим или отправленное сюда. Loopback — это наше виртуальное локальное устройство с IP 127.0.0.1. Этот IP-адрес всегда относится к локальному компьютеру и присутствует во всех операционных системах ([ed] нет места, как 127.0.0.1).

Второй столбец — это шлюз, который соединение использует для достижения пункта назначения. Первая строка отображает мой шлюз по умолчанию как 192.168.111.1. Вторая строка для loopback идет к localhost, а третья строка идет к * , шлюз не нужен для доступа к нашей собственной сети.

Третья интересная вещь здесь — последняя колонка: «Ифация». Он определяет интерфейс, используемый для связи с конкретным пунктом назначения. В нашем примере обратная связь проходит через петлевой интерфейс lo . Все остальное проходит через интерфейс eno1 .

Совет: Если вы не нашли команду route , попробуйте использовать netstat -nr . Он должен производить аналогичный вывод.

Если вы хотите быстро взглянуть на конфигурацию вашей сети, просто введите ifconfig в командной строке.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
csaba@csaba-pc ~/tmp/NetTuts $ ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 192.168.111.10 netmask 255.255.255.0 broadcast 192.168.111.255
        inet6 fe80::4e72:b9ff:fef6:c9ff prefixlen 64 scopeid 0x20<link>
        ether 4c:72:b9:f6:c9:ff txqueuelen 1000 (Ethernet)
        RX packets 2935016 bytes 696255521 (664.0 MiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 5586410 bytes 6331639146 (5.8 GiB)
        TX errors 0 dropped 0 overruns 0 carrier 1 collisions 0
        device interrupt 17
 
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 16436
        inet 127.0.0.1 netmask 255.0.0.0
        inet6 ::1 prefixlen 128 scopeid 0x10<host>
        loop txqueuelen 0 (Local Loopback)
        RX packets 7396 bytes 599533 (585.4 KiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 7396 bytes 599533 (585.4 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Здесь много информации. Во-первых, у нас есть два раздела, каждый для сетевого адаптера. Моя проводная сетевая карта называется eno1 в моей системе. Вы можете увидеть такие вещи, как e1000g0 , eth0 , en0 или другие имена. Беспроводные сетевые устройства обычно (но не всегда) начинаются с буквы «w».

На этой же строке отображается текущее состояние интерфейса. В этом примере интерфейс работает, вещает, работает и т. Д. Вторая строка предназначена для IP-адреса IPv4, маски сети и широковещания. Третья строка очень похожа, но для IPv6. Четвертая строка, начинающаяся с «ether», представляет собой MAC-адрес сетевой карты, а остальные строки отображают статистику передачи данных.

Еще одна полезная команда — netstat . Он может перечислять все сетевые подключения к системе, а также IP-адреса, интерфейсы и порты, которые прослушивает система. Вот часть вывода netstat в моей системе. Я сократил его, чтобы исключить ненужную информацию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
csaba@csaba-pc ~/tmp/NetTuts $ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:59017 0.0.0.0:* LISTEN
tcp 0 40 192.168.111.10:59017 109.99.97.81:53681 ESTABLISHED
tcp 0 0 192.168.111.10:51137 109.99.97.81:55175 TIME_WAIT
tcp 0 0 192.168.111.10:34715 173.194.70.109:993 ESTABLISHED
tcp 0 0 192.168.111.10:34722 173.194.70.109:993 ESTABLISHED
tcp 0 1 192.168.111.10:42876 86.162.58.4:7055 LAST_ACK
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::4434 :::* LISTEN
tcp6 0 0 :::59017 :::* LISTEN

Каждая строка представляет соединение в определенном состоянии. В этом примере вы можете видеть соединения в состояниях прослушивания (см. Первую строку, порт 22, мой ssh-сервер), установленные состояния, состояния ожидания и так далее.


Вот и все: некоторые из наиболее часто используемых команд CLI! Естественно, каждая из этих команд способна на большее, чем то, что я рассмотрел в этом уроке. Я надеюсь, что пролил немного света на некоторые из этих загадок CLI. Спасибо за прочтение!