CDPATH - WTF??
Читать ман по башу иногда весело и полезно. Узнаешь такие вещи, о которых никогда раньше и не задумывался. Одним из таких открытий для меня стала переменная CDPATH. Это набор директорий, разделенных через двоеточие, среди которых cd будет искать указанную вами директорию, если путь начинается не со слеша.
Этот поиск поддерживает также автодополнение, таким образом достаточно написать, например,
#bash_tips_and_tricks
Читать ман по башу иногда весело и полезно. Узнаешь такие вещи, о которых никогда раньше и не задумывался. Одним из таких открытий для меня стала переменная CDPATH. Это набор директорий, разделенных через двоеточие, среди которых cd будет искать указанную вами директорию, если путь начинается не со слеша.
$ export CDPATH="/home/bykva"
$ cd / # уходим в некоторую любую папку
/$ cd Documents
/home/bykva/Documents
Этот поиск поддерживает также автодополнение, таким образом достаточно написать, например,
cd Doc[TAB]
и он автоматически дополнит до Documents.#bash_tips_and_tricks
Ну и раз уж пошла такая пьянка, вот еще один трюк.
Все знают, что ~ (тильда) используется для перехода в домашнюю директорию. чью? 90% людей ответят, что в свою. На самом деле не только. Вот такая конструкция позволит вам перейти в домашнюю директорию пользователя user:
Так, например, можно пользоваться этим при копировании scp\rsync:
Эта команда позволит забрать файл из хомяка пользователя user, не набирая /home/user/file. Да и обязательно ли хомяк юзера лежит в /home....?
#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 наркомания
Мне взбрело в голову, что я хочу формировать набор команд, объединять их через && и поместить результирующую строку в переменную. При этом хотелось еще и вывести это на экран, да не просто в виде
Таким образом в течении всего цикла каждая дозапись в переменную будет выводить на экран строку с дозаписываемой командой, а после окончания цикла $var будет содержать список команд, объединенных через
Синтетический пример:
Output:
#bash_tips_and_tricks
Мне взбрело в голову, что я хочу формировать набор команд, объединять их через && и поместить результирующую строку в переменную. При этом хотелось еще и вывести это на экран, да не просто в виде
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
Такой способ имеет только единственный плюс - он однострочник. В реальности он впринципе не читабельный.
Разбить этот однострочник можно, конечно, на несколько строк:
И такой способ впринципе хорош до тех пор, пока вам не придется экранировать кавычки в тексте.
2) с помощью cat
В отличии от первого способа переменные по-прежнему интерпретируются, а кавычки экранировать не нужно.
#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
Рубрика "а что, так можно было"
Вот работаешь себе спокойно админом, делаешь какие-то действия из года в год, а потом раз и... так можно было? т.е. есть какие-то очень примитивные вещи, о которых ты просто не знаешь и работаешь как-то без них, ну и ладно. В частности как пример - обновить свое членство в группах можно без изменения текущей сессии - командой
А также, она меняет GID текущего пользователя, если у тебя есть на это права.
Командой
Спасибо vos за поправки.
#bash_tips_and_tricks
Вот работаешь себе спокойно админом, делаешь какие-то действия из года в год, а потом раз и... так можно было? т.е. есть какие-то очень примитивные вещи, о которых ты просто не знаешь и работаешь как-то без них, ну и ладно. В частности как пример - обновить свое членство в группах можно без изменения текущей сессии - командой
newgrp
. Эта команда открывает новый шелл в рамках текущего, получая следующую картину:├─bash───newgrp───bash───pstree
А также, она меняет GID текущего пользователя, если у тебя есть на это права.
Командой
newusers
можно создавать набор пользователей из файла. или заводить их в интерактивном режиме.Спасибо vos за поправки.
#bash_tips_and_tricks
копируем содержимое папки с dot-файлами
Казалось бы, чего сложного,
Для решения этой проблемы можно использовать такую конструкцию, которая скопирует все содержимое директории, включая dot-файлы и папки:
#bash_tips_and_tricks
Казалось бы, чего сложного,
cp -r /opt/* /app/
, однако, есть нюансы. Квантификатор * не учитывает файлы и папки, начинающиеся с точки, поэтому в список аргументов для копирования они не попадают.Для решения этой проблемы можно использовать такую конструкцию, которая скопирует все содержимое директории, включая dot-файлы и папки:
cp -r /opt/. /app
#bash_tips_and_tricks
Удаляем из директории все, исключая несколько файлов
Встретил несколько реализаций этой задачи - когда надо полностью почистить папку, включая dot-файлы, но при этом когда нужно сохранить какие-то определенные. Писать длинные скрипты, парсить вывод ls? слишком мутно. Проще всего включить опцию extglob в bash.
!(regexp) - список файлов в виде регулярки, которые нужно сохранить
.[!.]* - исключить из списка аргументов символ .
..?* - исключить из списка аргументов символ ..
два последних - для того чтобы rm не удалял ./. и ./.. - он их не удалит, но процесс завершится с ошибкой. (хотя и отработает, удалив все что нужно)
выключить обратно extglob можно с помощью ключа -u
#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
—-------------------------------
Лекции и материалы
—-------------------------------
#Занятие
#Лекции
Лекция
#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
Я потихонечку со студентами в рамках курса по Linux делаю проект, способствущий изучению командам, необходимым для работы в ОС linux. Пока это далеко даже не релизная версия, поэтому там точно есть множество несоответствий действительности, которые нужно исправлять. Если у Вас есть желание поспособствовать проекту - обращайтесь.
https://github.com/bykvaadm/SuzenEscape
группа для обсуждений: https://t.me/joinchat/CwI6k0yeabxC6teSz3usnQ
#learning #students #bash_tips_and_tricks #junior
GitHub
GitHub - bykvaadm/SuzenEscape: Game
Game. Contribute to bykvaadm/SuzenEscape development by creating an account on GitHub.
Bash shortcuts
Написал микро лабораторную работу для обучения хоткеям в bash. Все это доступно благодняря библиотеке readline. Все описанное ниже и более того -
https://medium.com/@bykvaadm/bash-shortcuts-d6f275a6ce9d
#bash_tips_and_tricks #junior
Написал микро лабораторную работу для обучения хоткеям в bash. Все это доступно благодняря библиотеке readline. Все описанное ниже и более того -
man readline
https://medium.com/@bykvaadm/bash-shortcuts-d6f275a6ce9d
#bash_tips_and_tricks #junior
Medium
bash shortcuts
Небольшая лабораторка по изучению основных хоткеев в bash. Подготовьте себе вот такую строку:
.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_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 выдает на stdout строку, которую он нашел. и тогда на if подается набор каких-то отфильтрованных символов. шо бы таки этого избежать, можно просто использовать с грепом ключ --quiet. тогда if реагирует на код возврата - нашел - не нашел - true & false. как раз то что нужно для условия.
#bash_tips_and_tricks
хотелось бы составить такую конструкцию:
если бла-бла-бла (вывод) | grep <expression> то выполнить <cmd>
Проблема в том, что grep выдает на stdout строку, которую он нашел. и тогда на if подается набор каких-то отфильтрованных символов. шо бы таки этого избежать, можно просто использовать с грепом ключ --quiet. тогда if реагирует на код возврата - нашел - не нашел - true & false. как раз то что нужно для условия.
#bash_tips_and_tricks
Послать сообщение по tcp\udp когда под рукой вообще нет ничего
#bash_tips_and_tricks
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
обрезаем строку, выбирая диапазон для отображения
Или через pipe или напрямую из файла можно заставить отобразить именно какой-то конкретный кусок строки. Например это может понадобиться для дебага при просмотре логов mysql, чтобы видеть запросы.
#bash_tips_and_tricks
cut -c 140-240 file
Или через pipe или напрямую из файла можно заставить отобразить именно какой-то конкретный кусок строки. Например это может понадобиться для дебага при просмотре логов mysql, чтобы видеть запросы.
#bash_tips_and_tricks
Самый быстрый способ узнать свой IP-адрес(*)
в качестве вывода получите список всех адресов, разделенных пробелом, кроме 127.0.0.1. Таким образом, если вы точно знаете что у вас всего один интерфейс (помимо lo), то вывод даст вам в чистом виде адрес интерфейса.
*при условии что у вас один интерфейс
#bash_tips_and_tricks
hostname -Iзначение ключа: -I, --all-ip-addresses all addresses for the host
в качестве вывода получите список всех адресов, разделенных пробелом, кроме 127.0.0.1. Таким образом, если вы точно знаете что у вас всего один интерфейс (помимо lo), то вывод даст вам в чистом виде адрес интерфейса.
*при условии что у вас один интерфейс
#bash_tips_and_tricks
Консольный генератор паролей
Утилита pwgen (есть в репозиториях debian) - генерирует поле из 8 символьных паролей. Вам остается только выбрать требуемое количество групп и убрать пробелы.
По просьбе особо упоротых раскрываю тему ебли сисек. Эта утилита имеет help, в котором рассказывается, что кроме ввода без параметров существуют еще и другие способы вывода паролей.
--
Еще несколько способов предложенных в качестве "нативных" генераторов:
#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
#bash_tips_and_tricks
1. находим inode
ls -i
2. делаем что хотим, например, выводим на экран:find . -inum 12345 -exec cat '{}' \;
#bash_tips_and_tricks
Назначаем права на файлы
Дано: есть N файлов с неизвестными разными правами
Задача: для всех файлов и директорий сделать права группы = правам пользователя
Решение: chmod -R g=u ./*
#bash_tips_and_tricks
Дано: есть N файлов с неизвестными разными правами
Задача: для всех файлов и директорий сделать права группы = правам пользователя
Решение: chmod -R g=u ./*
#bash_tips_and_tricks