Привет, дело было вечером, делать было нечего. Начнем это утро с мнемоники прав доступа. Оно нам сегодня вечером пригодится. Возможно будет сумбурно, но постараюсь разжевать. А вечером будем заниматься хитрой стеганографией на bash, как раз с помощью прав доступа.



Для стандартных трех троек прав доступа справедливо следующее:



 4    2    1     # восьмеричная система  

r-- -w- --x # символьное представление

100 010 001 # двоичная система




Сразу обрати внимание на разряды с единицей (1) в двоичной системе счисления. Они соответствуют позициям прав доступа в символьном представлении из вывода команды ls -l.



Наглядная табличка соответствий:



- 0: 000 / —

- 1: 001 / –x

- 2: 010 / -w-

- 3: 011 / -wx

- 4: 100 / r–

- 5: 101 / r-x

- 6: 110 / rw-

- 7: 111 / rwx



Если требуется определенный набор прав, то складываем 4, 2, 1. Первая строка это, права, которые получаются при сложении.



 3     5     6     7  

1+2 1+4 2+4 1+2+4

-wx r-x rw- rwx

011 101 110 111



Если на пальцах, у нас есть 3 базовых цифры 1, 2, 4 которые означают такое:



4 = r

2 = w

1 = x




Берем эти цифры, складываем как угодно и получаем например 7, что равно 1+2+4 = rwx (читаем, пишем, исполняем).



Ладно, большинству из вас оно нахрен не вперлось, но я продолжу. У меня коллега например всегда всем ставит 777 даже не задумываясь. Мол всё работает и никогда нет проблем с доступом к файлам и папкам. Ну ок, возможно однажды встретит своего черношляпа и пересмотрит свои практики. Работает кстати в крупном банке. Только представь какой 3.14здец на серверах у него творится где наши денюжки лежат.



Давай по теме. Создаем массив:



arr=({0..1}{0..1}{0..1})




Получаем права в двоичной системе счисления:



echo ${arr[1]}  

echo ${arr[2]}

echo ${arr[3]}

echo ${arr[4]}

echo ${arr[5]}

echo ${arr[6]}

echo ${arr[7]}




На экран выведется:



000

001

010

011

100

101

110




В bash при указании индекса массива можно применять арифметические операции. Давай воспользуемся и наглядно посмотрим как суммируются права доступа.



echo ${arr[1+2]}  

echo ${arr[1+4]}

echo ${arr[2+4]}

echo ${arr[1+2+4]}




Получаем:



010

100

101

110




То есть когда мы делали arr[1] у нас было 000, а когда применили сложение arr[1+2], 000+001 = 011.



В общем математика и кишочки. Голову сильно не забивай, в повседневных задачах достаточно восьмеричной и символичной системы счислений. Из полезного: теперь ты знаешь как создавать массивы и складывать их.



Ну и на закуску команда, которая выведет права в восьмеричной системе:



stat -c'%a %n' /tmp/*




Получим такое:



700 snap-private-tmp

700 ssh-XXXXXX5Fyxmr

700 ssh-XXXXXXENecCm

700 ssh-XXXXXXkPO9QF

700 systemd-logind.tkfPcb

700 systemd-r1KRzA

777 test.txt




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



Короче базу рассмотрели, если ничо не понял, забей. Это как Джаз, чтобы от него блевать не хотелось, нужно стать старым пердуном. Но мы же с вами еще так молоды!



Увидимся вечером. Хорошего понедельника!



tags: #linux #bash



💩 @bashdays