# Комментарий или «обрезка строк»
Чаще всего вы используете хеш или знак числа (#), чтобы сообщить оболочке, что ниже следует комментарий, и он не должен на него воздействовать. Вы можете использовать его в сценариях оболочки и, — менее полезно, — в командной строке.
# This will be ignored by the Bash shell
Однако он не игнорируется, потому что он добавлен в историю команд.
Вы также можете использовать хеш, чтобы обрезать строковую переменную и удалить некоторый текст с начала. Эта команда создает строковую переменную с именем this_string.
В этом примере мы присваиваем текст «Dave Geek!» переменной.
this_string="Dave Geek!"
Эта команда использует echo для печати слова «How-To» в окне терминала. Он извлекает значение, хранящееся в строковой переменной, через расширение параметра . Поскольку мы добавляем хеш и текст «Dave», он обрезает эту часть строки перед тем, как передать её в echo.
echo How-To ${this_string#Dave}
Это не меняет значение, хранящееся в строковой переменной; это влияет только на то, что отправлено echo. Мы можем использовать echo для печати значения строковой переменной еще раз и проверить это:
echo $this_string
Ошибка отказано в доступе Linux
Наиболее часто такая ошибка встречается, в таких случаях:
- Вы пытаетесь выполнить команду в терминале;
- Вы пытаетесь примонтировать внешний носитель с помощью файлового менеджера;
- Вы пытаетесь запустить системный сервис и находите такую ошибку в логе.
В операционной системе Linux действует сложная система полномочий. Настройки доступа для каждого файла настраиваются тремя параметрами — чтение, запись и выполнение. Эти параметры устанавливаются для трех категорий — владелец файла, группа файла и все остальные пользователи.
Если вы попытаетесь получить доступ, например, открыть для чтения файл, к которому вам доступ не разрешен, то вы получите такую ошибку. А учитывая что все устройства, сокеты, и другие системные объекты — это тоже файлы, то вы будете получать такую ошибку всегда, когда попытаетесь сделать то, что вам не позволено. Самый простой способ обойти такой запрет — это выполнять нужную команду от имени суперпользователя.
Многие программы проверяют после запуска от какого пользователя они запущены и говорят, что их нужно запускать от имени суперпользователя, но так ведут себя не все. Например, команда ls вернет ошибку отказано в доступе linux если вы попытаетесь посмотреть содержимое каталога суперпользователя:
Но эта же команда нормально отработает нормально при использовании команды sudo:
Другой случай, это если вы обнаруживаете проблему в логах какого-либо системного сервиса, например, веб-сервера Apache. Казалось бы, должно было быть все верно, потому что запуск и так выполняется от имени суперпользователя.
Но нет, сервисы не только запускаются от имени суперпользователя, но потом, для увеличения безопасности они меняют пользователя на обычного, не привелигированного. Например, Apache работает от имени пользователя apache или www-data. Уже от имени этого пользователя программа пытается получить доступ к файловой системе.
Если нужная папка не доступна этому пользователю для чтения то вы получите ошибку access denied linux. Обычно, в логе программа сообщает какая папка или файл нужен когда происходит ошибка.
Вам просто нужно поменять на него права с помощью утилиты chmod или изменить владельца chown. Причем, нужно чтобы ко всем подкаталогам на пути к целевому каталогу был доступ у программы. Например, нельзя так чтобы права на чтение /home/ не было, а на /home/user/ было. Так не пройдет.
Права разрешающие чтение и запись владельцу и только чтение для группы и остальных вставляются командой:
sudo chmod 755 /путь/к/файлу
Или для смены прав для всех файлов в каталоге и самого каталога:
sudo chmod -R 755 /путь/к/каталогу
Или вы можете изменить владельца, обычно, это более безопасная и распространенная практика:
sudo chown пользователь /путь/к/файлу $ sudo chown -R пользователь /путь/к/каталогу
Имя пользователя, от имени которого работает сервис вы можете посмотреть с помощью команды:
sudo ps aux | grep имя_сервиса
После того как вы установите правильные права, ошибка отказано в доступе linux больше не будет встречаться.
; — разделитель команд оболочки
В командной строке Вы можете вводить столько команд, сколько Вам нужно, если Вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:
ls> count.txt; wc -l count.txt; rm count.txt
Обратите внимание, что вторая команда выполняется даже в случае сбоя первой, третья — даже в случае сбоя второй и тд. Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:
Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:
cd ./doesntexist && cp ~ / Documents / reports / *.
2 ответа
Там нет необходимости выполнять chmod вообще при использовании sudo редактировать файл, хотя вы не должны использовать sudo gedit (скорее sudo -H gedit например)
Поскольку вы не меняли рекурсивные разрешения, вы можете решить проблему довольно легко.
Загрузите сеанс в реальном времени (например, загрузочный USB-носитель Ubuntu, который вы используете для установки, или System Rescue. Если у вас его нет, вы можете создать его с помощью другого компьютера или даже купить). Если вы используете Ubuntu live USB, выберите ** Попробуйте Ubuntu без установки «.
В реальной среде определите (поврежденный) корневой раздел на диске, используя sudo fdisk -l
Вероятно, это будет самый большой раздел, и он будет помечен как «файловая система Linux». Что-то вроде /dev/sda1 или, может быть /dev/mmcblk0p2 ,
Смонтируйте корневой раздел, используя правильное имя вместо sdXY
Проверьте, что это был правильный раздел:
Должен выводить то, что вы ожидаете увидеть в / примерно как:
Если это выглядит правильно:
Затем вы можете размонтировать раздел и перезагрузить систему как обычно
? — как знак подстановки символа
Оболочка Bash поддерживает три символа подстановки, одним из которых является знак вопроса (?). Вы используете «подстановочные» знаки для замены символов в шаблонах имен файлов. Имя файла, которое содержит «подстановочный» знак, формирует шаблон, который соответствует диапазону имен файлов, а не одному.
«Подстановочный» знак вопроса представляет ровно один символ. Рассмотрим следующий шаблон имени файла:
ls badge? .txt
Это переводится как: «перечислить любой файл с именем, начинающимся с «badge» и сопровождаемым любым отдельным символом перед расширением имени файла».
Это соответствует следующим файлам
Обратите внимание, что у некоторых есть цифры, а у некоторых есть буквы после части имени файла в виде значка. «Подстановочный» знак вопроса будет соответствовать как буквам, так и цифрам
Этот шаблон имени файла не соответствует значению «badge.txt», поскольку в имени файла нет ни одного символа между «значком» и расширением файла. «Подстановочный» знак вопроса должен совпадать с соответствующим символом в имени файла.
Вы также можете использовать знак вопроса, чтобы найти все файлы с определенным количеством символов в именах файлов. Здесь перечислены все текстовые файлы, которые содержат ровно пять символов в имени файла:
ls ?????. txt
Многие команды Linux принимают файл в качестве параметра и берут свои данные из этого файла. Большинство из этих команд также могут принимать данные из потока. Чтобы создать поток, используйте левую угловую скобку (<), как показано в следующем примере, чтобы перенаправить файл в команду:
sort < words.txt
Когда команда перенаправляет ввод в нее, она может вести себя иначе, чем при чтении из именованного файла.
Если мы используем wc для подсчета слов, строк и символов в файле, он печатает значения, а затем имя файла. Если мы перенаправим содержимое файла wc, он печатает те же числовые значения, но не знает имени файла, из которого поступили данные. Он не может напечатать имя файла.
Вот несколько примеров того, как вы можете использовать wc:
wc words.txt
wc < words.txt
Как использовать команду at
Упрощенный синтаксис команды выглядит следующим образом:
Команда принимает дату и время ( ), когда вы хотите выполнить задание, как параметр командной строки, и команду, которая должна быть выполнена из стандартного ввода.
Создадим задание, которое будет выполнено в 9:00:
Как только вы нажмете , вам будет представлена командная строка которая чаще всего начинается с . Вы также увидите предупреждение о том, в какой оболочке будет выполняться команда:
Введите одну или несколько команд, которые хотите выполнить:
Когда вы закончите вводить команды, нажмите чтобы выйти из подсказки и сохранить задание:
Команда отобразит номер задания, время и дату выполнения.
Есть и другие способы , чтобы пройти команду , которую вы хотите запустить, помимо ввода команды в строке. Один из способов — использовать и направить команду по :
Другой вариант — использовать здесь документ :
Чтобы читать команды из файла вместо стандартного ввода, вызовите команду с параметром путь к файлу. Например, чтобы создать задание, которое будет запускать скрипт :
По умолчанию, если команда производит вывод, отправит электронное письмо с выводом пользователю после завершения задания. Invoke с опцией для подавления уведомлений по электронной почте:
Используйте чтобы отправить электронное письмо, даже если нет вывода:
Перегрузка operator
Перегрузка аналогична перегрузке (оба являются бинарными операторами), за исключением того, что у первого типы параметров разные.
Рассмотрим выражение . Если оператор – это , каковы операнды? Левый операнд – это объект , а правый операнд – это объект вашего класса . на самом деле является объектом типа . Следовательно, наша перегруженная функция будет выглядеть так:
Реализация для нашего класса довольно проста – поскольку C++ уже знает, как выводить значения с помощью , а все наши члены являются , мы можем просто использовать для вывода переменных-членов нашего класса . Вот приведенный выше класс с перегруженным .
Это довольно просто – обратите внимание, насколько наша строка вывода похожа на строку в функции , которую мы написали ранее. Наиболее заметным отличием является то, что стал параметром (который будет ссылкой на при вызове функции)
Самая сложная часть здесь – это тип возвращаемого значения. Для арифметических операторов мы вычисляли и возвращали один ответ по значению (потому что мы создавали и возвращали новый результат). Однако если вы попытаетесь вернуть по значению, вы получите ошибку компиляции. Это происходит потому, что специально запрещает копирование.
В этом случае мы возвращаем левый параметр в качестве ссылки. Это не только предотвращает создание копии , но также позволяет нам «объединять в цепочку» команды вывода, например,
Изначально вы могли подумать, что, поскольку не возвращает значение вызывающей стороне, мы должны определить функцию как возвращающую . Но подумайте, что произойдет, если наш вернет . Когда компилятор вычисляет , из-за правил приоритета/ассоциативности, он вычисляет это выражение как . вызовет нашу перегруженную функцию , возвращающую . Тогда частично вычисленное выражение становится: , что не имеет смысла!
Вместо этого, используя параметр в качестве возвращаемого значения, возвращает . Тогда наше частично вычисленное выражение становится: , которое затем также вычисляется!
Чтобы доказать, что это работает, рассмотрим следующий пример, в котором используется класс с перегруженным , который мы написали выше:
Этот код дает следующий результат:
& — «фоновый процесс»
После того, как Вы введете команду в окне терминала и она завершится, Вы вернетесь в командную строку. Как правило, — это занимает всего минуту или две. Но если вы запустите другое приложение, например gedit, вы не сможете использовать окно терминала, пока не закроете приложение.
Однако вы можете запустить приложение как фоновый процесс и продолжать использовать окно терминала. Для этого просто добавьте амперсанд в командную строку:
gedit command_address.page &
Bash показывает идентификатор процесса, который был запущен, а затем возвращает вас в командную строку. Затем Вы можете продолжать использовать окно терминала.
! — логический оператор НЕ и оператор истории
Восклицательный знак (!) — это логический оператор, который означает НЕ.
В этой командной строке есть две команды:
[! -d ./backup] && mkdir ./backup
- Первая команда — это текст в квадратных скобках;
- Вторая команда — это текст, который следует за двойными амперсандами &&.
Первая команда использует ! в качестве логического оператора. Квадратные скобки указывают на то, что будет проведено испытание. Опция -d (directory) проверяет наличие каталога с именем backup. Вторая команда создает каталог.
Поскольку двойные амперсанды разделяют две команды, Bash выполнит вторую только в случае успеха первой . Однако это противоположность того, что нам нужно. Если проверка для «резервной» директории прошла успешно, нам не нужно её создавать. И если проверка для каталога «backup» не пройдена, вторая команда не будет выполнена, а отсутствующий каталог не будет создан.
Это где логический оператор ! входит. Он действует как логическое НЕ. Таким образом, если тест пройден успешно (т.е каталог существует), он ! переходит на «НЕ успешно», что является ошибкой. Итак, вторая команда не активирована.
Если проверка каталога не пройдена (т.е каталог не существует), ! ответ изменяется на «НЕ сбой», что является успехом . Таким образом, команда для создания недостающего каталога будет выполнена.
Чтобы проверить состояние папки резервной копии, вы используете ls команду и параметры -l (длинный список) и -d (каталог), как показано ниже:
ls -l -d backup
Вы также можете запускать команды из истории команд с восклицательным знаком. Команда history выводит список вашей истории команд, а затем Вы набираете номер команды, с которой хотите выполнить ее повторно !, как показано ниже:
!24
Следующая команда повторно запускает предыдущую команду:
!!
Что такое специальные символы?
Существует набор символов, которые оболочка Bashобрабатывает двумя различными способами. Когда вы вводите их в оболочку, они действуют как инструкции или команды и сообщают оболочке выполнить определенную функцию. Думайте о них как об односимвольных командах.
Иногда вам просто нужно напечатать символ, и вам не нужно, чтобы он действовал как «магический». Есть способ, которым вы можете использовать символ, чтобы представлять себя, а не его специальную функцию.
Мы покажем вам, какие символы являются «специальными» или «мета-» символами, а также как вы можете использовать их функционально и буквально.
Как восстановить доступ к Debian Linux в случае проблем с sudo или утратой root-пароля
В некоторых ситуациях может получиться так, что мы потеряем административный доступ к серверу на базе Debian GNU/Linux. Например, к такому исходу могут привести некорректные действия администратора по настройке механизма sudo (ошибки при правке файлов и/или ) и, как следствие, получение ошибки «Username is not in the sudoers file» при любых дальнейших попытках использования sudo. Иногда бывают ситуации, когда локальный доступ к серверу есть, а данные административной учётной записи недоступны и требуется восстановить административный доступ к серверу.
Загрузка в recovery mode
В типичных ситуациях в Linux имеется режим восстановления Recovery Mode, который, как правило, доступен из загрузчика ОС. В этом режиме наша Linux-система доступна в режиме супер-пользователя root, и мы можем исправить в ней имеющиеся у нас проблемы, например внести корректировки в файлы sudo или добавить/изменить учётные данные локального администратора.
Для того, чтобы попасть в меню загрузки, в процессе запуска ОС Debian нажимаем кнопку Shift. В появившемся меню загрузчика GRUB выбираем расширенный режим загрузки:
Затем выбираем интересующее нас ядро Linux в режиме recovery mode…
Однако в случае с Debian, где супер-пользователь root в конфигурации по умолчанию выключен, мы можем получить сообщение о невозможности загрузки консоли восстановления «Cannot open access to console, the root account is locked»:
В таком случае мы можем прибегнуть к приёму изменения параметров загрузки ядра.
Нестандартная загрузка
В процессе загрузки в GRUB выбираем в списке ядер нужное нам ядро (режим recovery mode здесь уже не важен) и нажимаем «e» для редактирования параметров загрузки.
Находим строку начинающуюся с «linux …»
В конце строки меняем значение «» на «», а в самом конце строки дописываем вызов оболочки «».
После чего для продолжения загрузки жмём F10
Теперь мы получили беспарольный root-доступ к нашему серверу. Здесь можно исправить имеющиеся у нас проблемы, например внести корректировки в файлы sudo. После внесения нужных правок система может быть загружена обычным образом (все сделанные нами ранее изменения в GRUB были временными).
Дополнительные источники информации:
- Ubuntu Wiki — Lost Password?
- How to Fix “Username is not in the sudoers file. This incident will be reported” in Ubuntu
Проверено на следующих конфигурациях:
Версия ОС |
---|
Debian GNU/Linux Stretch 9.4 |
Автор первичной редакции:Алексей Максимов
Время публикации: 13.06.2018 15:45
Операторы перенаправления
В следующей таблице описаны операторы перенаправления потоков ввода и вывода команд.
Оператор перенаправления | Описание |
---|---|
> | Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер. |
< | Читает поток входных данных команды из файла, а не с клавиатуры. |
>> | Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла. |
>& | Считывает данные на выходе одного дескриптора как входные данные для другого дескриптора. |
<& | Считывает входные данные одного дескриптора как выходные данные другого дескриптора. |
| | Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием «канал». |
По умолчанию, входные данные команды (дескриптор STDIN) отсылаются с клавиатуры интерпретатору команд Cmd.exe, далее Cmd.exe отправляет выходные данные команды (дескриптор STDOUT) в окно командной строки.
В следующей таблице представлены доступные дескрипторы.
Дескриптор | Числовой эквивалент дескриптора | Описание |
---|---|---|
STDIN | Ввод с клавиатуры | |
STDOUT | 1 | Вывод в окно командной строки |
STDERR | 2 | Ошибка вывода в окно командной строки |
UNDEFINED | 3-9 | Эти дескрипторы определяются индивидуально для каждой прикладной программы. |
Номера от 0 до 9 представляют первые 10 дескрипторов. Для запуска программы и перенаправления любого из 10 дескрипторов используется интерпретатор команд Cmd.exe. Для задания требуемого дескриптора перед оператором перенаправления введите его номер. Если дескриптор не определен, то по умолчанию оператором перенаправления ввода «» будет единица (1). После ввода оператора «» необходимо указать, откуда читать и куда записывать данные. Можно задать имя файла или любой из существующих дескрипторов.
Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите
Ограничение пользователей
и позволяют контролировать, какие пользователи могут создавать задания с помощью команды или . Файлы состоят из списка имен пользователей, по одному имени пользователя в строке.
По умолчанию существует только файл и он пуст, что означает, что все пользователи могут использовать команду . Если вы хотите отказать в разрешении определенному пользователю, добавьте имя пользователя в этот файл.
Если файл существует, только пользователи, перечисленные в этом файле, могут использовать команду .
Если ни один из файлов не существует, только пользователи с правами администратора могут использовать команду .
Выводы
У меня была проблема с Wi-Fi, которая до сих пор не решена из-за проблемы, которая возникла, когда я пытался ее решить.
Я нашел это решение для Wi-Fi, поэтому попробовал его:
Вставьте в конфиг этот текст
Я заметил, что у меня не было разрешения на запись или выполнение файла, поэтому я попытался использовать chmod решить проблему. Это упорядоченный список всех операций, которые я сделал и которые привели к проблеме этого вопроса:
После третьей или четвертой команды (я не уверен, какая из них) я потерял свои права администратора; на самом деле, если я пытаюсь использовать команду sudo он выводит 3 строки, которые я переведу как можно лучше:
На терминале отображается
Теперь, когда я открываю терминал, он выводит мне строку bash /etc/profile: Permission denied, которую я никогда раньше не видел, и пропущенная часть имени необычна, потому что вместо нее следует писать zenoraiser.
Что вы предлагаете мне сделать?