Ввод, вывод и перенаправление ошибок в linux

Навигация по файловой системе

При навигации по файловой системе в Linux можно использовать как абсолютный, так и относительный пути к ресурсу.

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

Команда pwd

Команда pwd (от англ. «present working directory») позволяет узнать, в каком каталоге вы находитесь в данный момент:

Результатом будет путь к текущему рабочему каталогу:

Команда cd

Команда cd (от англ. «change directory») используется для смены текущего рабочего каталога. При использовании без каких-либо параметров, команда перенесет вас в ваш домашний каталог:

Чтобы перейти в другой каталог, вы можете использовать абсолютный или относительный путь. Например, перейти в папку Downloads, расположенную в текущем каталоге, можно как через относительный путь:

Так и через абсолютный путь:

Две точки  обозначают родительский каталог или каталог уровнем выше текущего. Предположим, что в данный момент вы находитесь в каталоге usr/local/bin. Чтобы перейти в каталог usr/local (на один уровень выше текущего каталога), необходимо ввести:

Чтобы подняться на два уровня вверх:

Чтобы вернуться к предыдущему рабочему каталогу, используйте символ тире в качестве опции:

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

И есть еще

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

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

ls --full-time

Возможно, вы хотите увидеть номера inode файлов? Используйте опцию inode:

ls -i

Вы работаете с монохромным дисплеем и хотите исключить риск спутать файлы с каталогами и ссылками? Используйте опцию classify, и ls добавит один из них к каждой записи списка:

/: Каталог.@: Символическая ссылка.|: Именованный канал.=: Сокет.*: Исполняемые файлы

ls -F

Покопайся. Вы обнаружите, что ls — богатая жила, и будете продолжать находить драгоценные камни.

Обзор


Пример использования tee : вывод перенаправляется на tee, который копирует их в файл file.txt и на пейджер . Название тройник происходит от этой схемы — похоже на заглавную букву Т.

Команда обычно используется для разделения вывода программы, чтобы его можно было как отображать, так и сохранять в файле. Команду можно использовать для захвата промежуточного вывода до того, как данные будут изменены другой командой или программой. Команда tee считывает стандартный ввод , а затем записывает его содержимое в стандартный вывод . Он одновременно копирует данные в указанный файл (ы) или переменные. Синтаксис различается в зависимости от реализации команды.

Синтаксис и опции w

Запись команды w в пользовательском терминале выглядит так:

$ w опции имя_аккаунта

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

  • -h (—no-header) — отказ от вывода заголовков.
  • -u (—no-current) — приказ определять JCPU и PCPU, игнорируя имена учетных записей.
  • -s (—short) — краткий формат вывода.
  • -f (—from) — управление выводом имени хоста или IP-адреса, с которого был осуществлен вход в систему.
  • -i (—ip-addr) — замена информации об имени хоста на IP-адрес.
  • -o (—old-style) — отображение вывода в старом формате.

Примеры

Unix и Unix-подобные

Чтобы просмотреть и сохранить вывод команды ( lint ) одновременно:

lint program.c | tee program.lint

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

Точно так же потоки вывода stdout и stderr могут быть перенаправлены на стандартный вывод и перенаправление потока using:

lint program.c 2>&1 | tee program.lint

Чтобы просмотреть и добавить вывод команды в существующий файл:

lint program.c | tee -a program.lint

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

Чтобы разрешить повышение разрешений:

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

В этом примере показано использование tee для обхода ограничения, присущего команде sudo . sudo не может передать стандартный вывод в файл. Выгрузив его поток stdout в , мы также подавляем зеркальный вывод в консоли. Приведенная выше команда предоставляет текущему пользователю root-доступ к серверу по ssh путем установки открытого ключа пользователя в список авторизации ключей сервера.

В Bash вывод можно фильтровать перед записью в файл — без влияния на отображаемый вывод — с помощью подстановки процесса . Например,

ls --color=always | tee >(sed "s/\x1b*m//g" > ls.txt)

удаляет общие escape-коды ANSI перед записью , но сохраняет их для отображения.

4DOS и 4NT

В этом примере выполняется поиск в файле любых строк, содержащих строку « 4DOS », создается копия совпадающих строк , выполняется сортировка строк и их запись в выходной файл :

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

Windows PowerShell

Чтобы просмотреть и сохранить вывод команды одновременно:

ipconfig | tee OutputFile.txt

