Автор Тема: Приёмы профессиональной работы в shell (справочник - вопросы не задавать. )  (Прочитано 174929 раз)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Дата установки операционной системы

# tune2fs -l $(mount|grep ' / '|cut -f 1 -d ' ')|grep create

Производное от
# tune2fs -l /dev/sdaX|grep create

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Замена открытого пароля на хэш в конфиге wifi-соединения NetworkManager

Используемый файл пакета
# rpm -qf /usr/bin/wpa_passphrase
wpa_supplicant-2.1-alt0.M70P.1

Сгенерировать хэш
# wpa_passphrase ssid password
network={
ssid="ssid"
#psk="password"
psk=44116ea881531996d8a23af58b376d70f196057429c258f529577a26e727ec1b
}
ssid - имя точки доступа
password - пароль точки доступа

После настройки wifi-соединения, в файле
/etc/NetworkManager/system-connections/Ваше\ соединение\ Wi-Fi

в строке
psk=пароль

которая находится в секции
[802-11-wireless-security]

замените пароль на хэш и сохраните изменения.
Перезапустите сервис NetworkManager
# /etc/init.d/NetworkManager restart
В системах с systemd см. докуметацию по рестартам сервисов.

Если соединение в аплете NM будет разорвано и авторестарт соединения выполнен не будет, выполните подключение к точке доступа через аплет, выбрав соединение.

Логика замены пароля на хэш:
Если ключ состоит из 64-символов, он должен содержать только шестнадцатеричные символы и интерпретируется как шестнадцатеричный ключ WPA. В противном случае, ключ должен быть в пределах от 8 до 63 символов ASCII (как указано в стандарте 802.11i) и интерпретируется как ключевая фраза WPA.
(См. ссылку на NetworkManager.SettingWirelessSecurity, секция Properties )

Обильно прокомментированный обзорный материал по созданию шифрованых wifi-соединений:
http://www.opennet.ru/base/net/wifi_setup.txt.html
Ubuntu/Debian, но принцип тот же.

Временами весьма полезно
NetworkManager.SettingWirelessSecurity:
https://lazka.github.io/pgi-docs/NetworkManager-1.0/classes/SettingWirelessSecurity.html
« Последнее редактирование: 06.03.2015 09:03:25 от Speccyfighter »

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 144
    • Email
Замена открытого пароля на хэш в конфиге wifi-соединения NetworkManager
Плохо, что всё равно можно зайти и посмотреть этот самый хэш... скопировать и вставить вместо пароля и получить доступ к точке.
Я тут на Win8.1 попробовал подсмотреть пароль и не получилось сходу, то есть пароль в явном виде не показывается. Может плохо искал...
В Linux можно с легкостью узнать пароль, это всплывающее сообщение, когда обрывы связи... или вот в файле нужном всё есть... да и просто в настройки сетевых соединений...
Поэтому я по MAC создал белый список устройств. Крайне неудобно при подключении новых устройств, но что делать...
Сноси Винду, переходи на Линукс ! :)

Оффлайн Andrey

  • Завсегдатай
  • *
  • Сообщений: 734
Дата установки операционной системы

# tune2fs -l $(mount|grep ' / '|cut -f 1 -d ' ')|grep create

Производное от
# tune2fs -l /dev/sdaX|grep create
В общем случае покажет то что надо. У меня ОС сменила уже 3 компьютера, поэтому таким способом я не узнаю, когда производилась установка.
В /root  по дате создания файлов нашел информацию.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Самая мощная защита у того пароля,
который не сохранён

XTerm: будни шелл

Несмотря на свой кажущийся аскетизм, xterm обладает довольно широкими возможностями.
Но обманчивый невзрачный внешний вид, портит впечатление, - нам в нём работать:
- цвет фона (белый фон, чёрные чернила) и малый размер шрифтов.

Вот это и поправим. Тем более что в некоторых псевдографических программах портится цветоотображение (например htop).
В исходном виде файл $HOME/.Xdefaults выглядит так:
$ cat .Xdefaults
XTerm*VT100*font: -misc-fixed-medium-r-normal--13-*-*-*-*-*-koi8-r
XTerm*VT100*boldFont: -misc-fixed-medium-r-normal--13-*-*-*-*-*-koi8-r

UXTerm*VT100*font: -misc-fixed-medium-r-normal--13-*-*-*-*-*-iso10646-1
UXTerm*VT100*boldFont: -misc-fixed-medium-r-normal--13-*-*-*-*-*-iso10646-1

Добавим к конфигу реверс цветов и изменим шрифт, приведя конфиг к виду, и перелогинимся в Х-сессию:
$ cat .Xdefaults
XTerm*VT100*font: -misc-fixed-medium-r-normal--13-*-*-*-*-*-koi8-r
XTerm*VT100*boldFont: -misc-fixed-medium-r-normal--13-*-*-*-*-*-koi8-r

UXTerm*VT100*font: -misc-fixed-medium-r-normal--13-*-*-*-*-*-iso10646-1
UXTerm*VT100*boldFont: -misc-fixed-medium-r-normal--13-*-*-*-*-*-iso10646-1

