Ответить на комментарий

Однострочники — это конвейеры из команд для выполнения каких-то полезных операций. По-английски они называются one-liners. Разбираться в них тяжелее, чем в обычном многострочном скрипте, но зато их удобно применять и легко отлаживать (не надо постоянно пересохранять файл). Я поделюсь несколькими однострочниками (из тех, что приходилось использовать недавно или регулярно), по возможности расскажу из чего они составлены. И буду со временем дополнять этот пост. Помогайте мне в комментариях.

Проблема: У вас много сайтов на одной CMS, в ней нашлась дырка, надо срочно запатчить.

Задача: Надо искать определенные файлы и заменять в них определенные строки.

Решение:
find /var/www/* -wholename "*/database/database.inc" -exec sed -i -e 's/foreach ($data as $i => $value)/foreach (array_values($data) as $i => $value)/g' {} \;

Начиная с /var/www рекурсивно ищем файлы по маске абсолютного пути (т.е. только те файлы database.inc, которые обязательно лежат внутри директории database) и в них меняем все вхождения foreach ($data as $i => $value) на foreach (array_values($data) as $i => $value). Конвейера тут в общем-то нет, результат выполнения find (имена найденных файлов) передаются sed (потоковому текстовому редактору) через exec (а не через конвейер).

Но искать и менять текст в файлах приходится очень часто, поэтому далее очень краткий ликбез по sed. Общий его синтаксис таков:
sed -e s/было/стало/ file.txt

Нас больше всего интересует команда, которую мы даём редактору через ключ -e. Команда состоит из следующих компонентов:

  • s — это собственно команда замены (она сообщает, что именно должен делать sed с текстом);
  • / — разделитель параметров команды (можно использовать какой-то другой спецсимвол: напишите его после s и он будет считаться разделителем, как, например s:было:стало);
  • было — это то, что нужно искать в файле;
  • стало — то, на что нужно заменить искомое.

Для того, чтобы менять не только первое найденное вхождение, а все-все, используется модификатор g в конце команды: s/было/стало/g

Поскольку sed поддерживает регулярные выражения, некоторые символы внутри команды вам придётся экранировать, например . (точку), * (звёздочку), / (слэш, если он разделитель), ' (одинарную кавычку, если она обособляет команду). Экранирование производится обратным слешем (\).

Чтобы протестировать работу вашей команды для sed уберите ключ -i (тогда результаты замены не будут записываться в файлы, а будут выводиться на экран).

Проблема: На сервере кончается место, надо быстро найти потолстевших кандидатов для чистки

Задача: В красивом сортированном формате показать объём каталогов в определенной ветке файловой системы

Решение:
du -hsx /var/www/* | sort -rh

Полу́чите отсортированный по убыванию вывод в «человеческом» формате, т.е. с единицами измерениями (типа G, M для гигабайтов, мегабайтов). Раньше приходилось извращаться, а теперь у sort есть ключик h, который умеет сортировать с учётом единиц измерения.

Кстати, если сделать вот так du -hsx /var/www/*/ | sort -rh, то команда вам покажет только директории (и не будет показывать файлы, если они вдруг валяются в анализируемой директории).

Проблема: Злые боты взломали какой-то сайт и шлют почтовый спам с вашего сервера.

Задача: Быстро понять, какой сайт взломали.

Решение:
cat /var/log/mail.log | grep 'uid=' | awk -F 'uid=' {'print$2'} | awk {'print $1'} | sed 's/,//g' | sort | uniq -c | sort -n | tail -5 | awk {'print "UID:",$2,"MESSAGES COUNT:",$1'}

Однострочник смотрит почтовый лог и подсчитывает, сколько писем было отправлено от каждого пользователя в системе. В итоге выводит пятёрку самых активных писателей писем. Показывает не имена пользователей, а их идентификаторы (UID), но посмотреть связь между UID и именами вы всегда можете в файле /etc/passwd

Если вы используете не Ubuntu, а, например, CentOS, то вероятнее всего файл лога будет называться /var/log/maillog (без расширения).

Пример вывода:
UID: 500 MESSAGES COUNT: 1020 UID: 549 MESSAGES COUNT: 257 UID: 595 MESSAGES COUNT: 4202 UID: 547 MESSAGES COUNT: 5010

UID: 605 MESSAGES COUNT: 11694

Сразу видно, что сайт юзера с UID 605 — поломали. А юзеров 595 и 547 надо проверить.

Предполагается, что у вас используется apache2-mpm-itk или какое-то ещё решение для того, чтобы каждый сайт работал от имени отдельного пользователя. Если все сайты у вас запущены от одного юзера, то такой однострочник вам не поможет.

Примечание: если у вас почтовый лог не ротируется и весит сотни мегабайт, то сервер может поднапрячься. В этом случае, смотрите не весь лог, а только его конец (хвост). Например, замените в начале cat /var/log/maillog на tail -10000, чтобы анализировать только 10 тыс. последних строк из лога.

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

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

Проблема: Вы поменяли пароль от БД, надо найти все скрипты, где встречался старый пароль

Задача: Наглядно показать файлы, где есть искомая строка

Решение:
grep -rn '/var/www' -e "oldPassW0rd"

Ключ -r заставляет поиск работать рекурсивно (заглядывать во все поддиректории). Ключ -n выведет на экран номер строки (или строк), где обнаружено вхождение.

»

Оцените статью
Про Ubuntu — блог о популярном СПО GNU/Linux-дистрибутиве Ubuntu (Убунту Линукс)