Это отображает стандартный вывод команды в окне консоли и одновременно сохраняет ее копию в файле .

Чтобы отобразить и сохранить все запущенные процессы , отфильтрованные таким образом, чтобы выводились только программы, начинающиеся с svc и имеющие более 1000 дескрипторов :

Get-Process | Where-Object { $_.Name -like "svc*" } | Tee-Object ABC.txt | Where-Object { $_.Handles -gt 1000 }

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

Вход в командную строку

Используя Ubuntu в качестве операционной системы, вы можете перейти к командной строке двумя путями, а именно через консоль или через терминал.
Если вы хотите зайти в командную строку через терминал, то для этого необходимо нажать Ctrl+Alt+F(1-6) – в зависимости от выбранного номера (F1, F2…) вы попадаете в первую, вторую или другую по счету виртуальную консоль (они независимы и запускаются во время загрузки Ubuntu), каждая из которых имеет интерфейс командной строки. Если вы нажмете Ctrl+Alt+F7, то перейдете в седьмую виртуальную консоль, которая имеет графический интерфейс.

Что касается терминала, то это графическая программа, которая эмулирует консоль. Вы можете найти ее в меню, выбрав «Приложения», затем «Стандартные», а затем «Терминал», либо нажав сочетание клавиш Ctrl+Alt+T. Вы сможете выполнять команды, продолжая находиться в графическом интерфейсе.
Также возможен вариант, когда вам необходимо подключиться к серверу, на котором установлена Ubuntu. В этом случае вам нужно воспользоваться специальной программой (например, puTTy): наберите нужный ip-адрес, а затем введите имя пользователя и пароль.

Примечание.
При вводе пароля в командную строку он не высвечивается – вам нужно просто набрать пароль и нажать Enter. Если пароль введен правильно, вы сможете продолжить работу в командной строке.

Фильтры tcpdump

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

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

tcpdump использует синтаксис Berkeley Packet Filter (BPF) для фильтрации захваченных пакетов с использованием различных параметров обработки, таких как протоколы, IP-адреса источника и назначения и порты и т. д.

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

Фильтрация по протоколу

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

sudo tcpdump -n udp

Другой способ определить протокол – использовать спецификатор proto, за которым следует номер протокола. Следующая команда отфильтрует протокол № 17 и выдаст тот же результат, что и приведенный выше:

sudo tcpdump -n proto 17

Для получения дополнительной информации о номерах, проверьте список номеров протокола IP.

Фильтрация по хосту

Для захвата только пакетов, связанных с конкретным хостом, используйте спецификатор host:

sudo tcpdump -n host 192.168.1.185

Хост может быть либо IP-адресом, либо именем.

Вы также можете отфильтровать выходные данные по заданному диапазону IP-адресов с помощью квалификатора net. Например, для выгрузки только пакетов, связанных с 10.10.0.0/16, используйте:

sudo tcpdump -n net 10.10

Реализации

Команда доступна для Unix и Unix-подобных операционных систем , Microware OS-9 , DOS (например, 4DOS , FreeDOS ), Microsoft Windows (например, 4NT , Windows PowerShell ) и ReactOS . Команду Linux написали Майк Паркер, Ричард Столлман и Дэвид Маккензи. Версия FreeDOS была разработана Джимом Холлом и находится под лицензией GPL . Команда tee также была перенесена в операционную систему IBM i .

Кроме того, команда предлагает аналогичные возможности.

Unix и Unix-подобные

tee   

Аргументы:

File … Список файлов, каждый из которых получает вывод.

Флаги:

  • Добавляет вывод в каждый файл, а не перезаписывает его.
  • Игнорирует прерывания.

Команда возвращает следующие значения выхода ( статус выхода ):

  • 0 Стандартный ввод был успешно скопирован во все файлы вывода.
  • > 0 Произошла ошибка.

Примечание. Если запись в любой успешно открытый файловый операнд не удалась, запись в другие успешно открытые файловые операнды будет продолжена, и стандартный вывод будет продолжен, но значение выхода будет> 0.

4DOS и 4NT

TEE  file...

Аргументы:

file Один или несколько файлов, которые получат вывод «tee’d».

Флаги:

/A Добавляйте содержимое конвейера к выходным файлам, а не перезаписывайте их.

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

Windows PowerShell

tee  <String> 
tee -Variable <String> 

Аргументы:

  • Задает объект, вводимый командлету. Параметр принимает переменные, содержащие объекты и команды или выражения, возвращающие объекты.
  • Задает файл, в котором командлет хранит объект. Параметр принимает подстановочные знаки, которые разрешаются в один файл.
  • Ссылка на входные объекты будет присвоена указанной переменной.

Примечание: tee реализован как псевдоним команды . Внутреннее имя командлета .

Перенаправление потоков

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

Команды с одной угловой скобкой переписывают существующий контент целевого файла:

  • > – стандартный вывод
  • < – стандартный ввод
  • 2> – стандартная ошибка

Команды с двойными угловыми скобками не переписывают содержимое целевого файла:

  • >> – стандартный вывод
  • << – стандартный ввод
  • 2>> – стандартная ошибка

Рассмотрим следующий пример:

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

Просмотрите содержимое write_to_me.txt:

Команда должна вернуть:

Снова перенаправьте cat в файл write_to_me.txt и введите три цифры.

Теперь проверьте содержимое файла.

Команда должна вернуть:

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

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

Откройте write_to_me.txt:

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

Конвейеры

Конвейеры (pipes) перенаправляют потоки вывода одной команды на вход другой. При этом данные, передаваемые второй программе, не отображаются в терминале. На экране данные появятся только после обработки второй программой.

Конвейеры в Linux представлены вертикальной чертой.

Например:

Такая команда передаст вывод ls (содержимое текущего каталога) программе less, которая отображает передаваемые ей данные построчно. Как правило, ls выводит содержимое каталогов подряд, не разбивая на строки. Если перенаправить вывод ls в less, то последняя команда разделит вывод на строки.

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

Фильтры

Фильтры – это команды, которые могут изменить перенаправление и вывод конвейера.

Примечание: Фильтры также являются стандартными командами Linux, которые можно использовать и без конвейера.

  • find – выполняет поиск файла по имени.
  • grep – выполняет поиск текста по заданному шаблону.
  • tee – перенаправляет стандартный ввод в стандартный вывод и один или несколько файлов.
  • tr – поиск и замена строк.
  • wc – подсчёт символов, строк и слов.

Использование шаблонов файлов

Чтобы выборочно перечислить набор файлов, используйте сопоставление с образцом. Знак вопроса «?» будет представлять любой отдельный символ, а звездочка «*» будет представлять любую строку символов. Чтобы перечислить любые файлы или каталоги, имена которых начинаются с «ip_», используйте следующий формат:

ls ip_*

Чтобы вывести список файлов с расширением «.c», используйте следующий формат:

ls *.c

Вы также можете использовать ls с grep и использовать grep возможности сопоставления с образцом. Давайте поищем любые файлы, в названии которых есть строка «_pin_»:

ls | grep _pin_

Это почти то же самое, что и использование ls отдельно, с двумя подстановочными знаками:

ls | grep _pin_
ls *_pin_*

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

Потоки ввода-вывода

Ввод и вывод в окружении Linux распределяется между тремя потоками:

  • Стандартный ввод (standard input, stdin, поток номер 0)
  • Стандартный вывод (standard output, stdout, номер 1)
  • Стандартная ошибка, или поток диагностики (standard error, stderr, номер 2)

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

Стандартный ввод

Стандартный входной поток обычно передаёт данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства (например, клавиатуры). Стандартный ввод прекращается по достижении EOF (end-of-file, конец файла). EOF указывает на то, что больше данных для чтения нет.

Чтобы увидеть, как работает стандартный ввод, запустите программу cat. Название этого инструмента означает «concatenate» (связать или объединить что-либо). Обычно этот инструмент используется для объединения содержимого двух файлов. При запуске без аргументов cat открывает командную строку и принимает содержание стандартного ввода.

Теперь введите несколько цифр:

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

Пользователь может задать EOF, нажав ctrl-d, после чего программа cat остановится.

Стандартный вывод

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

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

Теперь запустите echo без аргументов:

Команда вернёт пустую строку.

Стандартная ошибка

Этот стандартный поток записывает ошибки, создаваемые программой, которая вышла из строя. Как и стандартный вывод, этот поток отправляет данные в терминал.

Рассмотрим пример потока ошибок команды ls. Команда ls отображает содержимое каталогов.

Без аргументов эта команда возвращает содержимое текущего каталога. Если указать в качестве аргумента ls имя каталога, команда вернёт его содержимое.

Поскольку каталога % не существует, команда вернёт стандартную ошибку:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: