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

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
CDPATH - WTF??

Читать ман по башу иногда весело и полезно. Узнаешь такие вещи, о которых никогда раньше и не задумывался. Одним из таких открытий для меня стала переменная CDPATH. Это набор директорий, разделенных через двоеточие, среди которых cd будет искать указанную вами директорию, если путь начинается не со слеша.

$ export CDPATH="/home/bykva"
$ cd / # уходим в некоторую любую папку
/$ cd Documents
/home/bykva/Documents


Этот поиск поддерживает также автодополнение, таким образом достаточно написать, например, cd Doc[TAB] и он автоматически дополнит до Documents.

#bash_tips_and_tricks
Ну и раз уж пошла такая пьянка, вот еще один трюк.

Все знают, что ~ (тильда) используется для перехода в домашнюю директорию. чью? 90% людей ответят, что в свою. На самом деле не только. Вот такая конструкция позволит вам перейти в домашнюю директорию пользователя user:

cd ~user


Так, например, можно пользоваться этим при копировании scp\rsync:

scp root@host:~user/file ./


Эта команда позволит забрать файл из хомяка пользователя user, не набирая /home/user/file. Да и обязательно ли хомяк юзера лежит в /home....?

#bash_tips_and_tricks
bash наркомания

Мне взбрело в голову, что я хочу формировать набор команд, объединять их через && и поместить результирующую строку в переменную. При этом хотелось еще и вывести это на экран, да не просто в виде command && command, но в читабельном виде. В итоге родилась вот такая конструкция:

exec 5>&1

for <expression>; do
var+=$(echo "<command> && " | tee >(cat - >&5))
done

echo $var


Таким образом в течении всего цикла каждая дозапись в переменную будет выводить на экран строку с дозаписываемой командой, а после окончания цикла $var будет содержать список команд, объединенных через &&.

Синтетический пример:

exec 5>&1

for ((i=1;i<=3;i++)); do
var+=$(echo "echo $i && " | tee >(cat - >&5))
done

echo $var


Output:

echo 1 && 
echo 2 &&
echo 3 &&

echo 1 && echo 2 && echo 3 &&


#bash_tips_and_tricks
Немного о баш скриптовании

Порою возникает необходимость записать какие-то данные в фай с сохранением переноса строк и отступов. сделать это можно несколькими способами.

1) с помощью echo

echo -e 'This is first string\nAnd this is second' > /path/to/file


Такой способ имеет только единственный плюс - он однострочник. В реальности он впринципе не читабельный.

Разбить этот однострочник можно, конечно, на несколько строк:

echo "
str1
$variable - why not?
str N
"


И такой способ впринципе хорош до тех пор, пока вам не придется экранировать кавычки в тексте.

2) с помощью cat

cat > ceph.conf << EOF
[global]
mon_host = xx.xx.xx.xx:6789
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
EOF


В отличии от первого способа переменные по-прежнему интерпретируются, а кавычки экранировать не нужно.

#bash_tips_and_tricks
Рубрика "а что, так можно было"

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

├─bash───newgrp───bash───pstree


А также, она меняет GID текущего пользователя, если у тебя есть на это права.

Командой newusers можно создавать набор пользователей из файла. или заводить их в интерактивном режиме.


Спасибо vos за поправки.
#bash_tips_and_tricks
копируем содержимое папки с dot-файлами

Казалось бы, чего сложного, cp -r /opt/* /app/, однако, есть нюансы. Квантификатор * не учитывает файлы и папки, начинающиеся с точки, поэтому в список аргументов для копирования они не попадают.

Для решения этой проблемы можно использовать такую конструкцию, которая скопирует все содержимое директории, включая dot-файлы и папки:


cp -r /opt/. /app


#bash_tips_and_tricks
Удаляем из директории все, исключая несколько файлов

Встретил несколько реализаций этой задачи - когда надо полностью почистить папку, включая dot-файлы, но при этом когда нужно сохранить какие-то определенные. Писать длинные скрипты, парсить вывод ls? слишком мутно. Проще всего включить опцию extglob в bash.

shopt -s extglob
rm -rf !(package*.json|node_modules) .[!.]* ..?*


!(regexp) - список файлов в виде регулярки, которые нужно сохранить
.[!.]* - исключить из списка аргументов символ .
..?* - исключить из списка аргументов символ ..
два последних - для того чтобы rm не удалял ./. и ./.. - он их не удалит, но процесс завершится с ошибкой. (хотя и отработает, удалив все что нужно)

выключить обратно extglob можно с помощью ключа -u

#bash_tips_and_tricks
Список тегов, используемых в канале:

—-------------------------------
Лекции и материалы
—-------------------------------
#Занятие
#Лекции
Лекция
#junior

—---------
Linux
—---------
#ssh
#bash
#bash_tips_and_tricks
#awk
#tmux
#console
#utils
#troubleshooting
#nmap
#apt
#bind
#sound
#power_management

—----------
DevOps
—----------
#jenkins
#ansible
#git
#kubernetes
#deploy
#ceph
#docker
#puppet

—------------------
Virtualization
—------------------
#vmware
vagrant

—------------------
Networking
—---------------—
#networking
#proxy
#socks

—---------
InfoSec
—---------
#vulns
#security
#ctf

—-------------
Windows
—-------------
#RDTS
#windows_server2012
#RDP

—------------
Datacenters
—---------—
#ovh
#hetzner

—-------
Other
—-------
#android
#jira

—------------------------------------------------
Ссылки и сторонние материалы
—------------------------------------------------
#read
#thirdparty

Updated: 29.05.18
110 полезных команд для ОС Linux

Я потихонечку со студентами в рамках курса по Linux делаю проект, способствущий изучению командам, необходимым для работы в ОС linux. Пока это далеко даже не релизная версия, поэтому там точно есть множество несоответствий действительности, которые нужно исправлять. Если у Вас есть желание поспособствовать проекту - обращайтесь.

https://github.com/bykvaadm/SuzenEscape

группа для обсуждений: https://t.me/joinchat/CwI6k0yeabxC6teSz3usnQ

#learning #students #bash_tips_and_tricks #junior
Bash shortcuts

Написал микро лабораторную работу для обучения хоткеям в bash. Все это доступно благодняря библиотеке readline. Все описанное ниже и более того - man readline

https://medium.com/@bykvaadm/bash-shortcuts-d6f275a6ce9d

#bash_tips_and_tricks #junior
.bashrc vs .bash_profile

разница между ними в том что .bash_profile исполняется при прямом логине в shell, тогда как .bashrc выполняется для non-login shells. Таким образом если вы например хотите настроить алиасы для работы в консоли на удаленном сервере - ваш файл bash_profile, если это будет отличный от прямого входа в shell - тогда настраиваем bashrc.

But, if you’ve already logged into your machine and open a new terminal window (xterm) then .bashrc is executed before the window command prompt. .bashrc is also run when you start a new bash instance by typing /bin/bash in a terminal.

#bash_tips_and_tricks
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