Для сценариев, требующих полномочий
root, сначала нужно проверить, какой пользователь запустил сценарий. UID пользователя root всегда равен 0. Проверка, является ли пользователь, запустивший сценарий, пользователем root, может выглядеть так:ROOT_UID=0 if [ "$UID" -eq "$ROOT_UID" ]then echo "Root" else echo "Обычный пользователь"fi exit 0В Linux кроме прав доступа есть еще и атрибуты файла, подобно атрибутам файла в других ОС.
Просмотреть установленные атрибуты можно командой:
Основные полезные атрибуты:
Пример установки атрибута:
Пример сброса атрибута:
Просмотреть установленные атрибуты можно командой:
chattr some_fileОсновные полезные атрибуты:
i Запрет на изменений, переименование и удаление файла. Обычно ставится для критических конфиг. файлов. Установить и сбросить может только root (либо процесс с CAP_LINUX_IMMUTABLE)u При удалении файла с установленным атрибутом u его содержимое хранится на жестком диске, что позволяет легко восстановить файл.c Файл будет сжиматься. Рекомендуется для больших несжатых данных, но крайне не желателен для файлов БД т.к. доступ будет медленнее. S Данные, записываемые в файл, сразу будут сброшены на диск. Аналогично выполнению команды sync сразу после каждой операции записи в файл.s Прямо противоположен атрибуту u. После удаления файла, принадлежащие ему блоки будут обнулены и восстановить их уже не получится.Пример установки атрибута:
chattr +i config_fileПример сброса атрибута:
chattr -i config_fileРазбить файл на части можно используя команду
Для примера создадим файл с цифрами от 1 до 1000 в столбик командой:
Разделим этот файл по 200 строк в каждом, командой:
Цифру можно задать свою. Исходный some_file останется, рядом создадутся 5 (потому что на 200 делили) файлов. Подумай, какие названия им даст ОС?
Команду можно также использовать для разделения файлов на части по размеру информации, например:
Первая команда разделит файл на части по 100 байтов каждая, вторая - на части по 100 Кбайт каждая, третья - по 100 Мбайт каждая.
splitДля примера создадим файл с цифрами от 1 до 1000 в столбик командой:
echo {1..1000} | tr ' ' '\n' > some_fileРазделим этот файл по 200 строк в каждом, командой:
split -200 some_fileЦифру можно задать свою. Исходный some_file останется, рядом создадутся 5 (потому что на 200 делили) файлов. Подумай, какие названия им даст ОС?
Команду можно также использовать для разделения файлов на части по размеру информации, например:
split -b100b some_file2split -b100k some_file2 split -b100m some_file2Первая команда разделит файл на части по 100 байтов каждая, вторая - на части по 100 Кбайт каждая, третья - по 100 Мбайт каждая.
В любом серьезном сценарии вы не обойдетесь без использования переменных.
Пример объявления переменной:
Вывести значение переменной:
В Linux часто используются переменные окружения. Это специальные переменные, содержащие служебные данные. Вот примеры некоторых часто используемых переменных окружения:
•
•
•
•
•
•
•
•
•
•
Пример объявления переменной:
ADDRESS=some_firma.ru Вывести значение переменной:
echo $ADDRESS В Linux часто используются переменные окружения. Это специальные переменные, содержащие служебные данные. Вот примеры некоторых часто используемых переменных окружения:
•
BASH - полный путь до исполняемого файла командной оболочки bash; •
BASH_VERSION - версия bash; •
НОМЕ - домашний каталог пользователя, который запустил сценарий; •
HOSTNAME- имя компьютера; •
RANDOM - случайное число в диапазоне от 0 до 32767; •
OSTYPE - тип операционной системы; •
PWD - текущий каталог; •
PS1 - строка приглашения; •
UID - ID пользователя, который запустил сценарий;•
USER - имя пользователя. Существует два типа IP-адресов: локальные и публичные.
Локальный IP присваивается системой, и его можно посмотреть с помощью команды:
Если же вы хотите узнать публичный IP вашего ПК, который провайдер присваивает вашему интерфейсу, то при подключённом интернете выполните в командной строке:
Команда обращается к серверу
Локальный IP присваивается системой, и его можно посмотреть с помощью команды:
hostname -IЕсли же вы хотите узнать публичный IP вашего ПК, который провайдер присваивает вашему интерфейсу, то при подключённом интернете выполните в командной строке:
curl ifconfig.coКоманда обращается к серверу
ifconfig.co, который возвращает обратно IP-шник одной строкой вместо полноценной веб-страницы.В современных дистрибутивах Linux сменные носители вроде USВ или оптических дисков монтируются автоматически:
• Deblan, Ubuntu, Fedora, CentOS - монтирование производится к каталогу:
В качестве метки может использоваться или метка, установленная при форматировании, или серийный номер устройства, если метка не устанавливалась.
• openSUSE - монтирование будет производиться к каталогу:
За автоматическое монтирование отвечает демон
• Deblan, Ubuntu, Fedora, CentOS - монтирование производится к каталогу:
/mеdiа/<метка_устройства>В качестве метки может использоваться или метка, установленная при форматировании, или серийный номер устройства, если метка не устанавливалась.
• openSUSE - монтирование будет производиться к каталогу:
/var/run/media/<имя_пользователя>/<метка>За автоматическое монтирование отвечает демон
automount, который можно отключить, если автоматическое монтирование вам не нужно.Обратите внимание на значение
Немного освободить память можно, очистив кэш. Для этого введите команду:
Сначала мы командой
Однако помните, что этот трюк может негативно отразиться на стабильности и скорости системы. Не всегда очистка кэша таким вот варварским образом - это хорошо.
buff/cache в выводе команды free. Оно показывает сколько памяти задействовано под буфер ввода/вывода и кэш.Немного освободить память можно, очистив кэш. Для этого введите команду:
sync; echo 3 > /proc/sys/vm/drop_caches Сначала мы командой
sync сбрасываем содержимое буферов на диск, а затем уничтожаем кэш. Если просмотреть затем информацию об использовании памяти, то вы увидите, что размер кэша был уменьшен в разы. Однако помните, что этот трюк может негативно отразиться на стабильности и скорости системы. Не всегда очистка кэша таким вот варварским образом - это хорошо.
Такие файловые системы, как
Осуществляется это следующим образом: перед тем как выполнить операцию, журналируемая ФС записывает ее в особый файл - журнал, а после выполнения операции удаляет запись из журнала.
Представим, что после занесения операции в журнал произошел сбой (например, отключилось электропитание). Позже, когда сбой будет устранен, ФС по журналу выполнит все действия, которые в него занесены.
Конечно, и это не всегда позволяет уберечься от последствий сбоя - стопроцентной гарантии никто не дает, но все же такая схема работы лучше, чем вообще ничего.
ехtЗ, ext4, XFS, ReiserFS, JFS и др. - ведут журналы своей работы, что позволяет восстановить данные в случае сбоя. Осуществляется это следующим образом: перед тем как выполнить операцию, журналируемая ФС записывает ее в особый файл - журнал, а после выполнения операции удаляет запись из журнала.
Представим, что после занесения операции в журнал произошел сбой (например, отключилось электропитание). Позже, когда сбой будет устранен, ФС по журналу выполнит все действия, которые в него занесены.
Конечно, и это не всегда позволяет уберечься от последствий сбоя - стопроцентной гарантии никто не дает, но все же такая схема работы лучше, чем вообще ничего.
Поиск текста в бинарных файлах.
Иногда возникает необходимость прочесть текст в кодировке ASCII, находящийся внутри бинарного файла, что позволяет узнавать много информации об исполняемом файле.
В этих случаях для извлечения любого доступного для чтения текста ASCII используйте команду
Несколько примеров ее использования:
Определяет наличие libc в ls
Отображает все тексты ASCII в ls
Отображает все тексты ASCII в ls
Иногда возникает необходимость прочесть текст в кодировке ASCII, находящийся внутри бинарного файла, что позволяет узнавать много информации об исполняемом файле.
В этих случаях для извлечения любого доступного для чтения текста ASCII используйте команду
strings. Эта команда является частью программного пакета binutils и устанавливается в Ubuntu по умолчанию. Несколько примеров ее использования:
strings /bin/ls | grep -i libcОпределяет наличие libc в ls
cat /bin/ls | stringsОтображает все тексты ASCII в ls
strings /bin/lsОтображает все тексты ASCII в ls
Изменение текущего процесса прежде всего означает поиск соответствующего процесса и лишь затем уже изменение его приоритета или подачу процессу сигнала об изменении режима работы.
Если вы ищете какой-то определенный процесс, то наиболее простым вариантом будет отобразить расширенный список процессов с помощью команд
Команда
Команда
А команды
Если вы ищете какой-то определенный процесс, то наиболее простым вариантом будет отобразить расширенный список процессов с помощью команд
ps или top. Команда
pgrep позволяет искать необходимые процессы через активные процессы.Команда
reniсе - изменять приоритеты текущих процессов [ пост про nice ]. А команды
kill, pkill и killall - отправлять сигналы текущим процессам (включая сигналы завершения данных процессов).Параметры командной строки - как данные для программы.
Содержатся эти параметры в переменных с номерами. Например:
Также существуют две вспомогательные переменные:
Называем, передаем и запускаем:
Получим:
Содержатся эти параметры в переменных с номерами. Например:
$0 — имя скрипта, $1 — первый параметр, $2 — второй параметр и т. д. Также существуют две вспомогательные переменные:
$# содержит количество переданных аргументов; $@ содержит все аргументы, переданные скрипту, разделенные пробелами.Называем, передаем и запускаем:
./q.sh 1 2 5 41Получим:
Имя скрипта: ./q.shКоличество переданных аргументов: 4arg='1'arg='2'arg='5'arg='41'Максимально простой вариант отладки bash- скриптов по шагам.
- Команда
- Команда
- Переменная окружения
Запускаем скрипт.
Перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши
Если понимаем, что что-то пошло не так, нажимаем
- Команда
trap перехватывает сигнал DEBUG, посылаемый перед выполнением команды- Команда
read ожидает ввода чего-нибудь с клавиатуры (в данном случае нам нужно только ENTER либо Ctrl+C)- Переменная окружения
$BASH_COMMAND, валидная внутри обработчика команды trap.Запускаем скрипт.
Перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши
<ENTER>.Если понимаем, что что-то пошло не так, нажимаем
Ctrl+C и выходим из отладки.Как вы знаете, известные сочетания клавиш
Вместо них используйте сочетания клавиш
Ctrl+C (копировать) и Ctrl+V (вставить) не дадут тех результатов в оболочке Bash, которых бы мы хотели.Вместо них используйте сочетания клавиш
Shift+Ctrl+C и Shift+Ctrl+V. Вы также можете вырезать и вставлять текст, щелкнув правой кнопкой мыши и выбрав соответствующую операцию в меню. И это может оказаться удобней.Горячие клавиши VIM
Vim — это продвинутый текстовый редактор с широкими возможностями настройки.
Для перемещения по файлу:
•
•
•
•
•
•
•
•
Если перед тем как нажать кнопку буквы нажать цифру, то эта команда будет повторена несколько раз. Например,
Для переключения в режим редактирования:
•
•
•
•
•
•
•
Можно запустить редактор и потыкаться во всем самостоятельно или же пройти курс обучения, который встроен в vim, набрав:
Vim — это продвинутый текстовый редактор с широкими возможностями настройки.
Для перемещения по файлу:
•
h - на один символ влево;•
l - на один символ вправо;•
j - на одну строку вниз;•
k - на одну строку вверх;•
w - на слово вправо;•
b - на слово влево;•
H - перейти в низ экрана;•
G - перейти в конец файла;Если перед тем как нажать кнопку буквы нажать цифру, то эта команда будет повторена несколько раз. Например,
3j переведет курсор на три строки вверх.Для переключения в режим редактирования:
•
i - вставить текст с позиции курсора, символ под курсором будет заменен;•
I - вставить текст в начало строки;•
a - добавить текст начиная от позиции курсора;•
o - вставить новую строку после этой и начать редактирование;•
O - вставить новую строку перед этой и начать редактирование;•
r - заменить текущий символ;•
R - заменить несколько символов.Можно запустить редактор и потыкаться во всем самостоятельно или же пройти курс обучения, который встроен в vim, набрав:
vimtutorКоманда
Одна из возможностей - отображение параметров сетевого интерфейса.
Если ввести
Поля вывода ifconfig:
•
•
•
•
•
•
•
•
•
•
•
Даже если сетевые интерфейсы не настроены, в выводе должен быть интерфейс
Если его нет, служба
ifconfig Одна из возможностей - отображение параметров сетевого интерфейса.
Если ввести
ifconfig в терминал, то получим список активных интерфейсов. Поля вывода ifconfig:
•
HWaddr - аппаратный MAC-адрес;•
inet addr - IPv4-адрес интерфейса;•
inet6 addr - IPv6-адрес интерфейса;•
Bcast - широковещательный адрес•
Mask - маска сети•
MTU - значение MTU (Maximum transmission unit - максимальный объём данных, который может быть передан за одну итерацию); •
collision - счетчик коллизий, если количество коллизий больше 0, с вашей сетью творится что-то неладное; •
RX packets - количество принятых пакетов; •
TX packets - количество переданных пакетов; •
RX bytes - количество принятых байтов; •
TX bytes - количество переданных байтов. Даже если сетевые интерфейсы не настроены, в выводе должен быть интерфейс
lo (Local Loopback). Если его нет, служба
network не запущена. Для запуска введите: sudo service network startДля создания ссылок служит команда
Создается жесткая ссылка
Создается символическая ссылка
При модификации ссылки (любой:
Команда
Жесткие ссылки в большинстве дистрибутивов никак не выделятся.
ln: ln some_file link1Создается жесткая ссылка
link1, ссылающаяся на файл some_file.ln -s some_file link2 Создается символическая ссылка
link2, которая ссылается на этот же текстовый файл some_file. При модификации ссылки (любой:
link1 или link2), автоматически модифицируется исходный файл some_file.Команда
ls отобразит символическую ссылку другим цветом (каким именно - зависит от дистрибутива).Жесткие ссылки в большинстве дистрибутивов никак не выделятся.
Ранее в [ одном из постов ] упоминался способ создания множества однотипных файлов через скобки.
Для подобных целей можно использовать:
Создадутся file1, file2, ...file500
Следующим примером для проекта создаем файлы:
myapp.html,
myapp.css,
myapp.php,
myapp.js
(нигде в перечислении пробелов быть не должно!)
Создаем директории:
Для подобных целей можно использовать:
touch file{1..500}Создадутся file1, file2, ...file500
Следующим примером для проекта создаем файлы:
myapp.html,
myapp.css,
myapp.php,
myapp.js
touch myapp.{html,css,php,js}(нигде в перечислении пробелов быть не должно!)
Создаем директории:
mkdir {templates,html,js,css}Архиватор gzip.
Утилита сжатия и восстановления файлов.
Именно в этом формате поставляется большинство программ в исходных текстах. От того и популярность.
Сам по себе
Например, есть несжатый архив some_archive.tar, который мы хотим сжать. Для этого выполним:
Ключ
Извлечем содержимое полученного архива:
Ниже приведены все ключи.
Утилита сжатия и восстановления файлов.
Именно в этом формате поставляется большинство программ в исходных текстах. От того и популярность.
Сам по себе
gzip "не умеет" сжимать несколько файлов, поэтому перед сжатием требуемые файлы обрабатываются архиватором tar, а потом полученный файл передается архиватору gzip. Отсюда созданные архивы получают двойное расширение tar.gz. Например, есть несжатый архив some_archive.tar, который мы хотим сжать. Для этого выполним:
gzip -k some_archive.tar Ключ
-k позволяет сохранить несжатый файл. Без его указания исходный файл будет удален.Извлечем содержимое полученного архива:
gzip -kd some_archive.tar.gzНиже приведены все ключи.