Админим с Буквой
5.52K subscribers
303 photos
8 videos
59 files
1.16K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
bash использование grep как условия для if

хотелось бы составить такую конструкцию:

если бла-бла-бла (вывод) | grep <expression> то выполнить <cmd>


Проблема в том, что grep выдает на stdout строку, которую он нашел. и тогда на if подается набор каких-то отфильтрованных символов. шо бы таки этого избежать, можно просто использовать с грепом ключ --quiet. тогда if реагирует на код возврата - нашел - не нашел - true & false. как раз то что нужно для условия.

#bash_tips_and_tricks
Послать сообщение по tcp\udp когда под рукой вообще нет ничего

echo "123" >/dev/tcp/127.0.0.1/7777

Можно использовать для разных целей, в том числе чтобы протестировать доступность порта, если нет telnet

>/dev/tcp/127.0.0.1/23
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/23: Connection refused


#bash_tips_and_tricks
обрезаем строку, выбирая диапазон для отображения


cut -c 140-240 file


Или через pipe или напрямую из файла можно заставить отобразить именно какой-то конкретный кусок строки. Например это может понадобиться для дебага при просмотре логов mysql, чтобы видеть запросы.

#bash_tips_and_tricks
Самый быстрый способ узнать свой IP-адрес(*)

hostname -I

значение ключа: -I, --all-ip-addresses all addresses for the host

в качестве вывода получите список всех адресов, разделенных пробелом, кроме 127.0.0.1. Таким образом, если вы точно знаете что у вас всего один интерфейс (помимо lo), то вывод даст вам в чистом виде адрес интерфейса.

*при условии что у вас один интерфейс

#bash_tips_and_tricks
Консольный генератор паролей

Утилита pwgen (есть в репозиториях debian) - генерирует поле из 8 символьных паролей. Вам остается только выбрать требуемое количество групп и убрать пробелы.

По просьбе особо упоротых раскрываю тему ебли сисек. Эта утилита имеет help, в котором рассказывается, что кроме ввода без параметров существуют еще и другие способы вывода паролей.

--
Еще несколько способов предложенных в качестве "нативных" генераторов:

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | sed 1q
base64 -w 15 /dev/urandom | head


#bash_tips_and_tricks
Вопросительные знаки вместо прав

если после набора ls -lash получаем такую картину:

? d????????? ? ? ? ?            ? .
? d????????? ? ? ? ? ? ..
? -????????? ? ? ? ? ? gpg.conf
? d????????? ? ? ? ? ? openpgp-revocs.d
? -????????? ? ? ? ? ? pubring.kbx
? -????????? ? ? ? ? ? pubring.kbx~
? -????????? ? ? ? ? ? trustdb.gpg

то починить это можно такой командой:

chmod -R a+X /path/to/folder

#bash_tips_and_tricks
Способ, который поможет работать с файлами, имеющими в названиях ЛЮБЫЕ спецсимволы

1. находим inode ls -i
2. делаем что хотим, например, выводим на экран:
find . -inum 12345 -exec cat '{}' \;

#bash_tips_and_tricks
Bash - посчитать сумму чисел в колонке

<SOME_DATA> | awk '{s+=$1}END{print s}'


#bash_tips_and_tricks
Назначаем права на файлы

Дано: есть N файлов с неизвестными разными правами
Задача: для всех файлов и директорий сделать права группы = правам пользователя

Решение: chmod -R g=u ./*

#bash_tips_and_tricks
удаление старых файлов

подсчет занимаемого места

nice find ./ -type f -mtime +365 | xargs du | awk '{ t+=$1 } END { print t }'

просмотр

find ./ -type f -mtime +365 -exec ls {} \; 

удаление

nice find ./ -type f -mtime +365 -exec rm {} \; 

удаление 2 (быстрее):

для удаления вместо \; лучше использовать \+, так работает гораздо быстрее, т.к. \; на каждый файл будет запускать rm, а \+ будет комбинировать пока не дойдет до ARG_MAX или не кончатся файлы.

А еще... есть ключ -delete

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

cmd=$(ps aux)
printf "%s\n" "$cmd"

#bash_tips_and_tricks
как массово переименовывать файлы по маске

дано: file.ololo.orig, результат: file.ololo

Пример 1:
for i in $(ls *.back); do echo $i is now ${i/back/hi-bo0om}; done
1.2.back is now 1.2.hi-bo0om
3.4.back is now 3.4.hi-bo0om
5.6.back is now 5.6.hi-bo0om

Пример 2:
find -type f -name "*.html~" |
while read f; do
mv "$f" "${f%\~}"
done

Пример 3:
for i in $(ls *.back); do basename $i .back; done

Пример 4:
basename -s .back $(find ./ -name *.back)

Пример 5: (нужно ставить доп утилиту)
rename 's/.back/.hi-bo0om/g' *

UPD Дополнительное чтиво:
https://mywiki.wooledge.org/UsingFind
https://mywiki.wooledge.org/ParsingLs

#bash_tips_and_tricks