XTerm*reverseVideo: true
xterm*faceName: Fixed:size=11:antialias=false
Терминал обрёл более приятный вид.

В нём можно выполнить множество полезных команд, - например эту недавно подсказанную полезную команду, дополнительно снабдив команды целями, например в виде каталогов (см. man lftp):
lftp https://webdav.yandex.ru -u пользователь,пароль
Далее команды:
put <имя файла> — отправить файл в облако
get <имя файла> — загрузить файл из облака
quit — выход


С глаз людских: полезняшки XTerm

Но эта весьма полезная команда может принести массу неприятностей.

Сокращения в тексте:
ЛКМ - Левая Кнопка Мыши (Тачпада)
ПКМ - Правая Кнопка Мыши (Тачпада)
СКМ - Средняя Кнопка Мыши (Тачпад - две одновременно нажатых клавиши)

Опасность первая:
Всё хорошо при наборе этой команды будет идти до тех пор, пока вы не дойдёте до ввода логин/пароль и кто-то в этот момент не станет у вас за спиной. Если вы этого не заметите, считайте что аккаунт вы уже потеряли.

Приём первый: начиная с момента набора логин-пароль, спрячте часть окна с набираемой частью команды, под панелью или вынесите за пределы рабочего стола.
В общении же, можно столкнуться с различной степенью своеволия, и XTerm поможет пресечь это:

Когда дело дойдёт до набора логин-пароль в команде, остановитесь, нажмите Alt+ЛКМ и перетащив окно xterm, спрячьте строку за пределами рабочего стола. Удерживая курсор в поле xterm, нажмите Ctrl+ЛКМ и в появившемся меню выберите опцию Secure Keyboard. Цвета фона-чернил реверсируются. После этого, даже если наглец завладеет мышкой, не деактивировав опцию меню, он не сможет вытащить окно XTerm на рабочий стол.
Теперь ввод строки можно довершить быстрым слепым набором логин-пароль и нажать Enter выполнив команду.

Теперь нам нужно уничтожить в терминале строку команды содержащую логин-пароль в открытом виде, чтобы преднамеренно или случайно эта команда не была обнаружена в окне терминала XTerm. Секрет этого действия в том, что в XTerm очистка с блокировкой происходит совсем по другому принципу нежели команда clear после которой окно всё равно можно проскроллировать обнаружив логин-пароль.

XTerm пресечёт и эту возможность для безмерно любопытных.
Не снимая активацию с Secure Keyboard, нажмите Ctrl+СКМ, и в появившемся меню не отпуская клавиши, выберите опцию Reset and Clear Saved Lines. Всё что имеется в поле XTerm будет очищено, позиция курсора сместится в левый верхний угол окна терминала xterm, и скроллинг  (чтобы подсмотреть логин-пароль) будет уже сделать невозможно.
Нажмите Enter, - прежнее последнее приглашение появится в терминале xterm и вы можете продолжить работу, теперь уже не опасаясь, что логин-пароль вашего аккаунта, предстанут пред глаз людских, - после таких действий, увидеть их в терминале xterm уже невозможно.

Нажатием Ctrl+ЛКМ вызовите меню xterm и деактивируйте опцию Secure Keyboard. Теперь с помощью клавиш Alt+ЛКМ перетащите окно в поле рабочего стола и спокойно продолжайте работать.

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


Безопасность в shell: там на неведомых дорожках...

Собственно средств (наиболее удобных), чтобы логин-пароль не попали в .bash_history, несколько, и различаются они степенью "грохота" и комфорта.
Их стоит рассмотреть отдельно каждое.

Инструменты команд

Команда выполненная непосредственно перед командой exit, очистит историю команд текущей терминальной сессии:
$ history -c

Эта команда убивает шелл-оболочку сразу без возможности сохранить историю команд сессии (не влияет на фоновые задания, - см. bg, fg, jobs и т.д.):
$ kill -9 $$


Инструментальные средства конфигурационных файлов:
$ cat $HOME/.bashrc
# .bashrc

# User specific aliases and functions

# Source global definitions
if [ -r /etc/bashrc ]; then
. /etc/bashrc
fi

# Add all commands
#
shopt -s histappend
PROMPT_COMMAND='history -a'

#HISTIGNORE='ll*:ls*:less*'
export HISTIGNORE='lftp*'
export HISTCONTROL='ignorespace:ignoredups:erasedups'

HISTIGNORE='lftp*'
- Игнорирует сохранение в историю всех команд которые начинаются с lftp
HISTCONTROL='ignorespace:ignoredups:erasedups'
erasedups - удалять дубликаты команд из истории терминальной сессии
ignoredups - игнорировать дубликаты команд в истории терминальной сессии
ignorespace - не сохранять в историю команд, команды начинающиеся с пробела

Любой из этих нехитрых вариантов поможет избежать ситуации при которой логин-пароль могут наследить в истории команд.


Полезное:
https://www.opennet.ru/base/sys/bash_tips.txt.html
« Последнее редактирование: 24.10.2016 03:40:01 от Speccyfighter »

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 144
    • Email
