BashMaster
Open in Telegram
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов. Реклама: @Kone4noVasya Канал на бирже: https://telega.in/c/bash_help
Show more8 882
Subscribers
-124 hours
-167 days
+430 days
Posts Archive
8 882
Admin Guides - полезные заметки от сисадмина
Гайды по OS Windows & Linux, лайфхаки и полезные Open Source решения.
Подписывайтесь @admguides
8 882
Как удалить файл в bash
Любой файл можно удалить временно и навсегда в bash. Когда файл временно удаляется с помощью графического пользовательского интерфейса, он сохраняется в папке «Trash» и при необходимости может быть восстановлен. Файл, который был удален безвозвратно, не может быть восстановлен позже обычным образом. Команда
rm используется для окончательного удаления файла с компьютера. Если какой-либо файл был случайно удален этой командой, его можно восстановить из резервной копии. В этой статье показано, как удалить любой файл из терминала и графический интерфейс пользователя.
Удаление файла с помощью команды rm
Команда rm может использоваться с опцией и без опции для различных типов удаления. Синтаксис команды rm приведен ниже.
rm [option] filename
Параметр ‘-i’ может использоваться с командой rm для вывода подсказки перед удалением любого файла, чтобы предотвратить случайное удаление. Параметр ‘-f’ может использоваться с командой rm для принудительного удаления любого файла. Ниже показаны различные варианты использования команды rm.
Пример-1: Удаление файла с помощью команды rm без опции
Вы можете применить команду ‘rm’, чтобы удалить существующий файл. В следующем сценарии пустой файл создается с помощью команды touch для проверки команды rm. Затем используется команда ‘rm’ для удаления файла test.txt.
#!/bin/bash
# Установить имя файла
filename = 'test.txt'
# Создать пустой файл
touch $filename
# Проверить, существует ли файл,
if [ -f $filename ]; then
rm test.txt
echo "$filename удален"
fi
Пример-2: Удалите файл с помощью команды `rm` с параметром -i
Следующий сценарий запросит разрешение у пользователя перед удалением файла для параметра «-i». Здесь имя файла будет взято у пользователя в качестве ввода. Если файл существует и пользователь нажимает «n», то файл не будет удален, иначе файл будет удален.
#!/bin/bash
# Считайте имя файла
read -p 'Введите имя файла для удаления: ' filename
# Проверьте, существует ли файл,
if [ -f $filename ] ; then
# Удалить файл с разрешением
rm -i " $filename "
# Проверить, удален ли файл,
if [ -f $filename ] ; then
echo " $filename не удаляется"
else
echo " $filename удален"
fi
else
echo "Файл не существует"
fi
Пример-3: Удалите файл с помощью команды `rm` с параметром -v
Следующий скрипт получит имя файла с помощью аргумента командной строки. Если файл существует, он напечатает сообщение об удалении с именем файла для параметра ‘-v’.
#!/bin/bash
# Проверить, существует ли файл
if [[ $1 != "" && -f $1 ]]; then
# Вывести сообщение об удалении
rm -v $1
else
echo "Имя файла не указано или имя файла не существует"
fi
Пример-4: Удалить несколько файлов с помощью команды `rm`
Более одного файла можно удалить, используя команду ‘rm’ и разделяя имена файлов пробелом. В следующем скрипте несколько имен файлов будут взяты из аргументов командной строки. Если какой-либо файл не существует, он покажет сообщение, иначе имена файлов будут объединены пробелом и сохранены в переменной с именем files. Затем будет выполнена команда rm с переменной files для удаления нескольких файлов.
#!/bin/bash
files=""
space=""
# Проверить, указано ли несколько имен файлов,
if [ $# > 2 ]; then
# Чтение значений аргументов с использованием цикла
for argval in "$@"
do
if [ -f $argval ]; then
files+=$argval$space
else
echo "$argval не существует"
fi
done
# Удалить файлы
rm $files
echo "файлы удалены."
else
echo "Имена файлов не указаны или имя файла не существует"
fi
В приведенных выше примерах показаны различные типы способов удаления файла с помощью сценария bash, чтобы помочь пользователям bash легко выполнять этот тип задачи.
🔨 bash_help8 882
Гибридный ChatGPT версии 3.5 - 4 с высокой скоростью ответа уже доступен бесплатно!
отлично подходит программистам, аналитикам, студентам и вообще всем тем, кто сидит за компьютером. Поможет найти книги или рассказать краткий пересказ.
Бот помнит контекст, то есть историю вашей переписки и будет отвечать точно.
На данный момент реализована:
Генерация текста по вашему тексту(text-to-text)
Генерация текста по вашей картинке(image-to-text)
Что будет реализовано:
генерация картинок по описанию (text-to-image)
Никаких ограничений и подписок
https://t.me/gpt_lama_bot
8 882
Пример скрипта для создания резервной копии файлового сервера
Данный скрипт написан на bash под управлением операционной системы семейства Linux. Он будет работать по следующему сценарию:
Ежедневная актуализация данных в каталоге резервный копий daily.
Еженедельная актуализация данных в каталоге резервный копий weekly.
Создание полного архива с данными раз в 30 дней.
Старые архивы (которым более 370 дней) будут удаляться.
Скрипт будет сравнивать файлы в рабочем каталоге и папке резервного копирования с помощью rsync. Это позволит нам сэкономить на времени выполнения задания. Долго будет выполняться только задание создания архива с помощью tar.
Создаем каталог для скриптов и сам скрипт:
mkdir /scripts
vi /scripts/samba_backup.sh
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
source="/data"
destination_root="/backup"
fdate=$(date +%Y-%m-%d)
# Clean old archives
find ${destination_root}/archive -type f -name "*.tar.gz" -ctime +370 -exec rm -R {} \; 2>&1
# Daily
rsync -a --partial --inplace --append --delete-after ${source}/ ${destination_root}/daily/
# Weekly
if [[ $(date +%u) -eq 0 ]]
then
rsync -a --partial --inplace --append --delete-after ${source}/ ${destination_root}/weekly/
fi
# Archive
count_last_archives=$(find ${destination_root}/archive/ -name "*.tar.gz" -mtime -30 | wc -l)
if [[ $count_last_archives -eq 0 ]]
then
cd ${source}
tar zcf ${destination_root}/archive/samba_${fdate}.tar.gz ./*
fi
Задаем права скрипту на выполнение:
chmod +x /scripts/samba_backup.sh
Скрипт готов к работе.
🖼️ Ссылка на скрипт
🔨 bash_help8 882
Как ловить и обрабатывать ошибки в bash
Оболочка bash не имеет какого-либо причудливого механизма проглатывания исключений, такого как конструкции
try/catch. Некоторые ошибки bash могут быть просто проигнорированы, но могут иметь последствия в будущем. В оболочке bash нет даже надлежащего отладчика.
В этом руководстве я познакомлю вас с основными советами по отлову и обработке ошибок в bash. Хотя представленные методы обработки ошибок не так причудливы, как доступные в других языках программирования, мы надеемся, что, приняв эту практику, вы сможете более изящно обрабатывать потенциальные ошибки bash.
Совет № 1 по обработке ошибок Bash: проверьте статус выхода
В качестве первой линии защиты всегда рекомендуется проверять статус выхода команды, поскольку ненулевой статус выхода обычно указывает на какой-то тип ошибки. Например:
if ! some_command; then
echo "some_command returned an error"
fi
Другой (более компактный) способ инициировать обработку ошибок на основе статуса выхода — использовать список ИЛИ:
<command1> <command2>
С этим оператором ИЛИ выполняется тогда и только тогда, когда возвращает ненулевой статус выхода. Таким образом, вы можете заменить своей собственной процедурой обработки ошибок. Например:
error_exit()
{
echo "Error: $1"
exit 1
}
run-some-bad-command error_exit "Some error occurred"
Bash предоставляет встроенную переменную с именем $?, которая сообщает вам статус выхода последней выполненной команды. Обратите внимание, что при вызове функции bash $? считывает статус выхода последней команды, вызванной внутри функции. Поскольку некоторые ненулевые коды выхода имеют особое значение, вы можете обрабатывать их выборочно. Например:
# run some command
status=$?
if [ $status -eq 1 ]; then
echo "General error"
elif [ $status -eq 2 ]; then
echo "Misuse of shell builtins"
elif [ $status -eq 126 ]; then
echo "Command invoked cannot execute"
elif [ $status -eq 128 ]; then
echo "Invalid argument"
fi
🖼️ Дочитать статью
🔨 bash_help8 882
ITGLOBAL.COM выпустили книгу «Публичное облако 2023»
Команда ITGLOBAL.COM подготовила объемный материал — книгу «Публичное облако 2023». Это руководство для тех, кто заинтересован в переходе на облачные решения.
В книге:
🔹 представлен обзор экспертов о состоянии отечественного рынка
🔹 описаны технологии на базе российских платформ виртуализации
🔹 обозначены риски перехода на них
🔹 предложены шаги по минимизации рисков.
Книга будет полезна для руководителей, технических директоров и ИТ-специалистов, заинтересованных:
➖ в оптимизации работы компании
➖ развитии облачных инфраструктур
➖ минимизации рисков ИБ.
Заполните форму на сайте, чтобы получить ссылку на книгу.
Реклама. ООО "ИТГЛОБАЛКОМ РУС". ИНН 7838413489. erid: LjN8KJkpF
8 882
Шесть полезных трюков в работе с Linux
Если вы администрируете сервер c Linux-based операционной системой и вам часто приходится работать с bash - небольшие трюки ниже вам обязательно пригодятся, если вы с ними еще не знакомы :)
Табуляция
Первый трюк - табуляция. Многие, когда только начинают работать с Linux системами не знают об этой фиче, но она очень сильно упрощает жизнь. Табуляция - это завершение команд и названий файлов после нажатия на Tab. Когда это может быть полезно? К примеру, вы забыли как пишется команда или файл имеет длинное название, содержащее в себе много информации- номер версии, разрядность и так далее - начните писать название файла и нажмите на клавишу Tab - и сразу все получится!
Пайпирование
Второй трюк - пайпирование. Пайпом в Linux системах называется символ
| - он позволяет отправлять вывод одной команды в другую. К примеру, команда ls выводит список файлов в директории и команда grep возвращает результаты поиска по заданным параметром. С помощью пайпа эти две команды можно скомбинировать - например если вам нужно найти в директории конкретный файл (в данном случае - некую аудиозапись, которая начинается как recording010101:
ls | grep recording010101
Маска
Третий трюк - использование маски, которая обозначается символом * - звездочка. К примеру, если нужно удалить все файлы, которые начинаются на слово recording01, то можно ввести следующую команду:
rm recording01*
Это может быть очень полезным при написании скриптов, которые удаляют по крону старые логи или файлы аудио-записей. Но с данной командой нужно быть очень аккуратным - если забыть проставить критерии поиска, то команда вида rm * удалит всё содержимое директории.
Вывод команды в файл
Четвертый трюк - вывод команды в файл. Это делается с помощью символа >. Сценариев использования масса, как пример приведу вывод команды ls в текстовый файл (ниже) - если у вас в директории очень большое количество файлов, то, для общего понимания что же именно в ней находится будет проще работать с текстовым файлом или же можно запустить рекурсивный скрипт с занесением содержимого всех каталогов в текстовые, например:
ls > testfile.txt
Быстрая смена директории
Пятый трюк - смена директории на домашнюю директории конкретного юзера с помощью символа ~. Просто введите cd ~ и вы попадете в директорию /home/user.
Фоновые процессы и запуск по условию
Шестой трюк - это запуск команды по условию и запуск команды в бэкграунде (фоновый процесс). Для этого служит символ & .
Если хотите запустить, к примеру, Wireshark в бэкграунде, необходимо написать wireshark & - по умолчанию Bash запускает каждую программу в текущем терминале. Поэтому это может очень пригодиться, если вам нужно выполнять какую-то программу и все ещё пользоваться тем же терминалом. А если нужно запустить Wireshark через какое-то время, то можно воспользоваться командой && - к примеру, sleep 360 && wireshark - это запустит wireshark через 6 минут. Сама команда sleep не делает ничего, это, грубо говоря, просто условный таймер.
🔨 bash_help8 882
🖥 Курс «Специалист центра мониторинга инцидентов информационной безопасности (SOC)»
Старт: 18 декабря
Длительность: 3,5 месяца
ℹ️ Курс охватывает ключевые процессы в Security Operation Center (SOC), включая Threat Intelligence, Threat Hunting, Vulnerability Management, моделирование угроз, реагирование на инциденты и основы администрирования СЗИ, используемых в SOC.
🎓 Кому будет полезен курс:
— Энтузиастам в области ИБ, с базовыми знаниями
— Системным администраторам, программистам, желающим стать специалистами по ИБ
— Начинающим сотрудникам SOC или ИБ-подразделений для более полного понимания процессов
Выдаём УПК/сертификат при успешной сдаче экзамена! Доступна рассрочка до 24 мес.
🎁 По промокоду CODEBY вы получите скидку 10%!
📌 Узнать подробнее о курсе
Реклама. ООО "АКАДЕМИЯ КОДЕБАЙ". ИНН 9706020333.
8 882
Как провести стресс-тестирование вашей системы Linux
Есть несколько полезных методов, которые вы можете использовать, и есть инструменты, которые вы можете использовать, чтобы упростить этот процесс. В этой статье мы рассмотрим несколько вариантов.
Создаем циклы своими руками
Данный первый метод предполагает запуск некоторых циклов в командной строке и наблюдение за тем, как они влияют на систему. Этот метод нагружает ЦП, значительно увеличивая нагрузку. Результаты можно легко увидеть с помощью команды uptime или аналогичных команд.
В приведенной ниже примере мы начинаем четыре бесконечных цикла. Вы можете увеличить количество циклов, добавляя цифры или используя выражение bash, например {1..6} вместо «1 2 3 4».
for i in 1 2 3 4; do while : ; do : ; done & done
В примере выше, команда, запускает четыре бесконечных цикла в фоновом режиме.
$ for i in 1 2 3 4; do while : ; do : ; done & done
[1] 205012
[2] 205013
[3] 205014
[4] 205015
В этом случае были запущены задания 1-4. Отображаются как номера заданий, так и идентификаторы процессов.
Чтобы увидеть влияние на средние значения нагрузки, используйте команду, подобную показанной ниже. В этом случае команда uptime запускается каждые 30 секунд:
$ while true; do uptime; sleep 30; done
Если вы собираетесь периодически запускать подобные тесты, вы можете поместить команду цикла в скрипт:
#!/bin/bash
while true
do
uptime
sleep 30
done
В выходных данных вы можете увидеть, как средние значения нагрузки увеличиваются, а затем снова начинают снижаться после завершения циклов.
Поскольку показанные нагрузки представляют собой средние значения за 1, 5 и 15 минут, потребуется некоторое время, чтобы значения вернулись к нормальным для системы значениям.
Чтобы остановить циклы, выполните команду kill, подобную приведенной ниже - при условии, что номера заданий равны 1-4, как было показано ранее в этой статье. Если вы не уверены, используйте команду jobs, чтобы проверить ID.
🖼️ Дочитать статью
🔨 bash_help8 882
Как запустить Bash скрипт в Linux
Прежде чем вы сможете запустить ваш скрипт, вам нужно, чтобы ваш скрипт был исполняемым. Чтобы сделать исполняемый скрипт в Linux, используйте команду
chmod и присвойте файлу права execute. Вы можете использовать двоичную или символическую запись, чтобы сделать ее исполняемой.
$ chmod u+x script
$ chmod 744 script
Если вы не являетесь владельцем файла, вам необходимо убедиться, что вы принадлежите к правильной группе или что права доступа предоставлены «другой» группе в вашей системе.
В некоторых дистрибутивах ваш файл будет выделен другим цветом, когда он исполняемый.
Теперь, когда ваш файл исполняемый, давайте посмотрим, как можно легко запустить скрипт Bash.
Запустить Bash скрипт из пути к скрипту
Чтобы запустить Bash скрипт в Linux, просто укажите полный путь к скрипту и укажите аргументы, которые могут потребоваться для запуска Bash скрипта.
$ /path/to/script <arg1> <arg2> ... <argn>
В качестве примера, скажем, у вас есть Bash-скрипт, расположенный в вашем домашнем каталоге.
Чтобы выполнить этот скрипт, вы можете указать полный путь к скрипту, который вы хотите запустить.
# Абсолютный путь
$ /home/user/script
# Абсолютный путь с аргументами
$ /home/user/script "john" "jack" "jim"
Кроме того, вы можете указать относительный путь к скрипту Bash, который вы хотите запустить.
# Относительный путь
$ ./script
# Относительный путь с аргументами
$ ./script "john" "jack" "jim"
Запустить Bash скрипт, используя bash
Чтобы запустить скрипт Bash в вашей системе, вы должны использовать команду bash и указать имя скрипта, который вы хотите выполнить, с необязательными аргументами.
$ bash <script>
Кроме того, вы можете использовать sh, если в вашем дистрибутиве установлена утилита sh.
В качестве примера, скажем, вы хотите запустить скрипт Bash с именем script. Чтобы выполнить его с помощью утилиты bash, вы должны выполнить следующую команду
$ bash script
This is the output from your script!
Выполнить скрипт Bash, используя sh, zsh, dash
В зависимости от вашего дистрибутива, в вашей системе могут быть установлены другие утилиты оболочки.
Bash - интерпретатор оболочки, установленный по умолчанию, но вы можете захотеть выполнить ваш скрипт с использованием других интерпретаторов. Чтобы проверить, установлен ли интерпретатор оболочки в вашей системе, используйте команду which и укажите нужный интерпретатор.
$ which sh
/usr/bin/sh
$ which dash
/usr/bin/dash
Когда вы определили интерпретатор оболочки, который хотите использовать, просто вызовите его, чтобы легко запустить скрипт.
Запуск скрипта Bash из любого места
В некоторых случаях вы можете запускать скрипты Bash, где бы вы ни находились в вашей системе.
Чтобы запустить скрипт Bash из любой точки вашей системы, вам нужно добавить свой скрипт в переменную среды PATH.
$ export PATH="<path_to_script>:$PATH"
Благодаря тому, что путь к скрипту добавлен в PATH, вы можете вызывать его там, где хотите в своей системе.
Кроме того, вы можете изменить переменную среды PATH в вашем файле .bashrc и использовать команду source для обновления вашей текущей среды Bash.
$ sudo nano ~/.bashrc
export PATH="<path_to_script>:$PATH"
Выйдите из файла и используйте команду source для файла bashrc для внесения изменений.
$ source ~/.bashrc
$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Запуск Bash скриптов из графического интерфейса
Последний способ выполнения Bash скриптов - это использование графического интерфейса, в данном случае интерфейса GNOME.
Чтобы запустить ваши скрипты с использованием GNOME, вы должны установить в проводнике Ask what to do для исполняемых файлов.
🔨 bash_help8 882
Bash функции и псевдонимы
В данной статье разберем как управлять файлами настройки оболочки пользователя. Псевдонимы и функции определяются в файлах с окончанием
RC - Bash.bashrc, bashrc, ~/.bashrc.
В зависимости от того в каком файле мы употребим псевдоним или функцию он будет использоваться для конкретного пользователя или для всех пользователей. Посмотрим на конкретном примере пользователя, поэтому будет использоваться файл ~/.bashrc , который находится в домашней директории пользователя и определят настройки конкретного пользователя.
Псевдоним (alias) – текст для вызова команды с ключами. Например: la = ‘ls -A’.
Функция – текст для вызова скрипта, из нескольких команд. Например:
function Hello (){echo “Hello,dear,I am awake for:”; uptime –p;}
Заходим в Ubuntu и попадаем в домашнюю директорию. Следовательно в этой домашней папке есть файл .profile, который является ссылкой на файл bashrc. И в этом файле есть много чего, но в частности есть псевдонимы.
🖼️ Дочитать статью
🔨 bash_help8 882
Сочетания клавиш bash
Ранее мы уже публиковали подобный пост. Этот более подробный.
Оболочка bash предлагает широкий выбор сочетаний клавиш, которые вы можете использовать. Они будут работать в bash в любой операционной системе.
Работа с процессами
Ctrl + C: прервать (убить) текущий процесс, запущенный в терминале на переднем плане. Это посылает процессу сигнал SIGINT, который технически является просто запросом - большинство процессов его учтут, но некоторые могут и проигнорировать.
Ctrl + Z: приостановить текущий процесс, запущенный в bash на переднем плане. Это отправляет процессу сигнал SIGTSTP. Чтобы позже вернуть процесс на передний план, используйте команду fg имя_процесса.
Ctrl + D: закрыть оболочку bash. Это отправляет маркер EOF (End of file - конец файла) в bash, и bash завершает работу, когда получает этот маркер. Это похоже на команду exit.
Перемещение курсора
Ctrl + A или Home: перейти к началу строки.
Ctrl + E или End: перейти в конец строки.
Alt + B: перейти на одно слово влево (назад).
Ctrl + B: перейти на один символ влево (назад).
Alt + F: перейти вправо (вперед) на одно слово.
Ctrl + F: перейти вправо (вперед) на один символ.
Ctrl + XX: перемещение между началом строки и текущей позицией курсора. То есть можно нажать Ctrl + XX, чтобы вернуться в начало строки, что-то изменить, а затем нажать Ctrl + XX, чтобы вернуться в исходную позицию курсора. Чтобы использовать этот шорткат, удерживайте клавишу Ctrl и дважды нажмите X.
Исправление опечаток
Alt + T: заменить текущее слово предыдущим.
Ctrl + T: поменять местами два последних символа перед курсором. Можно использовать, чтобы быстро исправить опечатки, когда вы вводите два символа в неправильном порядке.
Ctrl + _: отменить последнее нажатие клавиши. Можно использовать несколько раз подряд.
Вырезка и склейка
Ctrl + W: вырезать слово перед курсором и добавить его в буфер обмена.
Ctrl + K: вырезать часть строки после курсора, добавив ее в буфер обмена.
Ctrl + U: вырезать часть строки перед курсором, добавив ее в буфер обмена.
Ctrl + Y: вставить последнее вырезанное из буфера обмена.
Заглавные буквы
Alt + U: вводить каждый символ от курсора до конца текущего слова с заглавной буквы, переводя символы в верхний регистр.
Alt + L: убирает заглавные буквы с каждого символа от курсора до конца текущего слова, переводя символы в нижний регистр.
Alt + C: ввести заглавную букву под курсором. Ваш курсор переместится в конец текущего слова.
Табуляция
Завершение при помощи табуляции - очень полезная функция bash. При вводе имени файла, каталога или команды нажмите Tab, и bash автоматически завершит ввод, если это возможно. Если нет, bash покажет вам различные возможные совпадения, и вы можете продолжить вводить и нажимать Tab, чтобы закончить ввод.
Tab: автоматическое заполнение файла, каталога или команды, которую вы вводите.
Например, если у вас есть файл с длинным именем really_long_file_name в /home/alex/ и это единственное имя файла, начинающееся с r в этом каталоге, вы можете ввести /home/alex/r, нажать Tab, и bash автоматически заполнит /home/alex/really_long_file_name для вас. Если у вас есть несколько файлов или каталогов, начинающихся с r, bash проинформирует вас о доступных вариантах. Вы можете начать вводить один из них и нажать Tab, чтобы продолжить.
Работа с историей команд
Ctrl + P или стрелка вверх: переход к предыдущей команде в истории команд. Нажмите ярлык несколько раз, чтобы вернуться к истории.
Ctrl + N или стрелка вниз: переход к следующей команде в истории команд. Нажмите ярлык несколько раз, чтобы перейти вперед по истории.
Alt + R: отменить любые изменения команды, извлеченной из истории, если вы ее редактировали.
В Bash также есть специальный режим поиска, который вы можете использовать для поиска ранее выполненных команд:
Ctrl + R: вспомнить последнюю команду, соответствующую указанным вами символам. Нажмите это сочетание и начните вводить символы для поиска команды в истории bash.
Ctrl + O: запустите найденную команду с помощью Ctrl + R.
Ctrl + G: выйти из режима поиска в истории без выполнения команды.
🔨 bash_help8 882
Обработка строк циклом «for line in `comand`»
Если у вас какая-то команда возвращает список строк, например:
$ cat list.txt
шишка
яблоко
листок
груша
То с помощью цикла for line in `comand` можно обработать этот вывод построчно.
Например такой скрипт:
#!/bin/bash
for line in `cat list.txt`
do
echo "На дереве висит $line"
done
Выполним его:
$ ./test.sh
На дереве висит шишка
На дереве висит яблоко
На дереве висит листок
На дереве висит груша
Или более сложная задача, вывести все процессы пользователя и выяснить сколько файлов они открыли, а также сколько файлов им позволено открывать.
#!/bin/bash
for pid in `ps -u alex -o pid | grep -v PID`
do
ps -p $pid -o comm,user | grep -v COMMAND
egrep 'files|Limit' /proc/$pid/limits
echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"
done
🔨 bash_help8 882
Как сгенерировать пароль в терминале Linux
Рассмотрим, как можно сгенерировать случайный пароль в командной строке Linux. Будем использовать /dev/urandom и утилиты makepasswd, pwgen.
Используем /dev/urandom
При чтении устройство
/dev/urandom возвращает бесконечный набор случайных байтов. Этот вывод можно отфильтровать с помощью утилиты tr. Затем, вывод передать команде xargs которая, по умолчанию выполняет команду echo и ей передается всё, что было прочитано из стандартного ввода. А с помощью утилиты head можно указать необходимое количество символов в пароле.
То есть сгенерировать пароль в Linux поможет следующая команда:
$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
AurTdatFbw
Вы можете сделать bash функцию и записать её в ваш .bashrc:
$ nano .bashrc
genpasswd() {
local l=$1
[ "$l" == "" ] && l=16
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
Затем применим изменения и попробуем сгенерировать пароль:
$ . .bashrc
~$ genpasswd 5
Hbe7a
$ genpasswd 10
PDbt1tjBg0
Используем makepasswd
Утилита makepasswd может также помочь сгенерировать пароль в Linux. Она также использует /dev/urandom, чтобы создавать случайные пароли. Вы можете установить её с помощью apt:
$ sudo apt install makepasswd
Просто выполните эту команду без параметров чтобы получить случайный пароль:
$ makepasswd 5q6m4jMHJМожете указать количество символов в пароле с помощью опции
chars и можете создать несколько паролей с помощью опции count:
$ makepasswd --chars 4 --count 3
1d65
R5Xe
Lhes
Можно создать пароли и сразу вывести их зашифрованный хеш с помощью опции crypt-md5:
$ makepasswd --chars 4 --count 3 --crypt-md5 DWBN $1$awZ5uNo/$r50RTWsihcMKEVQzoDyoZ1 xLN7 $1$h4ThtOu1$Bsmqhr/Tq/IIdGPtAVGda. A2R2 $1$bss49Rj7$y.9nAbyr749N.eYRUF155.Используем pwgen Утилита
pwgen генерирует легко запоминаемые пароли. Но также можешь генерировать случайные пароли. Устанавливается она также, с помощью apt:
$ sudo apt install pwgen
Если выполнить её без опций, то вы увидите список из легко запоминаемых паролей.
Вы можете указать количество необходимых паролей с помощью опции -N и указать количество символов в пароле с помощью опции -n:
$ pwgen -N 3 -n 5
aeCo2 Le7oy uv6Oh
Существует также опция -s чтобы создавать более сложные пароли (их сложнее запомнить и подобрать):
$ pwgen -N 3 -n 5 -s
fY60V y6FIU 9XEt4
Теперь вы знаете 3 способа генерации случайных паролей в терминале Linux. Если вы работаете за компьютером и вам нужно просто сгенерировать пароль, то удобнее использовать какой-нибудь графический инструмент. А показанные здесь способы можно использовать в скриптах.
🔨 bash_help8 882
Утилита ttyd
Она позволяет запустить выполнение любой утилиты командной строки в браузере.
Примеры использования:
1. Например, может быть удобно, запустить top, htop, или что-то подобное в браузере. В отдельной вкладке браузера вы всегда сможете посмотреть нагруженность вашего сервера.
2. Или можно запустить экземпляр bash и работать в командной строке сервера в браузере. Это может быть удобно, если вы по какой-то причине не можете использовать ssh.
3. И простые команды, которые при выполнении дают какой-то вывод и завершаются, можно запустить с помощью этой утилиты. Это могут быть такие команды как: ls, df, du и тому подобное. При этом, как только вы обновляете страничку, на сервере выполняется данная утилита и результат выводится в браузере.
Данная утилита состоит из одного бинарника, который можно скачать с помощью следующей команды:
$ wget -O ttyd https://github.com/tsl0922/ttyd/releases/download/1.7.3/ttyd.x86_64
Дальше даём приложению право запускаться:
$ chmod u+x ttyd
И запускаем, например bash:
$ ./ttyd bash
После запуска видим порт, на котором запустился bash. И подключаемся по ip-адресу сервера и этому порту с помощью браузера, например: httt://192.168.0.5:7681.
Эта утилита имеет ряд опций, вот некоторые из них:
-p <port> — порт на котором мы запускаем приложение (по умолчанию 7681, можно указать 0 чтобы использовать случайный порт);
-i <interface> — сетевой интерфейс который будет использоваться (например — eth0);
-c <username:password> — логин и пароль, который потребуется указать в браузере (по умолчанию парольная аутентификация выключена);
-m <max-clients> — максимальное количество клиентов;
-o — разрешает подключаться только одному клиенту, при этом как только произойдет дисконнект (например клиент закроет вкладку браузера или перезагрузит её), то web-приложение завершит свою работу;
Приложение позволяет работать через Nginx reverse proxy и использовать TLS сертификаты. Также вы можете сделать Systemd юнит, чтобы запускать эту утилиту как службу.
🐙 Перейти на Github
🔨 bash_help8 882
PowerShell против Bash: в чем разница?
Немного истории: PowerShell
PowerShell - это среда автоматизации и задач Microsoft, удобная для управления конфигурацией. PowerShell использует компоненты, называемые командлетами, которые встроены в PowerShell. Дополнительные функции доступны через модули. Они устанавливаются из галереи PowerShell непосредственно из командной строки.
PowerShell отличается от Bash, потому что он предназначен для взаимодействия со структурами .NET изначально в Windows. Это означает, что он может передавать объекты и данные между сценариями, приложениями и сеансами. Каждый объект имеет свой собственный набор свойств, что делает обработку данных в PowerShell еще более детальной. Данные могут быть указаны как числа (целые числа), слова (строки), логические (истина и ложь) и многие другие типы. Это означает, что вы можете по-настоящему определиться с тем, как ваши скрипты обрабатывают ввод и вывод данных.
Немного истории: Bash
Системы Linux и Unix всегда выигрывали от структурирования многопользовательской терминальной среды. Вы можете запускать дополнительные сессии в той же системе и запускать сценарии и приложения, не влияя на основные сессии, в которые вошли другие пользователи. Это сильно отличалось от ранних систем Windows и DOS, которые были однопользовательскими средами с одной сессией, до появления Windows NT в середине 90-х годов.
Первоначальная оболочка, поставляемая с Unix, была известна как оболочка Bourne, названная в честь ее создателя Стивена Борна. Bash (Bourne again Shell) является преемником оболочки Bourne с открытым исходным кодом. Bash получил широкое распространение, когда Linux был создан в начале 90-х годов.
Существует множество функций, которые делают Bash очень популярным, главными из которых являются стабильность системы и то, что это открытый исходный код. Из-за этого он встречается практически в каждом дистрибутиве Linux. Все эти факторы делают его одной из наиболее часто используемых сред сценариев для ИТ-специалистов.
🖼️ Дочитать статью
🔨 bash_help
8 882
8 882
Лимит открытых файлов — настройки sysclt.conf
В системе Linux каждый открытый файл занимает файловый дескриптор. Информация по занятым файловым дескрипторам и их лимит хранится в файле
/proc/sys/fs/file-nr:
$ cat /proc/sys/fs/file-nr 1120 0 9223372036854775807В выводе мы видим 3 числа: — Количество выделенных файловых дескрипторов (1120). Показывает количество открытых файлов в системе. — Число выделенных, но не используемых файловых дескрипторов (0). Ядро версии выше чем Linux 2.6 всегда показывает 0. Потому что количество выделенных файловых дескрипторов точно соответствует количеству используемых файловых дескрипторов. — Максимальное число файловых дескрипторов (9223372036854775807). Это и есть лимит открытых файлов в системе, который можно изменить с помощью файла sysclt.conf. Для того, чтобы задать лимит, нужно в файле
/etc/sysclt.conf задать параметр fs.file-max и указать ему значение, например:
$ sudo nano /etc/sysctl.conf fs.file-max=1000000Для того, чтобы изменения вступили в силу нужно выполнить команду:
$ sudo sysctl -p fs.file-max = 1000000В выводе мы увидим, какие изменения применяются. И чтобы проверить наши изменения, опять посмотрим на файл
/proc/sys/fs/file-nr:
$ cat /proc/sys/fs/file-nr 1120 0 1000000После проделанного я верну всё как было:
$ sudo nano /etc/sysctl.conf fs.file-max=9223372036854775807
$ sudo sysctl -p fs.file-max = 9223372036854775807Посмотрим какой лимит используется по умолчанию, для этого нужно посмотреть файл /proc/sys/fs/nr_open:
$ cat /proc/sys/fs/nr_open 1048576То есть, любой процесс в системе не сможет открыть более 1048576 файлов. Можем поменять это значение, также используя /etc/sysctl.conf. Параметр в этом случае будет называться fs.nr_open:
$ sudo nano /etc/sysctl.conf fs.nr_open=1024 $ sudo sysctl -p fs.file-max = 9223372036854775807 fs.nr_open = 1024 $ cat /proc/sys/fs/nr_open 1024Чтобы узнать, сколько сейчас открыто файлов у произвольного процесса, выполните ls /proc/<pid>/fd | wc -l:
$ sudo ls /proc/1/fd/ | wc -l 81 $ sudo ls /proc/525/fd/ | wc -l 15А для того, чтобы пробежаться по списку процессов определённого пользователя и узнать сколько файлов эти процессы открыли, можно использовать такой скрипт:
$ nano openfiles-users-procs.sh
#!/bin/bash
user=$1
function work_fun {
ps -u $user | awk '{print $1}' | grep -v PID | while read line
do
echo "Открыто файлов для `ps -p "$line" -o comm | grep -v COMMAND` ("$line") = `sudo ls /proc/$line/fd/ | wc -l`"
done
}
work_fun | sort -rnk 7
Дадим право на исполнение этому скрипту:
$ chmod u+x openfiles-users-procs.shИ выполним:
$ ./openfiles-users-procs.sh alex ls: cannot access '/proc/6952/fd/': No such file or directory ls: cannot access '/proc/6953/fd/': No such file or directory ls: cannot access '/proc/6954/fd/': No such file or directory Открыто файлов для systemd (677) = 29 Открыто файлов для sshd (788) = 11 Открыто файлов для (sd-pam) (678) = 7 Открыто файлов для openfiles-users (6955) = 4 Открыто файлов для openfiles-users (6949) = 4 Открыто файлов для bash (797) = 4 Открыто файлов для sort (6951) = 3 Открыто файлов для openfiles-users (6950) = 3 Открыто файлов для (6954) = 0 Открыто файлов для (6953) = 0 Открыто файлов для (6952) = 0Здесь, в самом начале, вы видите ошибки. Просто процессы 6952, 6953, 6954 существовали, но пока скрипт выполнялся они уже завершились. А просто сложив все эти числа вы узнаете, сколько файлов открыто у определённого пользователя. 🔨 bash_help
8 882
🖥 2 полезных канала для тех, кто увлечён ИБ, разведкой и сетями:
🤖 stein: ИБ, OSINT — канал от известного в узких кругах исследователя, в котором множество обучающих материалов по ИБ и кибер-разведке, полезных инструментов и личный взгляд автора.
👨🔬 Сетевик Джонни // Network Admin — канал сетевого инженера, который рассказывает про создание и настройку внутренних компьютерных сетей в доступной форме.
8 882
Обработка строк циклом «while read line»
В этой статье разберемся с одним из циклов bash, а именно с циклом «while read line». С его помощью будем обрабатывать строки.
Допустим в скрипте есть переменная, значение которой состоит из нескольких строк:
#!/bin/bash a="шишка\nяблоко\nлисток\nгруша" echo -e $aНапомню, что \n это символ новой строки. Выполним этот скрипт и получим такой результат:
$ ./test.sh шишка яблоко листок грушаТеперь изменим этот скрипт, чтобы каждая строка обрабатывалась в цикле:
#!/bin/bash
a="шишка\nяблоко\nлисток\nгруша"
echo -e "$a" | while read line
do
echo "На дереве висит $line"
done
Выполнив этот скрипт получим:
$ ./test.sh На дереве висит шишка На дереве висит яблоко На дереве висит листок На дереве висит грушаПодобный скрипт можно написать и таким способом:
#!/bin/bash
echo -e "шишка\nяблоко\nлисток\nгруша" | while read line
do
echo "На дереве висит $line"
done
Таким образом мы можем делать примерно такое:
"команда, возвращающая строки" | while read line
do
команда которой передаем на обработку каждую строку $line
done
Вот еще один пример bash скрипта:
#!/bin/bash
cat /etc/passwd | cut -f 1 -d ":" | while read line
do
echo "В системе есть пользователь - $line"
done
Запустим это скрипт:
$ ./test.sh В системе есть пользователь - root В системе есть пользователь - daemon В системе есть пользователь - bin **** И так далее ***🔨 bash_help
