Перейти к содержимому

Как настроить su linux

  • автор:

Инструкция по команде su

Команда su используется для запуска команд от имени другого пользователя, например, для запуска утилит с повышенными привилегиями от имени root.

Чтобы выполнить КОМАНДУ с правами root используйте конструкцию:

su -c КОМАНДА
su -c whoami

Чтобы открыть оболочку для пользователя root с инициализацией его переменных среды (например, $HOME):

Чтобы выполнить команду ‘Get-Help Get-Alias -Full’ с правами root в оболочке /usr/bin/pwsh-preview:

su -c 'Get-Help Get-Alias -Full' -s /usr/bin/pwsh-preview

Для чего нужна команда su

su позволяет запускать команды с замещающим идентификатором пользователя и группы.

При вызове без указания пользователя su по умолчанию запускает интерактивную оболочку от имени пользователя root. Когда указан пользователь, могут быть предоставлены дополнительные аргументы, и в этом случае они передаются оболочке.

Для обратной совместимости su по умолчанию не изменяет текущий каталог и устанавливает только переменные среды $HOME и $SHELL (плюс $USER и $LOGNAME, если целевой пользователь не является пользователем root). Рекомендуется всегда использовать опцию «—login» (вместо её псевдонима «»), чтобы избежать побочных эффектов, вызванных смешиванием сред.

su в основном предназначен для непривилегированных пользователей, рекомендуемое решение для привилегированных пользователей (например, сценарии, выполняемые пользователем root) — использовать команду runuser без идентификатора пользователя, которая не требует аутентификации и предоставляет отдельную конфигурацию PAM. Если сеанс PAM вообще не требуется, рекомендуется использовать команду setpriv.

Обратите внимание, что su во всех случаях использует PAM (pam_getenvlist) для окончательной модификации среды. Параметры командной строки, такие как —login и —preserve-environment, влияют на среду до того, как она будет изменена PAM.

Что использовать sudo или su?

У программы su похожее назначение: запустить команду с подстановкой ID другого пользователя и группы. То есть одинакового результата можно добиться используя как sudo, так и su.

Различия между этими программами вы найдёте в разделе «Что использовать sudo или su?».

Смотрите также:

  • Что такое sudo
  • Как пользоваться sudo

Как использовать команду su

Синтаксис команды следующий:

su [ОПЦИИ] [-] [ПОЛЬЗОВАТЕЛИ [АРГУМЕНТ. ]]

Опции команды su:

-c, —command=КОМАНДА

Передаёт команду оболочке с параметром -c.

-f, —fast

Передаёт значение -f оболочке, что может оказаться полезным, а может и не оказаться полезным, в зависимости от оболочки.

-g, —group=ГРУППА

Указывает основную группу. Эта опция доступна только пользователю root.

-G, —supp-group=ГРУППА

Укажите дополнительную группу. Эта опция доступна только пользователю root. Первая указанная дополнительная группа также используется как основная группа, если не указан параметр —group.

-, -l, —login

Запуск оболочки как оболочки с входом в систему со средой, похожей на реальный вход в систему. Эта опция делает следующее:

  • • очищает все переменные среды, кроме $TERM и переменных, указанных в —whitelist-environment
  • • инициализирует переменные среды $HOME, $SHELL, $USER, $LOGNAME и $PATH
  • • изменяет домашнюю папку на папку целевого пользователя
  • • устанавливает argv[0] оболочки на «», чтобы сделать оболочку оболочкой с входом в систему

-m, -p, —preserve-environment

Сохраните всю среду, т.е. не устанавливайте $HOME, $SHELL, $USER или $LOGNAME. Этот параметр игнорируется, если указан параметр —login.

-P, —pty

Создайте псевдотерминал для сеанса. Независимый терминал обеспечивает лучшую безопасность, поскольку пользователь не использует терминал совместно с исходным сеансом. Это можно использовать, чтобы избежать внедрения терминала TIOCSTI ioctl и других атак на безопасность дескрипторов файлов терминала. Весь сеанс также можно переместить в фоновый режим (например, «su —pty — username -c application &»). Если псевдотерминал включён, su работает как прокси-сервер между сеансами (копирует stdin и stdout).

Эта функция в основном предназначена для интерактивных сеансов. Если стандартный ввод — это не терминал, а, например, канал (например, echo «date» | su —pty), то флаг ECHO для псевдотерминала отключён, чтобы избежать беспорядочного вывода.

-s, —shell=ОБОЛОЧКА

Запускает указанную оболочку вместо оболочки по умолчанию. Оболочка для запуска выбирается в соответствии со следующими правилами в следующем порядке:

  • оболочка, указанная с помощью —shell
  • оболочка, указанная в переменной окружения $SHELL, если используется опция —preserve-environment
  • оболочка, указанная в записи passwd целевого пользователя
  • /bin/sh

Список доступных в операционной системе оболочек можно вывести командой:

chsh -l

Смотрите также:

  • Как в Linux изменить login shell (оболочку входа в систему). Инструкция по команде chsh
  • Как узнать, какая оболочка используется в Linux

Если у целевого пользователя ограниченная оболочка (то есть не указана в /etc/shells), параметр —shell и переменные среды SHELL игнорируются, если вызывающий пользователь не является пользователем root.

—session-command=КОМАНДА

То же, что и -c, но не создаёт новый сеанс.

-w, —whitelist-environment=СПИСОК

Не сбрасывать переменные среды, указанные в списке, разделённом запятыми, при очистке среды для —login. Белый список игнорируется для переменных среды $HOME, $SHELL, $USER, $LOGNAME и $PATH.

-V, —version

Отобразите информацию о версии и выйдите.

-h, —help

Показать текст справки и выйти.

Типичными примерами использования su является выполнение КОМАНДЫ от имени root:

su -c КОМАНДА

Также su может использоваться для открытия интерактивной оболочки с правами root:

Как настроить su linux

Вопрос: Как перейти в режим суперпользователя (переключиться в root)?

Ответ: В терминале наберите команду (для читающих по диагонали: минус важен!):

Пояснения: при переходе в режим суперпользователя командой su происходит просто вызов командного интерпретатора с правами root. При этом значения переменных окружения, в частности $PATH , остается таким же, как у пользователя. То есть в переменной $PATH не окажется каталогов /sbin , /usr/sbin , и без указания полного имени будут недоступны команды route , lilo , mkswap и другие. Более того, переменная $HOME будет указывать на каталог пользователя и все программы, запущенные в режиме суперпользователя, сохранят свои настройки с правами рута в каталоге пользователя, что в дальнейшем может вызвать проблемы.

Чтобы избежать этого, следует использовать su — . В этом режиме su запустит командный интерпретатор в качестве login shell (подробнее см. man bash /INVOCATION ), и он будет вести себя в точности так, как если бы в систему залогинился root.

Для раздачи ограниченных прав суперпользователя применяется утилита sudo .

Ввиду наличия псевдонима работает также

$ alias su- alias su-='su -' 

Ограничения запуска

При попытке переключиться в администратора в терминале появляется следующая ошибка:

$ su - bash: /bin/su: Отказано в доступе

Штатно пользователю для этого нужно быть в группе wheel (что автоматически выполняется для первого пользователя, заведённого при установке, и настраивается в Центре управления системой). Другие режимы регулируются командой control:

$ /usr/sbin/control su wheelonly $ ls -l `which su` -rws--x--- 1 root wheel 22316 авг 25 2012 /bin/su $ groups | grep wheel cas wheel uucp proc cdrom floppy cdwriter audio radio sambashare vboxusers camera xgrp scanner $ su - Password: # 

Также можно разрешить для всех:

control su public