erasedups - удалять дубликаты команд из истории терминальной сессии
Очень познавательно, спасибо!

А для очистки текущих дубликатов есть какая-н. команда ?
Просто в history накопилось много одинаковых команд, неплохо бы от них избавиться...
Можно скрипт конечно придумать... но вдруг что-то готовое есть.
Ну раз уж тема зашла, интересно стало :-)
Сноси Винду, переходи на Линукс ! :)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
erasedups - удалять дубликаты команд из истории терминальной сессии
Очень познавательно, спасибо!

А для очистки текущих дубликатов есть какая-н. команда ?
Просто в history накопилось много одинаковых команд, неплохо бы от них избавиться... :-)

Удаление дубликатов строк с сортировкой
$ wc -l $HOME/.bash_history_nonsort
1637 /home/user/.bash_history_nonsort
$ sort -u .bash_history_nonsort > .bash_history
$ wc -l $HOME/.bash_history
952 /home/user/.bash_history
Не писать в тот же файл из которого читается.

Удаление дубликатов строк без сортировки
$ wc -l $HOME/.bash_history_nonsort
1637 /home/user/.bash_history_nonsort
$ awk '!x[$0]++' .bash_history_nonsort > .bash_history
$ wc -l $HOME/.bash_history
952 /home/user/.bash_history

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Корректное размонтирование самба-ресурсов на разгрузке или останове системы sysv

Суть проблемы:
При смонтированных ресурсах самба из shell или fstab, с NetworkManager, на выключении и перезагрузке наблюдается минутная задержка.

Причина:
Смонтированный самба-ресурс отмонтируется после того, как сетевой интефейс получает Disconnecting

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


Создаём сервис который будет выполняться в необходимой очерёдности отмонтируя самба-ресурсы до того как сетевой интерфейс сложится

Права и имя файла сервиса
# ll /etc/rc.d/init.d/smb_umnt
-rwxr-xr-x 1 root root 531 апр 27 23:05 /etc/rc.d/init.d/smb_umnt

Созданные симлинки после поднятия сервиса smb_umnt
# ll $(find /etc/ -name *smb_umnt)
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc3.d/S92smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc4.d/S92smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc5.d/S92smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc6.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc0.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc1.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 27 23:33 /etc/rc.d/rc2.d/K34smb_umnt -> ../init.d/smb_umnt
-rwxr-xr-x 1 root root 531 апр 27 23:05 /etc/rc.d/init.d/smb_umnt

командами с проверкой
# chkconfig --list smb_umnt
сервис smb_umnt поддерживает chkconfig, но не используется ни на одном уровне выполнения (запустите 'chkconfig --add smb_umnt')
# chkconfig --add smb_umnt
# ll $(find /etc/ -name *smb_umnt*)
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc6.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc0.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc1.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc2.d/K34smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc3.d/S92smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc4.d/S92smb_umnt -> ../init.d/smb_umnt
lrwxrwxrwx 1 root root  18 апр 28 00:14 /etc/rc.d/rc5.d/S92smb_umnt -> ../init.d/smb_umnt
-rwxr-xr-x 1 root root 531 апр 27 23:05 /etc/rc.d/init.d/smb_umnt
# chkconfig --list smb_umnt
smb_umnt        0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл

Листинг файла сервиса
# cat /etc/rc.d/init.d/smb_umnt
#!/bin/bash
#
# chkconfig: 345 92 34
# description:  umount all cifs on shutdown system

# creating symbolic links kill:
# chkconfig --level 0126 smb_umnt off


# Source function library.
. /etc/rc.d/init.d/functions

lock_file=/var/lock/subsys/smb_umnt


start() {
    touch "$lock_file"
    echo
}

stop() {
    # Umount all cifs
    rm -f "$lock_file"
    umount -a -t cifs
    echo
}



case "$1" in
    start)
start
;;
    stop)
stop
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        exit 1
esac
exit 0
На старте сервиса создаётся lock-файл.
На останове сервиса, lock-файл удаляется, а cifs-ресурсы размонтируются.

Чтобы сервис мог отработать не только на старте, но и на разгрузке системы, необходим lock-файл с именем сервиса:
# ll /var/lock/subsys/|grep smb_umnt
-rw-r--r--  1 root root    0 апр 27 23:22 smb_umnt

При наличии файла lock_file, позволяет системе определить, что сервис запущен и при разгрузке системы выполнить скрипт с параметром stop.
Если не содавать файл lock, выполняется только старт сервиса.
Если не удалять файл lock, выполняется только стоп сервиса.

Необходимое условие: на разгрузке системы сервис должен отрабатываться раньше, чем сложится сетевой интерфейс:
# grep -rH chk /etc/init.d/ |grep 'Netw\|Mode\|netw\|smb_umnt\|\/dm'
/etc/init.d/smb_umnt:# chkconfig: 345 92 34
/etc/init.d/NetworkManager:# chkconfig: - 12 90
/etc/init.d/network:# chkconfig: 345 10 90
/etc/init.d/dm:# chkconfig: 5 45 05
/etc/init.d/ModemManager:# chkconfig: - 11 91
chkconfig: 345 92 34
345 - уровни выполнения start
92 - очередь выполнения start
34 - очередь выполнения stop

Счёт очерёдности start/stop на старте и разгрузке системы ведётся по принципу стека:
- Последним вошёл - первым вышел.
Т.е.:
* Начало счёта для start, это начало инициализации.
* Начало счёта для stop, это начало разгрузки системы.

Это значит, что сервис dm на старте системы будет выполняться 45-тым по очереди, - одним из последних. Но на разгрузке системы, он будет выполняться одним из первых, - т.е. 05-тым (см. вывод выше).


Дополнительные полезные ссылки с описанием заголовка в LSB стандарте:
Как создать свою службу в Linux
LSBInitScripts
How to start a SysV init script after network starts in Red Hat Enterprise Linux 7

Linux Standard Base Core Specification, Generic Part
22.3. Comment Conventions for Init Scripts
22.6. Facility Names
« Последнее редактирование: 21.10.2017 12:38:25 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Сокрытие логина пользователя и имени хоста из панели окна X-терминала и из терминала.

Чтобы получить результат, достаточно добавить строки в файл ~/.bashrc:
$ sed -n '9,16p' ~/.bashrc

# Hidden login & hostname
case "$TERM" in
    *xterm*|*rxvt*|*Eterm*)
PROMPT_COMMAND='echo -ne "\033]0;shell terminal\007"'
;;
esac
PS1="[\d  \W]\$ "

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Инициализация UNIX System V init: выключение по кнопке Power

Для реализации функции, необходим последний найденный пакет в списке
# apt-cache search power|grep -i ^acpi
acpid - ACPI kernel daemon and control utility
acpi_call - scripts for disabling discrete GPU on some laptops
acpid-events-power - Power event config
т.е. пакет acpid-events-power

который содержит единственный файл - конфигурационный файл
# rpm -ql acpid-events-power
/etc/acpi/events/power

и этот файл имеет содержимое
# cat /etc/acpi/events/power
event=button/power
action=/sbin/poweroff

acpid должен быть запущен
# chkconfig --list acpid
acpid          0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
# /etc/init.d/acpid status
acpid is running

Рекомендация базируется на
# rpm -qf /sbin/init
sysvinit-2.88-alt4
Для управления сервисами systemd см. соответствующую документацию.

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

Нелишним будет проверить, что строка в конфиге не раскомментирована
# cat /etc/sysconfig/halt
# Uncomment the following line if by default the system
# needs to be halted instead of powered off.
#HALTCMD=/sbin/halt
иначе вместо poweroff будет halt, - т.е. останов системы.

Суть всего этого объясняет страница man для acpid:
# man acpid|col -bfx|sed -n '128,142p'
EXAMPLE
       This example will shut down your system if you press the power button.

       Create a file named /etc/acpi/events/power that contains the following:

              event=button/power
              action=/etc/acpi/power.sh "%e"

       Then create a file named /etc/acpi/power.sh that contains the following:

              /sbin/shutdown -h now "Power button pressed"

       Now, when acpid is running, a press of the power button will cause  the  rule
       in  /etc/acpi/events/power  to trigger the script in /etc/acpi/power.sh.  The
       script will then shut down the system.

Дополнительно для чтения:
https://wiki.archlinux.org/index.php/Acpid

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Распределение прав доступа на файлы и каталоги в Линукс

Преамбула
читаем свежую ветку спора по поводу security в w8 :
Цитата: vladdt
Цитата: Nick Gorbunov
Цитата: vladdt
Цитата: Nick Gorbunov
у меня дома вин8 еще держится Но домашние чуть не поколотили за установку этой поделки вместо вин7. :) Чтобы открыть что-нибудь на внешнем диске надо у КАЖДОГО файла поменять права доступа. А если их несколько тысяч?! Поменять права на каталог так, чтобы и подкаталоги сменили права - ну никак не получается... Грязно ругается, что не может открыть какой-то контейнер. А вот поштучно, пожалуйста, все меняется...
О хосспади! Открываешь свойства всего фолдера, идешь в секьюрити, адвансед, в оунер, и прежде всего - меняешь оунершип на всех вложеных обьектах и субконтейнерах. После чего - меняешь права на стандартные, наследуемые. Или тупо фулл контрол юзерам этого компа. Если на попытке смены оунершипа будет ругаться - то либо ты не админ на этом компе, либо срочно чекдиском проверять внешний хард, либо эксплорер убит каким-то дерьмом, который юзеры обожают ставить на свой комп.

Это НЕ 8-ки вина! Это вина того кто эти файлы клепал с нестандартными правами! Я начинаю уважать Эппл за то что считают своих юзеров - баранами. И просто не дают без консоли лезть в то в чем не шаришь. Хотя у меня сильное подозрение, что наши и макОС запросто сломают.
>>Или тупо фулл контрол юзерам этого компа.

да-да, именно для этого микрософт разрабатывал навороченную систему безопасности. :)
А при чем здесь вообще безопасность? Это называется - права на доступ. Или кто-то свои личные фотки таки способом пытается "обезопасить"? Если кто-то умный создавал юзера Вася, и давал доступ к файлам только ему, а потом снес старую ОС и начисто поставил новую - то вместо Васи, в правах он увидит длинную фигню, старый SID. Потому что сгенерированный системой Вася - это уже совсем другой Вася. Вот это как раз к вопросу о безопасности.

Обратите внимание на win-нюанс:
"Потому что сгенерированный системой Вася - это уже совсем другой Вася"
Резюме:
Не нужно создавать себе трудности, а затем их героически преодолевать.


Допустим на винчестере при переинсталляции системы (а надо?) у вас есть туча файлов которые принадлежат пользователю, которого нет в системе, но они лежат в каталоге с абстрактным именем в абстрактном месте, представьте что их тысячи:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13  2009 Documents
drwx------ 2 503 503 48 Янв 13  2009 tmp

У вас имеется ровно два варианта, чтобы избежать виндовых трудностей:
$ man useradd
$ man usermod

Вариант второй: моделируем ситуацию с уже созданным пользователем, которого предварительно и создаём
# useradd -m -k /etc/skel -d /home/tt tester
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 24 21:41 .
drwxr-xr-x 7 root   root   4096 Янв 24 21:41 ..
-rw------- 1 tester tester   24 Янв 24 21:41 .bash_logout
-rw------- 1 tester tester  182 Янв 24 21:41 .bash_profile
-rw------- 1 tester tester  124 Янв 24 21:41 .bashrc
drwx------ 2 tester tester 4096 Янв 24 21:41 .cache
drwx------ 2 tester tester 4096 Янв 24 21:41 .config
drwx------ 3 tester tester 4096 Янв 24 21:41 .kde4
drwx------ 3 tester tester 4096 Янв 24 21:41 .local
-rw------- 1 tester tester   17 Янв 24 21:41 .lpoptions
drwx------ 3 tester tester 4096 Янв 24 21:41 .mutt
-rw------- 1 tester tester  120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester tester 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester tester  240 Янв 24 21:41 .xprofile
drwx------ 2 tester tester 4096 Янв 24 21:41 .xsession.d
По-умолчанию, вновь регистрируемый в системе пользователь будет иметь на единицу больший ID, чем у последнего зарегистрированного.

Следующие три команды показывают что где произошло в системе
# id tester
uid=502(tester) gid=502(tester) groups=502(tester)
# getent passwd tester # эта команда просматривает файл /etc/passwd
tester:x:502:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:502:

Поскольку этот пользователь с uid/gid=502 бывший владелец файлов (с uid/gid=503), намного логичнее сменить uid/gid пользователя, чем менять права у сотен тысяч файлов.
Что и сделаем:
# usermod -u 503 tester
# id tester
uid=503(tester) gid=502(tester) groups=502(tester)
# getent passwd tester
tester:x:503:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:502:

# groupmod -g 503 tester
# id tester
uid=503(tester) gid=502 groups=502
# getent passwd tester
tester:x:503:502::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:

# usermod -g 503 tester
# id tester
uid=503(tester) gid=503(tester) groups=503(tester)
# getent passwd tester
tester:x:503:503::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:

Но в этом случае права на файлы домашнего каталога
# ls -la /home/tt
total 60
drwx-----x 9 tester  502 4096 Янв 24 21:41 .
drwxr-xr-x 7 root   root 4096 Янв 24 21:41 ..
-rw------- 1 tester  502   24 Янв 24 21:41 .bash_logout
-rw------- 1 tester  502  182 Янв 24 21:41 .bash_profile
-rw------- 1 tester  502  124 Янв 24 21:41 .bashrc
drwx------ 2 tester  502 4096 Янв 24 21:41 .cache
drwx------ 2 tester  502 4096 Янв 24 21:41 .config
drwx------ 3 tester  502 4096 Янв 24 21:41 .kde4
drwx------ 3 tester  502 4096 Янв 24 21:41 .local
-rw------- 1 tester  502   17 Янв 24 21:41 .lpoptions
drwx------ 3 tester  502 4096 Янв 24 21:41 .mutt
-rw------- 1 tester  502  120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester  502 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester  502  240 Янв 24 21:41 .xprofile
drwx------ 2 tester  502 4096 Янв 24 21:41 .xsession.d
# ls -l /home/|grep tt
drwx-----x   9 tester    502       4096 Янв 24 21:41 tt

необходимо подкорректировать
# chown tester:tester -R /home/tt
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 24 21:41 .
drwxr-xr-x 7 root   root   4096 Янв 24 21:41 ..
-rw------- 1 tester tester   24 Янв 24 21:41 .bash_logout
-rw------- 1 tester tester  182 Янв 24 21:41 .bash_profile
-rw------- 1 tester tester  124 Янв 24 21:41 .bashrc
drwx------ 2 tester tester 4096 Янв 24 21:41 .cache
drwx------ 2 tester tester 4096 Янв 24 21:41 .config
drwx------ 3 tester tester 4096 Янв 24 21:41 .kde4
drwx------ 3 tester tester 4096 Янв 24 21:41 .local
-rw------- 1 tester tester   17 Янв 24 21:41 .lpoptions
drwx------ 3 tester tester 4096 Янв 24 21:41 .mutt
-rw------- 1 tester tester  120 Янв 24 21:41 .rpmmacros
drwx------ 2 tester tester 4096 Янв 24 21:41 .ssh
-rwx------ 1 tester tester  240 Янв 24 21:41 .xprofile
drwx------ 2 tester tester 4096 Янв 24 21:41 .xsession.d

Зарегистрированных в системе пользователей стоит посмотреть
# cat /etc/passwd | grep -i -E ':50[0-9]' | cut -d: -f1

но лучше так, чтобы увидеть не только логин, но и uid/gid пользователей
# cat /etc/passwd | awk '/bash/{print}'
...
tester:x:503:503::/home/tt:/bin/bash
...

Теперь вычистим систему удалив предварительно пользователя
# userdel -r tester
(и каталоги /tmp, /tmp/.private от файлов пользователя)
и взглянем на другой вариант.

Вариант первый: свежепереустановленная система, на винчестере приватные файлы пользователя, пользователь в системе не зарегистрирован.

Напомним ситуацию
Файлы на винчестере существуют, пользователь в системе не зарегистрирован:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13  2009 Documents
drwx------ 2 503 503 48 Янв 13  2009 tmp

Зарегистрированные в системе пользователи:
# cat /etc/passwd | awk '/bash/{print}'
root:x:0:0:System Administrator:/root:/bin/bash
john:x:500:500::/home/john:/bin/bash
bob:x:501:501::/home/bob:/bin/bash

В этом случае ещё проще.
Создаём группу с gid=503 для будущего пользователя соответствующим правам файлов пользователя:
# groupadd  -g 503 tester

Что и где произошло?
# getent passwd tester
#
# cat /etc/group|grep tester:
tester:x:503:

Создаём пользователя:
# useradd -u 503 -g 503 -m -k /etc/skel -d /home/tt tester

Просматриваем ситуацию:
# id tester
uid=503(tester) gid=503(tester) groups=503(tester)
# getent passwd tester
tester:x:503:503::/home/tt:/bin/bash
# cat /etc/group|grep tester:
tester:x:503:
# ls -la /home/tt
total 60
drwx-----x 9 tester tester 4096 Янв 25 18:49 .
drwxr-xr-x 7 root   root   4096 Янв 25 18:49 ..
-rw------- 1 tester tester   24 Янв 25 18:49 .bash_logout
-rw------- 1 tester tester  182 Янв 25 18:49 .bash_profile
-rw------- 1 tester tester  124 Янв 25 18:49 .bashrc
drwx------ 2 tester tester 4096 Янв 25 18:49 .cache
drwx------ 2 tester tester 4096 Янв 25 18:49 .config
drwx------ 3 tester tester 4096 Янв 25 18:49 .kde4
drwx------ 3 tester tester 4096 Янв 25 18:49 .local
-rw------- 1 tester tester   17 Янв 25 18:49 .lpoptions
drwx------ 3 tester tester 4096 Янв 25 18:49 .mutt
-rw------- 1 tester tester  120 Янв 25 18:49 .rpmmacros
drwx------ 2 tester tester 4096 Янв 25 18:49 .ssh
-rwx------ 1 tester tester  240 Янв 25 18:49 .xprofile
drwx------ 2 tester tester 4096 Янв 25 18:49 .xsession.d
# cat /etc/passwd | awk '/bash/{print}'
root:x:0:0:System Administrator:/root:/bin/bash
john:x:500:500::/home/john:/bin/bash
bob:x:501:501::/home/bob:/bin/bash
tester:x:503:503::/home/tt:/bin/bash

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


Лирическое отступление.

В варианте первом, который описан вторым, команда
# groupadd  -g 503 tester

должна предварять команду
# useradd -u 503 -g 503 -m -k /etc/skel -d /home/tt tester
потому, что ключ -g, с указанием номера gid, в команде useradd добавляет пользователя только в уже существующую группу. Поэтому её необходимо предварительно создать.

Некоторый разбор полётов с командой
# useradd -u 503 -g 503 -G mail,audio,users -m -k /etc/skel -d /home/tt tester

-u 503
присваивает регистрируемому в системе пользователю номер ID.

-g 503
Номер группы.
Группа должна существовать.

-G mail,audio,users
Список групп в которых пользователь должен состоять и в которые будет добавлен.
Группы должны существовать.

-m
Ключ указывающий, что необходимо создать каталог пользователя.

-k /etc/skel
Ключ -k указывает откуда следует скопировать в домашний  каталог пользователя минимально необходимые файлы профиля. Наличие ключа -m в комбинации с ключём -k обязательно.
Этот ключ может быть исключительно полезен, если необходимо создавать для нового пользователя кастомизированный профиль для пущего удобства.
Например используя кастомизацию bash:
Удобная работа в Bash (bash shell console)
Заготовка этого профиля может лежать в любом месте. Лучше если он доступен только администатору или соадминистратору с делегированными ему правами доступа.

-d /home/tt
Имя домашнего каталога пользователя.
По-умолчанию, при отсутствии ключа и пути, имя домашнего каталога будет соответствовать имени логина пользователя.


Для нестандартных ситуаций очистки системы от файлов пользователя.
Где их найти?
С учётом, что ID пользователя 503, логин tester.
# cat /etc/group|grep tester
# cat /etc/passwd|grep tester
# ls -laF /tmp|grep 503
# ls -laF /tmp|grep tester
# ls -laF /tmp/.private/|grep tester
# ls -laF /etc/tcb/|grep tester
# ls -laF /var/mail/|grep tester
# ls -laF /home|grep tester


Фичи и трюки.
Ещё одно свойство *nix-систем.
Допустим вы хотите попробовать Debian GNU/Linux параллельно с ALT Linux и при этом являться владельцем всех своих файлов на винчестере.
Учтите, что параметры UID_MIN/GID_MIN в ALT Linux равен 500, а в Debian и многих других Линукс он равен 1000.
В свойствах файлов принадлежность указывается не в виде имени пользователя, а в виде ID:
# ls -l ./
total 0
drwx------ 2 503 503 48 Янв 13  2009 Documents
drwx------ 2 503 503 48 Янв 13  2009 tmp
Соответственно, если в двух системах пользователь будет иметь одинаковые UID/GID, то в них обеих он будет являться владельцем всех своих локальных файлов.
Не уверен в том, что для двух разных Линукс использовать один домашний каталог хорошая идея, даже если и логин с паролем одинаковые в двух системах: из-за того, что расположение и настройки конфигурационных файлов могут различаться. Этот момент вы должны выяснить самостоятельно. Но в любом случае при одинаковых UID/GID вам ни что не мешает иметь два домашних каталога для разных систем для этого пользователя и являться владельцем всех своих локальных файлов.
На этот счёт будет интересен файл ALT Linux
# cat /etc/login.defs

в котором задаются диапазоны параметров ID используемых при регистрации нового пользователя
#
# Min/max values for automatic UID selection in useradd.
#
UID_MIN                 500
UID_MAX                 60000

#
# Min/max values for automatic GID selection in useradd and groupadd.
#
GID_MIN                 500
GID_MAX                 60000

В чём хитрость, вы наверное уже сообразили.
Но "ручное" задание UID/GID при регистрации нового пользователя на мой взгляд проще и более предсказуемо.
В общем это только идея, реализацию которой вы можете додумать по своему вкусу.


В общем и целом, это попытка показать, что в *nix-системах многие вопросы решаются проще, чем в ОС линейки Windows, а bash shell из страшной консоли может превратиться в мощный и удобный инструмент.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Разблокировка DVD-привода

# sdparm -C unlock /dev/sr0
если по команде eject поданной пользователем из терминала, лоток с диском извлекаться не хочет.

Некоторые варианты команды eject выводящие больше подробностей:
$ eject -v
$ strace -e ioctl eject -v

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Ещё раз о разблокировке DVD-привода

Проблема:
После размонтирования файловой системы матрицы, лоток привода не извлекается командой eject:
$ eject
eject: не удалось извлечь. Последняя ошибка : Неприменимый к данному устройству ioctl

Решение:
Скопировать файл
# cp /lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/60-cdrom_id.rules

И привести к виду убрав опцию --lock-media в строке начинающейся с IMPORT
# cat /etc/udev/rules.d/60-cdrom_id.rules
# do not edit this file, it will be overwritten on update

ACTION=="remove", GOTO="cdrom_end"
SUBSYSTEM!="block", GOTO="cdrom_end"
KERNEL!="sr[0-9]*|xvd*", GOTO="cdrom_end"
ENV{DEVTYPE}!="disk", GOTO="cdrom_end"

# unconditionally tag device as CDROM
KERNEL=="sr[0-9]*", ENV{ID_CDROM}="1"

# media eject button pressed
ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdrom_id --eject-media $devnode", GOTO="cdrom_end"

# import device and media properties and lock tray to
# enable the receiving of media eject button events
#IMPORT{program}="cdrom_id --lock-media $devnode"
IMPORT{program}="cdrom_id $devnode"

KERNEL=="sr0", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"

LABEL="cdrom_end"

Подать команду
# udevadm control --reload

После размонтирования лоток привода по команде eject будет извлекаться.
За совет спасибо слакварщикам
Проверно на p7-sysv-tde

Если в ядре пофиксят
https://bugzilla.kernel.org/show_bug.cgi?id=58391

то
# echo 'dev.cdrom.lock=0' >> /etc/sysctl.conf
# sysctl -p
« Последнее редактирование: 23.06.2015 13:55:22 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Простой скрипт-триггер
для отключения/включения wlan-интерфейса в etcnet
при настроенном беспроводном соединении в alterator-net-wifi

По мотивам /etc/net/scripts/ :
# iwgetid | cut -f1 -d '"'
eth1      ESSID:
# /etc/net/scripts/ifdown-wireless eth1
# iwgetid | cut -f1 -d '"'
#
# /etc/net/scripts/ifup-wireless eth1
# iwgetid | cut -f1 -d '"'
eth1      ESSID:

