Сокрытие процессов других пользователей в Linux

В Linux, все пользователи видят не только свои процессы (приложения, демоны), но и процессы других пользователей, в том числе и привилегированных (root-овые).

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

то вы увидите все процессы системы, включая свои.

По сути, мы видим все процессы, которые видны и доступны для чтения, в каталоге /proc.

В более ранних версиях Linux (до версии ядра 3.2), нам приходилось писать патч для ядра (для каждой версии ядра — свой патч): restricted_proc, и пересобирать ядро.

К счастью, начиная с версии Linux 3.2, появилась опция hidepid, которую можно использовать при монтировании раздела /proc.

hidepid может принимать три значения:

  • hidepid=0 — любой пользователь может читать все файлы в /proc/PID/* (значение по умолчанию).
  • hidepid=1 — пользователи имеют доступ только к своим собственным директориям в /proc/. Важные файлы, такие как cmdline, sched*, не защищены от других пользователей.
  • hidepid=2 — это значит hidepid=1 плюс все файлы в /proc/PID/ невидимы для других пользователей. Это усложняет возможность проникновения в систему или сбор информации о запущенных процессах — работают ли какие-то демоны с повышенными привилегиями, запустил ли другой пользователь важную программу и так далее.

Таким образом, мы перестанем видеть процессы других пользователей, если перемонтируем /proc с параметром hidepid, например так:

Ну и конечно, не забудем прописать это в /etc/fstab, чтобы при перезапуске системы раздел /proc монтировался верно:

А если каким-то программам всё-таки нужно иметь возможность видеть все процессы системы (например Zabbix), то мы можем указать группу, для которой будет доступен просмотр всех процессов, например так:

 

 

 

 

 

ssh-agent: не вводите пароли дважды

Для того, чтобы каждый раз не вводить пароль к своим ключам (RSA, DSA), был придуман ssh-agent.

Идея в следующем: вы запускаете ssh-agent, и добавляете в своё окружение (env) переменную, указывающую на имя сокета агента:

Далее, вы единожды, должны ввести пароли от своих ключей, которые будут сохранены ssh-agent-ом. Делается это так:

А для того, чтобы не запускать в каждой сессии отдельный ssh-agent, можно воспользоваться следующим простеньким скриптом:

Добавьте в свой .bashrc этот скрипт для автоматизации выше описанного процесса 🙂

Подсветка синтаксиса для more и less

Очень часто, мы пользуемся любимым grep или даже ack (нужное подчеркнуть), но когда в выводе результата строк слишком много, мы по привычке натравливаем на них more или less, например:

ну и остаемся без любимой подсветки синтаксиса 🙁

Проблема кроется в так называемых pipe (вертикальный слеш).  Дело в том, что правильно написанный софт автоматически выключает подсветку синтаксиса, видя, что данные предназначаются для pipe, поэтому, и решение, как ни странно, очень простое. Мы просто должны форсировать вывод команд в цвете, например:

А в случае, если вы любите less, то не забывайте указывать флаг -R, например:

А для моего любимого ack, достаточно просто добавить флаг —color, например:

Ну а для тех, кто не хочет каждый раз что-то дописывать, напоминаю, что в bash есть замечательные alias-ы. Просто добавьте в ваш конфиг bash строки вида:

 

VIM для программиста

Работа с текстом:

* — выделить все такие же слова и перейти к следующему совпадению
# — выделить все такие же слова и перейти к предыдущему совпадению

^ — перейти на начало строки
$ — перейти на конец строки

~ — изменить регистр буквы под курсором

% — перейти на парную скобку

 

viw — выделить слово под курсором
viW — выделить слово под курсором включая спец символы (до пробела)
vip — выделить параграф
vi( — выделить все внутри ближайших скобок (можно указать и ковычки)
viw~ — Меняем регистр слова (инверсия регистра)
viwU — Меняем регистр слова (UPPER — все буквы большие)

diw — удалить слово под курсором и остаться в командном режиме
diW — удалить слово под курсором и остаться в командном режиме включая спец символы (до пробела)
ciw — удалить слово под курсором и перейти в режим вставки (можно сразу писать новое слово)
ci" — удалить содержимое внутри кавычек и прейти в режим вставки
ci( — удалить содержимое внутри скобок и перейти в режим вставки

Y — скопировать всю текущую строку
y — скопировать выделенное (найденное)

dd — удалить строку
x — удалить символ или всё выделение
D — удалить строку с текущей позиции
C — удалить строку с текущей позиции и перейти в режим вставки
S — удалить всю строку и перейти в режим вставки

 

CTRLo — вернуться на прежнюю позицию (последнее место правки или поиска)
Навигация:
w — перейти на начало следующего слова (разделители только пробел и табы)
e — перейти на конец слова (конец текущего слова или конец следующего слова)
(без shift-а разделителями слов будет являться и символ тире).

:s//НОВОЕ_СЛОВО/gi/ — заменить всё выделенное на НОВОЕ_СЛОВО

 

V — выделить всю строку

3dw — удалить три слова

ma — создаем метку «a»
`a — переходим на метку «a»

CTRLv — вертикальное выделение
I#ESCESC — комментирования блока кода

. — повторить предыдущую команду (очень сильный инструмент, попробуйте)

Пишем биллинг. Как вычислять периоды услуг.

Когда работаете с датами, не забывайте страдать 😉

Есть услуга, которая стоит 300 рублей и продавец говорит, что услуга предоставляется на 1 месяц. Что такое месяц?

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

Раньше, я считал, что если услуга заказана на 1 месяц, то можно просто прибавить единичку к месяцу. Но как быть с ситуацией, когда клиент заказал услугу 31 января, ведь 31 февраля не существует! Тут то и начинается всё веселье.

Лично мне не нравится схема, когда за месяц принимается какое-то фиксированное число дней. Я считаю такой подход не честным по отношению к клиенту. В году 365 дней, а иногда, даже 366 🙂 На 30 дней эти числа никак не делятся. Тогда как можно оказать услугу на год?

Должен быть какой-то правильный, честный и универсальный способ подсчета периодов действия услуг.

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

В этом месте читающий скажет: «Да в чем проблема считать даты исходя из кол-ва дней конкретных месяцев?» И я так сказал, но опять не обходиться без страданий (не забываем страдать).

Давайте попробуем вычислить дату окончания услуги, заказанную 2017-01-01 и оплаченную на 1 месяц:

Получили: 2017-01-31 23:59:59 (здесь всё хорошо).

Но теперь представим ситуацию, что клиент заказал услугу в 2017-01-02, как теперь вычислить дату окончания?

Нам кажется, что услуга должна кончиться: 2017-02-01 23:59:59, но правильный ответ: 2017-02-01 21:40:37 (всё из-за того, что в феврале всего 28 дней, и стоимость одного дня в феврале выше, чем в январе).

И тут нам кажется, что мы молодцы, мы написали правильную формулу и можно идти пить пиво…. но….

Предположим, что клиент заказывает услугу не на 1 месяц, а на 1 месяц и 1 день! Казалось бы ерунда, мы к этому готовы, и мы же готовы объявить клиенту стоимость такого периода? Мы же знаем, что услуга стоит 300 рублей в месяц, так давайте скажем, стоимость услуги на 1 день больше? Да, легко? Нам же никто не мешает узнать кол-во дней в месяце этого злосчастного одного дня? Да, можем… идём пить пиво…

Блииин, а если клиент оплатит услугу не сразу, если клиент положит услугу в корзину? А если, пока клиент будет оплачивать, наступит следующий месяц? А мы же уже посчитали стоимость услуги и сказали её клиенту?! Блин…. не забывайте страдать….

Работаем с сетями IPv4. Алгебра-логики. Вычисления.

IP адреса, несмотря на свою простоту, до сих пор являются сложнопонимаемыми для многих разработчиков.

Цель данной статьи показать, как можно вычислять все необходимые значения сети.

Итак:

Мы привыкли видеть IP адреса в виде: AAA.BBB.CCC.DDD, например: 192.168.100.15

Для манипуляций с IP адресами нам необходимо сначала перевести их в бинарный вид.

В языке Си преобразование IP адресов в бинарный вид и обратно делается с помощью ф-ий:

aton — Addres to numeric ( адрес в число )

ntoa — Numeric to address ( число в адрес )

p.s. «Адрес» это форма записи IP, который мы привыкли видеть (например: 192.168.100.15).

В PHP такими функциями служат: ip2long и long2ip

В JS можно использовать следующие функции:

В Perl:

Теперь, когда мы перевели IP и его Маску в числовое значение, то мы можем всё вычислить:

 

Битовая маска

Битовая маска — это короткая запись Маски сети. Например, маску: 255.255.255.0 коротко можно записать как 24.

На самом деле, 24 означает кол-во единиц в двоичной системе счисления, соответствующей числу: 255.255.255.0.

Пример:

Маска: 255.255.255.0 это: 11111111.11111111.11111111.00000000 в двоичной системе счисления, т.е. 24 единицы )

В JS можно получить Битовую маску с помощью следующей ф-ии:

Надеюсь все в состоянии переписать эту ф-ию и для Perl? )

Привет, мир!

Да, это моя первая запись. Как и подобает программисту, первое что он пишет, это:
"Hello World".

Так что, я оставил именно такой заголовок)
p.s. если кому-то интересно почитать обо мне, то для этого я создал отдельную страничку)


%d такие блоггеры, как: