Рубрика: Bash

Как разрешить пользователю Linux запускать только определенный набор команд

Проблема: при организации сетевой связности между системами и сетевым элементами сетевики постоянно требуют пинги/трейсы по портам для анализа проблем.

Решение: создать для них учетную запись Linux, которая будет ограничена в правах и функционале — пусть сами всё проверяют.

Исходные данные: Ubuntu 20.04, нужен доступ к ping и traceroute.

В Ubuntu 20.04 утилита rbash уже есть. Но, если в системе её нет, то можно создать её копированием:

cp /bin/bash /bin/rbash

Создание пользователя:

useradd -s /bin/rbash username

Создадим для него домашнюю директорию c поддиректорией utils:

mkdir -p /home/username/utils

Пользователь может запускать только то, что будет найдено в директориях, указанных в переменной окружения PATH, которая прописана в /home/username/.bash_profile

Создадим и отредактируем этот файл:

# cat /home/username/.bash_profile  
# .bash_profile  

# Get the aliases and functions  
if [ -f ~/.bashrc ]; then  
. ~/.bashrc  
fi  
# User specific environment and startup programs  
PATH=$HOME/utils  
export PATH

Теперь, когда пользователь будет пытаться запускать команды — они будут запускаться не из /bin//usr/local/bin/ или /home/usename/bin/, а из /home/username/utils/

Создадим ссылки на утилиты:

ln -s /bin/ping /home/username/utils/
ln -s /usr/sbin/traceroute /home/username/utils/

В директории /home/username/utils/ появились ссылки на утилиты:

> ls -l /home/username/utils/
lrwxrwxrwx 1 root root  9 янв 16 17:19 ping -> /bin/ping
lrwxrwxrwx 1 root root 20 янв 16 17:22 traceroute -> /usr/sbin/traceroute

Проверяем работоспособность:

username@notebook:~$ top
-rbash: /usr/lib/command-not-found: ограниченный режим: в названиях команд нельзя использовать косую черту «/»
username@notebook:~$ ping ya.ru
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=55 time=24.0 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=55 time=24.9 ms
...
username@notebook:~$ traceroute ya.ru
traceroute to ya.ru (87.250.250.242), 30 hops max, 60 byte packets
 1  _gateway (192.168.0.1)  1.360 ms  1.418 ms  1.506 ms
 2  95.55.64.1 (95.55.64.1)  8.333 ms  8.362 ms  8.407 ms
...

Готово!

Для защиты файла от перезаписи (сделать его immutable) и изменения переменной PATH — рекомендуется использовать chattr:

chattr +i /home/username/.bash_profile

Таким образом ни root, ни username не смогут его изменить, пока сам root не сделает этот файл снова изменяемым.

Убирается этот атрибут командой:

chattr -i /home/username/.bash_profile

Посмотреть атрибуты файла можно командой:

> lsattr /home/username/.bash_profile
----i---------e----- /home/localuser/.bash_profile

Подробнее про chattr и его атрибуты читаем тут: https://losst.ru/neizmenyaemye-fajly-v-linux

Вывести содержимое последних логов в один файл (ленивая версия с извращениями, Solaris)

Я всё усложнил, можно было сделать гораздо проще, но такими сложностями заставляешь себя вспоминать многие вещи, которыми нечасто пользуешься.

Сначала получим список последних файлов, исключив директории, и запишем его в файл:

ls -lAtr /tmp | grep "^-" | awk '{print $9}' | tr "\n" " " > /tmp/filenames.txt
tr "\n" " " - позволяет заменить перенос строки на пробел

Редактируем файл filelist.txt в vi, удаляем оттуда имя файла ‘filelist.txt’. Почему руками? А чтобы вспомнить, как пользоваться vi. Напоминалка: 25dd — удалить 25 строк, 500x — удалить 500 символов.

Читаем файл со списком и выводим содержимое файлов с их названием:

 for filename in $(cat /tmp/filelist.txt); do 

echo "==== $filename ===="; 

cat "$filename"; 

done > /tmp/output.txt

В результате получаем сообщение:

«cat: input/output files ‘/tmp/output.txt’ identical»

WTF???

Ага, косяк с том, что в списке файлов присутствует и сам ‘output.txt’, я забыл его удалить с прошлых тестов. Исправляюсь:

В Solaris не работает sed -i, вместо этого использую perl:

perl -pi -e ‘s/output.txt//’ /tmp/filelist.txt

Теперь после повторного выполнения скрипта с циклом for, что был выше, не появятся сообщения.

PROFIT!

 

Реестр приложений с FTP сервера

Задача:

Поиск всех exe-файлов на ftp-сервере, имя не должно содержать знак тильды.
Выводить имя владельца и группы файла, дату модификации, путь и имя файла.

find /usr/ftp/pub/sklad/bin/ -type f -name "*.exe" -exec ls -laE {} \; | grep -v "~" | sed 's@/usr/ftp/pub/sklad/bin/@@' | awk '{print $3","$4","$6","$9}' > /tmp/sklad.txt

В файл /tmp/reestr.txt запишется информация в таком виде: Продолжить чтение «Реестр приложений с FTP сервера»

Освобождение места под бэкапы Solaris 9

Задача: ежедневно по крону проверять свободное место перед созданием бекапов, если места мало — удалять старые бэкапы.
Решил дополнительно перестраховаться, оставлять 1-2 резервных копии.
На конкретном сервере пересчитывание происходит медленно, поэтому «медленное» удаление отслеживается в скрипте.
Продолжить чтение «Освобождение места под бэкапы Solaris 9»

Переименовать несколько файлов на bash. Rename multiple files using bash.

Наскачивал тут на вечерок простеньких cheat sheets по linux, docker, vi и прочим полезным вещам ( вот отсюда www.cheatography.com ).

В заголовках файлов присутствует имя автора, что нафик не надо, когда ищешь глазами файл по awk, а там tme520_awk-english.pdf

Продолжить чтение «Переименовать несколько файлов на bash. Rename multiple files using bash.»