Содержимое скрипта:
#!/bin/bash

# Простой скрипт-триггер включения/отключения
# wlan интерфейса в etcnet
# Для работы требует настроенного wifi-соединения
# в alterator-net-wifi и наличия пользователя
# в группе wheel


# Парсинг имени интерфейса из полного пути к wpa_supplicant.conf
IWFACE=$(find /etc/net/ -name wpa_supplicant.conf|cut -f5 -d '/')

# Выход если файл wpa_supplicant.conf не найден,
# т.е. wifi-соединение не настроено
if [ -z "$IWFACE" ]
    then
        exit 0
fi

# Возвратить имя wlan-интерфейса и имя точки доступа
# Длина переменной ноль или не ноль
LEN=$(iwgetid)

# Если в переменную LEN возращено имя wlan-интерфейса
# и идентификатор точки доступа, то wlan-интерфейс отключить.
# Если переменная LEN пуста, - поднять отключенный
# wlan-интерфейс.
if [ ! -z "$LEN" ]
    then
        /etc/net/scripts/ifdown-wireless "$IWFACE"
    else
        if [ -z "$LEN" ]
            then
                /etc/net/scripts/ifup-wireless "$IWFACE"
        fi
fi

Скрипт требует наличия пакета wireless-tools

Для запуска скрипт не требует параметров.
Способ запуска для отключения и включения wlan-интерфейса:
# имя_исполняемого_файла-скрипта

Или при настроенном sudoers
$ sudo имя_исполняемого_файла-скрипта

Рекомедуемый каталог для скрипта
/usr/local/sbin

Для запуска скрипта без указания полного пути к нему, переменная PATH должна содержать путь к этому каталогу.


Парсить имя беспроводного интерфейса можно и так:
# grep INTERFACE $(grep -rli wlan /sys/class/net/* 2>/dev/null)|cut -f2 -d '='
eth1
не привязывая переменную IWFACE к wpa_supplicant.conf

« Последнее редактирование: 14.07.2015 00:00:28 от Speccyfighter »

Оффлайн mrs

  • Давно тут
  • **
  • Сообщений: 138
  • Paragraf 8
Пример профессиональный и не очень, но зато официальный (:

Вот за что я люблю linux:
#!/bin/bash

cnt=0
total=0
cat /proc/modules | cut -d " " -f1-2 | ( while read m s; do
(( ++cnt + total+=s )) && printf "Kernel module: $m - "
( /sbin/modinfo $m | grep filename | sed 's/.* //g' )
done && {
total=$( echo "scale=3;$total/1024/1024" | bc -l )
printf " * $cnt modules loaded, $total MiB used\n"
} )
скрипт показывает модули ядра, загруженные в текущий момент, их количество и объем занимаемой памяти.

а вот пример официальный...
Спойлер
Цитировать
$ cat /etc/rc.d/scripts/cleanup
!/bin/sh
#
# /etc/rc.d/scripts/cleanup - run once at boot time from rc.sysinit
#

WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

SourceIfNotEmpty /etc/sysconfig/system

# Clean up /
rm -f /fastboot /fsckoptions /forcefsck /halt /poweroff

# Clean up /var
find /var/run/ /var/lock/ -type f -delete

rm -rf /tmp/.X*-lock /tmp/.ICE-unix /tmp/.X11-unix /tmp/.esd /tmp/.font-unix
rm -f /tmp/esrv*
rm -f /tmp/k{fm,io}_*
rm -f /tmp/.s.PGSQL.*
rm -f /tmp/.MediaCon*
rm -rf /tmp/kde-*
rm -rf /tmp/ksocket-*
rm -rf /tmp/mcop-*
rm -rf /tmp/orbit-*
rm -rf /tmp/ssh-*

# Clean up /tmp.
if [ -n "$CLEAN_TMP" ] && [ "$CLEAN_TMP" -ge 1 ]; then
(
cd /tmp &&
    find -mindepth 1 -xdev \
    ! -ctime -"$CLEAN_TMP" \
    ! \( -name lost+found -uid 0 \) \
    ! \( -name quota.user -uid 0 \) \
    ! \( -name quota.group -uid 0 \) \
    ! \( -name aquota.user -uid 0 \) \
    ! \( -name aquota.group -uid 0 \) \
    -delete 2>/dev/null
)
fi

systemd-tmpfiles --clean

# Possibly create lastlog, faillog, utmp and wtmp, reset utmp and possibly utmpx.
for f in /var/log/{lastlog,faillog}; do
if [ ! -e $f ]; then
touch $f
chown root:root $f && chmod 644 $f
fi
done
for f in /var/log/wtmp /var/run/utmp; do
[ -e $f ] && continue
touch $f
chown root:utmp $f && chmod 664 $f
done
> /var/run/utmp
test -f /var/run/utmpx && > /var/run/utmpx

systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev

exit 0
... за что я линукс недолюбливаю (

* причем этот скрипт из системы с SysVinit-ом
« Последнее редактирование: 24.07.2015 17:02:17 от mrs »