(залогиниться первым пользователем или в консоли Ctrl + ALT + F2 самим root.

Ошибки, возникающие при неправильном использовании su

Чаще всего пользователь, который неправильно запускал su сталкивается с некорректной работой различных программ — не сохраняются конфигурационные файлы, не работают настройки, происходят произвольные сообщения об ошибках записи. Рекомендуется проверить домашний каталог на наличие файлов, принадлежащих пользователю root командой:

$ find $HOME -user root

если ваша система исправна, то список файлов будет пустой.

Ссылки

  • Bug 23700: Совместимость по параметрам и поведению с версией из Red Hat
  • Получение_прав_root
  • Настройка sudo
  • Как обойтись без прав root. Часть 2

su или sudo?

С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации Ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano , а в многочисленных любительских мануалах (в стиле «5 фокусов в командной строке, которые удивят вашу бабушку») для получения root’ового шелла предлагается писать sudo su — . Попробую объяснить, почему такое положение вещей кажется мне неправильным.

Исторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более корректно было запускать ее как su — — в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c «vim /etc/fstab» .

При этом доверенным пользователям приходилось помнить пароль root’а и у всех пользователей, перечисленных в группе «wheel» (т.е. в группе, члены которой могли выполнить команду su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.

Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers , см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью » sudo -i «

Стоит особо упомянуть о специальной команде sudoedit , безопасно запускающей редактор, указанный в переменной окружения $EDITOR . При более традиционной схеме редактирование файлов производилось примерно так:

sudo vi /etc/fstab

Запускаемый таким образом vi наследовал оболочку с неограниченными правами и через :! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.

sudoedit проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе (который наследует права пользователя, а не root’а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.

В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo . Являясь полной заменой su , sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.

Поэтому предлагаю всем раз и навсегда запомнить:

что хотим сделать? правильно неправильно
выполнить команду от имени root sudo command su -c «command»
отредактировать файл от имени root sudoedit file su vim file
sudo vim file
получить оболочку root sudo -i su —
sudo su —

После первой публикации этой заметки мне было задано несколько вопросов. Из ответов получилось сделать мини-FAQ.

Q: как с помощью sudo сделать su -c «echo 1 > /etc/privileged_file» ? sudo echo 1 /etc/privileged_file ругается на «permission denied»
A: Это происходит потому, что только команда echo выполняется в повышенными правами, а результат перенаправляется в файл уже с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:

$ echo 1| sudo tee -a privileged_file >/dev/null

Или же временно стать рутом:

$ sudo -i # echo 1 > privileged_file # exit $
  • по умолчанию sudo записывает всю пользовательскую активность в syslog-канал authpriv (как правило, результат кладется в файл /var/log/auth.log), а в su подобную фичу надо включать с помошью задания специального параметра в файле настроек, различающемся от дистрибутива к дистрибутиву ( SULOG_FILE в /etc/login.defs в Ubuntu Linux, /etc/login.conf и /etc/pam.d/su в FreeBSD и т.д.)
  • в случае с su администратор системы не может ограничить команды, выполняемые пользователями, а в sudo — может
  • если пользователь должен быть лишен права администрирования, в случае с su после удаления его из группы wheel он должен забыть пароль root’а; если используется sudo, достаточно вынести его из соответствующей группы (например, wheel или admin) и/или файла sudoers, если он был дополнительно настроен.

17. su

Мы с вами уже выяснили, что Linux – система многопользовательская. Если с помощью команды wc посчитать количество строк в файле /etc/passwd:

cat /etc/passwd wc -l /etc/passwd 

где перечислены все пользователи, мы увидим, что сейчас в системе 48 пользователей. Среди них есть наш пользователь user, суперпользователь root, а остальные, которых создавали не мы, а система, считаются сервисными пользователями.

Нам сегодня понадобится ещё один пользователь, поэтому создадим его с помощью команды:

sudo useradd user2 

введём наш пароль, а потом с помощью:

sudo passwd user2 

зададим пароль для второго пользователя.

Начнём с команды su:

Она позволяет залогиниться каким-то пользователем или запускать команды от имени другого пользователя. При этом нужно знать пароль этого другого пользователя. Это бывает нужно, когда у нашего пользователя нет нужных прав, либо когда нам нужно запустить какой-то процесс от имени другого пользователя, например, в целях безопасности.

Например, сейчас мой пользователь не может зайти в директорию /home/user2:

cd /home/user2 

потому что у него недостаточно прав. Я могу написать:

su user2 

ввести пароль пользователя user2 и стать этим самым вторым пользователем, как видно в начале строки. А дальше смогу зайти в нужную директорию:

cd /home/user2 

Чтобы вернуться к моему пользователю, я могу написать:

exit 

либо нажать Ctrl+d. Если написать просто:

su root 

и ввести пароль рута, можно работать от пользователя root.

Но помните мы разбирали файлы ~/.bash_profile и ~/.bashrc ? Мы писали там переменные и алиасы, и, в случае с ~/.bash_profile, нам нужно было перезалогиниться, а в случае с ~/.bashrc нам достаточно было просто запустить новый эмулятор терминала. То есть ~/.bash_profile это файл настроек для login shell, а ~/.bashrc для nonlogin shell.

Давайте сделаем вот что. У пользователя user2:

su user2 

в файле ~/.bash_profile:

nano /home/user2/.bash_profile 

создадим переменную test1 равную test1:

а в файле ~/.bashrc:

nano /home/user2/.bashrc 

переменную test2 равную test2:

Теперь выйдем — ctrl+d — заново зайдём:

su user2 

и посмотрим, как обстоят дела с переменными:

echo $test1 echo $test2

Как видите, сработала настройка только из ~/.bashrc, то есть non-login shell. Это означает, что переменные окружения не прочитались с ~/.bash_profile (login shell) пользователя user2. На самом деле, все переменные остались от предыдущего пользователя. Допустим, если посмотреть переменную PATH:

echo $PATH

можно увидеть пути к директориям /home/user/bin, а это домашняя директория первого пользователя. Также, если писать su user2, можно заметить, что директория, в которой мы находимся, не меняется:

Зачастую нужно, чтобы при логине за другого пользователя поменялось окружение, то есть, чтобы применились настройки из ~/.bash_profile нужного пользователя. Для этого после su следует писать дефис:

su – user2

Теперь у меня есть обе переменные:

echo $test1 echo $test2

то есть считался файл ~/.bash_profile, а значит это был login shell. Также стоит заметить, что при su c дефисом поменялась и директория – раньше мы находились в домашней директории пользователя user, а после «su -» меняется текущая директория — /home/user2.

Кстати, чтобы понять, текущий shell – login или non-login, не обязательно выдумывать каждый раз какие-то проверки с переменными, достаточно проверить значение переменной $0:

echo $0

При non-login shell значение будет просто bash, а при login shell «-bash». И если проверить ту же переменную PATH:

echo $PATH

можно увидеть, что теперь здесь нет пути /home/user/bin, то есть переменные окружения не передались от предыдущего пользователя, а появились как следует.

Так вот, подводя итоги. Когда вы вводите свой логин и пароль, будь то удалённо с помощью ssh, либо локально, зайдя в виртуальный терминал, либо залогинившись в графической оболочке — запускается оболочка со входом — login shell. Это оболочка с авторизацией, она считывает настройки – те же переменные, алиасы, функции сначала с файла /etc/profile, где написано смотреть на файлы в директории /etc/profile.d/ и в файл ~/.bash_profile в домашней директории пользователя. Там также написано смотреть в файл ~/.bashrc в домашней директории пользователя, в котором также написано смотреть в файл /etc/bashrc.

Когда же вы запускаете программу эмулятор терминала, то там нет логина, вы без логина и пароля можете вводить команды — оболочка без входа — non-login shell. В случае с non-login shell сначала считывается файл ~/.bashrc в домашней директории пользователя, затем считывается файл /etc/bashrc, который в свою очередь ссылается на файлы в /etc/profile.d/. Но приведённая схема может отличаться на других дистрибутивах.

Кроме этого, оболочки делятся на interactive и non-interactive. Если вы логинитесь и запускаете команды — это interactive login shell. Если вы работаете в эмуляторе терминала — это interactive non-login shell. Когда работают скрипты, они обычно запускаются без всякого логина — тут уже non-interactive non-login shell. Да, когда вы запускаете эмулятор терминала, в этом эмуляторе запускается bash и запускает ~/.bashrc. Сами по себе ~/.bashrc и ~/.bash_profile — это просто набор команд в одном файле. То есть это скрипты. Когда же вы логинитесь, не важно каким образом, тоже запускается bash, при этом он запускает ~/.bash_profile.

Ладно, со сменой пользователя разобрались. Мы еще говорили, что su позволяет запускать команды от имени другого пользователя. Для этого используется ключ -c. Например:

su user2 -c "touch file" su – user2 -с "touch file"

Подумайте, почему первая команда завершилась с ошибкой, а вторая без? Ну и зачастую, su используют чтобы работать от имени root пользователя, для примера запустим nano от рута:

su - -c "nano /etc/passwd" 

и теперь мы можем редактировать файл /etc/passwd и в целом можем делать всё что угодно.

Кстати, если запускать su от имени рута:

su su user2 

то никаких паролей не потребуется, root может логиниться кем угодно.

© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *