Sudo sh c что за команда
Перейти к содержимому

Sudo sh c что за команда

  • автор:

Параметр sh -c

Попробуй запустить первую и вторую команду с использованием sudo из-под непривелигерованного пользователя да так, что файл после >> не был этому пользователю доступен на запись. Это из практического примера, который подсказывает, в чем разница между ними.

anonymous
( 05.07.17 22:52:19 MSK )
Ответ на: комментарий от MrSullex 05.07.17 22:33:32 MSK

sh -c "echo 'DenyGroups gameservers' >> /etc/ssh/sshd_config"

в bash файле от

echo 'DenyGroups gameservers' >> /etc/ssh/sshd_config

DATRAT уже ответил, но я уточню. Во втором случае работает конкретная оболочка (например, bash) в интерактивном режиме, позволяя запускать доступные команды. В первом же случае запускается команда sh, обычно являющаяся символической ссылкой на bash, но иногда на что-то ещё (например, на dash), в пакетном режиме (т. е. без командного приглашения). И запускать её можно как из другой (или той же самой) shell, так и из любой программы на Си или на python или на чём-то ещё. А можно щелчком мыши из ярлыка на рабочем столе.

Использование команды sudo в Linux

Команда sudo ( s ubstitute u ser and do , подменить пользователя и выполнить ) позволяет строго определенным пользователям выполнять указанные программы с административными привилегиями без ввода пароля суперпользователя root . Если быть точнее, то команда sudo позволяет выполнять программы от имени любого пользователя, но, если идентификатор или имя этого пользователя не указаны, то предполагается выполнение от имени суперпользователя root . Таким образом, использование sudo позволяет выполнять привилегированные команды обычным пользователям без необходимости ввода пароля суперпользователя root . Список пользователей и перечень их прав по отношению к ресурсам системы может быть настроен оптимальным образом для обеспечения комфортной и безопасной работы. Например, команда sudo в Ubuntu Linux, используется в режиме, позволяющем выполнять любые задачи администрирования системы без интерактивного входа под учетной записью root .

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

Командная строка sudo может быть использована в следующих форматах:

sudo -h | -K | -k | -V

sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]

sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]

sudo [-AbEHknPS] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s] [ ]

sudo -e [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-u user] file

Параметры командной строки:

-A, —askpass — использовать вспомогательную программу для ввода пароля

-b, —background — выполнить команду в фоновом режиме

-C, —close-from=num — закрыть все дескрипторы файлов >= num

-E, —preserve-env — сохранить пользовательское окружение при выполнении команды

-e, —edit — редактировать файлы вместо выполнения команды

-g, —group=group — выполнить команду от имени или ID указанной группы

-H, —set-home — установить для переменной HOME домашний каталог указанного пользователя

-h, —help — показать справку и выйти

-h, —host=host — выполнить команду на узле (если поддерживается модулем)

-i, —login — запустить оболочку входа в систему от имени указанного пользователя; также можно задать команду

-K, —remove-timestamp — полностью удалить файл с timestamp

-k, —reset-timestamp — объявить недействительным файл timestamp

-l, —list — показать список прав пользователя или проверить заданную команду; в длинном формате используется дважды

-n, —non-interactive — автономный режим без вывода запросов пользователю

-P, —preserve-groups — сохранить вектор группы вместо установки целевой группы

-p, —prompt=prompt — использовать указанный запрос пароля

-S, —stdin — читать пароль из стандартного ввода

-s, —shell — запустить оболочку от имени указанного пользователя; также можно задать команду

-U, —other-user=user — в режиме списка показывать права пользователя

-u, —user=user — выполнить команду (или редактировать файл) от имени или ID указанного пользователя

-V, —version — показать сведения о версии и выйти

-v, —validate — обновить временную метку пользователя без выполнения команды

— — прекратить обработку аргументов командной строки

Примеры использования команды sudo :

sudo –l — отобразить список команд, доступных для выполнения текущему пользователю. Кроме списка команд отображаются параметры среды, которые будут применяться при их выполнении.

sudo –ll — отобразить список команд, доступных для выполнения текущему пользователю в длинном (расширенном) формате.

В данном формате вместо краткого синтаксиса для списка разрешенных команд в виде (ALL : ALL) ALL отображается подробное описание прав пользователя:

sudo lshw -C network — отобразить информацию о сетевом оборудовании с правами суперпользователя root

sudo –l –U user1 — посмотреть список команд, доступных для выполнения пользователю user1 . Для выполнения данной команды пользователь должен быть root или иметь право на выполнение команды sudo -l , что обеспечивается настройками утилиты sudo в файле /etc/sudoers

sudo ipmitool sensor — выполнить команду ipmitool sensor с правами root .

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

sudo -i — запустить командную оболочку с правами суперпользователя root . Для выполнения данной команды пользователь должен иметь право на выполнение программы оболочки в среде sudo , например — /bin/bash

sudo ls /usr/local/protected — получить список файлов каталога, доступного только root

sudo -u user2 ls ~ — получить список файлов домашнего каталога пользователя user2

sudo -u www vi ~www/htdocs/index.html — редактировать файл ~www/htdocs/index.html от имени пользователя www

sudo -g adm view /var/log/syslog — просмотреть файл системного журнала, доступного только суперпользователю root и членам группы adm

sudo -u user1 -g users2 vi /home/users2/textfile.txt — редактировать текстовый файл как пользователь user1, с принадлежностью к первичной группе users2

sudo -E /usr/bin/firefox — запустить браузер firefox от имени суперпользователя root , сохранив параметры среды текущего пользователя. Возможность выполнения команд с сохранением среды пользователя должна быть разрешена параметром SETENV в настройках файла конфигурации sudo

Файл конфигурации /etc/sudoers

Настройки sudo определяется содержимым файла /etc/sudoers . Поскольку ошибочные данные в данном файле могут привести к серьезным проблемам доступа к ресурсам системы, рекомендуется выполнять его изменение с помощью специального редактора sudoedit ( в некоторых дистрибутивах — visudo ), который поддерживает функции проверки синтаксиса и значительно снижает риск создания неработоспособной конфигурации sudo .

Содержимое файла /etc/sudoers определяет имена пользователей и групп, перечень выполняемых программ, необходимость введения паролей, и некоторые другие настройки, связанные с формированием переменных окружения при смене пользователя. Кроме данного файла, настройки sudo могут определяться содержимым файлов из каталога /etc/sudoers.d , что позволяет структурировать систему предоставления прав на использование sudo в виде набора файлов с осмысленными именами, что полезно при большом количестве пользователей и сложной системе разграничения прав. Имена файлов конфигураций в каталоге /etc/sudoers.d могут быть любыми, но их содержимое должно полностью соответствовать формату файла /etc/sudoers .

Синтаксис настроек в файле /etc/sudoers позволяет использовать специальные псевдонимы ( Alias-ы ), с помощью которых значительно упрощается как настройка, так и восприятие конфигурационной информации sudo .

В файле конфигурации /etc/sudoers возможно использование четырех разновидностей псевдонимов:

User_Alias — списки пользователей, для которых настраивается политика использования sudo .

Runas_Alias — списки пользователей, от имени которых может быть задано выполнение команд через sudo .

Host_Alias — списки узлов, с которых выполняется подключение к системе.

Cmnd_Alias — списки команд, использующиеся в настройках, выполняемых директивами файла /etc/sudoers

Host_Alias ADMCOMPS = localhost, server, admin — определяет псевдоним ADMCOMPS , который определяет группу компьютеров с именами localhost, server, admin .

Host_Alias MAILSERVERS = 192.168.0.100, smtp2 — определяет группу из двух компьютеров с указанными IP и именем. Возможно использование адресов подсетей.

User_Alias ADMINS = jsmith, admusr — определяет группу ADMINS , в которую входят пользователи с именами jsmith и admusr .

Аналогичным образом можно создать псевдонимы для различных наборов команд, доступных для выполнения в sudo :

## Группа команд, для работы в сети, псевдоним Networking

Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

# Группа команд для управления установкой и удалением программ, псевдоним SOFTWARE

Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

# Группа команд для управления системными службами, псевдоним SERVICES

Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

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

Основная часть настроек в файле /etc/sudoers задает правила, определяющие, какие пользователи, каких компьютеров, какие команды могут выполнять. Формат записей:

user — имена или псевдонимы пользователей.

MACHINE — имена или псевдонимы компьютеров

COMMANDS — секция команд, включающая имена или псевдонимы команд и дополнительные параметры.

Обычно, в файле /etc/sudoers присутствует директива, разрешающая выполнение пользователю root любых команд при любом подключении к системе:

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

Аналогичным образом можно разрешить выполнение через sudo всех команд для пользователя, например, с именем user

user ALL=(ALL) ALL

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

user ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/drakxconf — пароль будет запрашиваться при выполнении пользователем user через sudo всех команд, кроме su и drakxconf

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

ADMINS localhost=(ALL) NOPASSWD:ALL — разрешить группе пользователей, определенной псевдонимом “ADMINS” выполнять любые команды при подключении через петлевой интерфейс “localhost” без ввода пароля..

ADMINS ALL= NETWORKING, SOFTWARE — разрешить группе пользователей, объединенных псевдонимом “ADMINS” выполнять группы команд, объединенные псевдонимами “NETWORKING” и “SOFTWARE”.

Для существующих в системе групп пользователей можно также разрешать выполнение отдельных команд или групп команд:

%users localhost=/sbin/shutdown -h now — разрешить локальным пользователям выключение компьютера.

%operators ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom — разрешить членам группы “operators” монтирование и размонтирование указанных устройств.

%powerusers ALL=NETWORKING, NOPASSWD: /usr/bin/su — разрешить членам группы “powerusers” выполнять команды группы “NETWORKING” с вводом пароля и команду “su” без пароля.

Довольно часто возникает необходимость исключения разрешения на выполнение отдельных команд из списка, объединенных псевдонимом . В этом случае, перед именем команды или псевдонима ставится восклицательный знак – !

ADMINS ALL= ALL, !NETWORKING — разрешить группе пользователей, объединенных псевдонимом “ADMINS” выполнение всех команд, кроме команд, объединенных псевдонимом “NETWORKING”

В следующем примере, используется конфигурация команд, разрешающая выполнение через sudo для всех пользователей группы “ADMINS”, всех команд, кроме команд смены оболочки :

ADMINS ALL= ALL, !/bin/bash, !/usr/bin/su

Кроме настроек доступа, в файле /etc/sudoers присутствуют директивы Defaults , определяющие некоторые настройки путей исполняемых файлов и создание переменных окружения при выполнении команд:

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Defaults env_keep = «COLOS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS»

Defaults env_keep += «MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE»

Defaults env_keep += «LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES»

Defaults env_keep += «LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE»

Defaults env_keep += «LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY»

По умолчанию, если интервал выполнения команд с использованием sudo , не превышает 5 минут, то повторный ввод пароля не требуется. Однако, это значение можно изменить, добавив значение timestamp_timeout в минутах:

В данном случае, если команда sudo будет выполняться не позже, чем через 1 минуту после ввода пароля для предыдущей команды, то повторно пароль запрашиваться не будет. Если значение “timestamp_timeout” сделать равным нулю, то пароль будет запрашиваться при каждом запуске sudo , если сделать отрицательным ( -1 ), — то повторный ввод пароля не будет запрашиваться никогда.

Для исключения возможности выполнения sudo-команд при подключении через ssh без авторизации, по умолчанию, должна использоваться команда “ssh –t “:

# Disable «ssh hostname sudo «, because it will show the password in clear.

# You have to run «ssh -t hostname sudo «.

Для определения дополнительного каталога с файлами конфигурации пользователей sudo используется директива:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)

Подробную справку по использовании sudo можно получить с помощью команд:

Команда sudo – администрирование системы

В Unix-подобных операционных системах должен быть привилегированный пользователь – суперпользователь, он же администратор. Логин его учетной записи – root , а домашний каталог находится в /root . Этот пользователь предназначен для администрирования системы, а значит обладает правами на операции с системными файлами, установку программного обеспечения, создание и удаление других пользователей, предоставление им различных доступов.

В более ранних дистрибутивах GNU/Linux, возможно и некоторых сейчас, при установке операционной системы, кроме того что создавался обычный пользователь, надо было задать пароль для root’а. После этого войти в систему можно было как под юзером, так под администратором.

Это создавало дополнительную опасность для системы. Бесконтрольное манипулирование файлами администратором или вход под root’ом злоумышленника могли привести к краху системы. Так выполнение под админом команды rm -rf / ведет к удалению всех файлов.

Поэтому во многих современных дистрибутивах Linux учетная запись суперпользователя отключена, хотя она имеется в системе. Ее можно включить, задав для root’а пароль. Однако этого делать не рекомендуют.

Для администрирования системы Linux сейчас широко используется утилита sudo. Она позволяет первому, который создавался при установке ОС, пользователю выполнять команды с правами администратора. Однако основное преимущество не в том, чтобы не заходить в систему под рутом, а в том, что sudo может быть сконфигурирована так, что пользователь не сможет выполнять абсолютно все административные задачи, а сможет только позволенные.

Используется команда sudo следующим образом:

sudo команда параметры_команды

Допустим, нам надо отредактировать конфигурационный файл hosts . Редактировать мы его планируем в консольном текстовом редакторе nano . Если выполнить команду nano /etc/hosts , файл откроется, но мы не сможем сохранить изменения в нем, так как владельцем файла является root , а все остальные могут только читать файл.

Открытие файла без прав администратора

Однако, воспользовавшись sudo , мы откроем файл как суперпользователь и получим право на запись. При этом Bash попросит ввести пароль (вводимые символы при этом не отображаются) вашей (не рута) учетной записи.

Открытие файла с правами администратора

Sudo-сессия сохраняется какое-то время. Поэтому выполнение последующих команд с использованием sudo может не требовать ввода пароля.

Если требуется более длительное время работы с правами администратора, то одним из вариантов является команда sudo -s . Вы перейдете в режим суперпользователя, в приглашении командной оболочки Linux символ доллара $ заменяется на знак решетки # . Вернуться в обычный режим можно, выполнив команду exit .

Режим администратора

В примере мы переходим в режим администратора, копируем файл в каталог root’а. Под обычным пользователем мы не можем даже просматривать этот каталог.

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

Использование sudo c модулем sh в Python

Есть 3 способа использования команды терминала sudo для выполнения команд в скрипте, требующих прав суперпользователя. Они перечислены в порядке полезности и безопасности. В большинстве случаев следует просто использовать вариант sh.contrib.sudo() .

sh.contrib.sudo()

Так как команда sudo используется очень часто, разработчики модуля sh добавили версию этой команды в подмодуль contrib , чтобы сделать использование sudo более интуитивным. Версия contrib представляет собой обычную обертку для команды sh.sudo raw со специальным ключевым аргументом для ввода пароля суперпользователя, чтобы она работала правильно.

Выполнение sh.contrib.sudo() через менеджер контекста with с вводом пароля через терминал:

import sh with sh.contrib.sudo: print(ls("/root")) # [sudo] password for youruser: ************* # your_root_files.txt 

Или, альтернативно, с помощью подкоманд:

import sh print(sh.contrib.sudo.ls("/root")) # [sudo] password for youruser: ************* # your_root_files.txt 

В приведенном выше примере вызов sh.contrib.sudo автоматически запрашивает пароль, используя под капотом встроенный модуль Python getpass.getpass() .

Этот метод является наиболее безопасным, потому что он снижает шансы сделать что-то небезопасное, например, включить ваш пароль в скрипт python или сказать, что конкретный пользователь может выполнить что-либо внутри конкретного скрипта (метод NOPASSWD ).

Примечание. sh.contrib.sudo не выполняет кэширование паролей, как это делает двоичный файл sudo . Это означает, что каждый раз, когда в скрипте запускается команда sudo , будет предложено ввести пароль.

Также можно указать пароль к sh.contrib.sudo в виде строки:

import sh password = 'password' with sh.contrib.sudo(password, _with=True): print(ls("/root")) 

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

/etc/sudoers NOPASSWD .

С помощью этого метода можно использовать необработанную команду sh.sudo напрямую, потому что гарантировано, что система не будет запрашивать пароль. Для этого сначала необходимо настроить пользователя на получение привилегий выполнения root .

Отредактируйте свой файл sudoers :

$ sudo visudo # Добавьте или отредактируйте строку, # описывающую права доступа пользователя: yourusername ALL = (root) NOPASSWD: /path/to/your/program

Добавляемая строка говорит о том, что при вводе команды терминала sudo пользователь yourusername на ВСЕХ ALL хостах сможет работать как (root) , и что не будет запрашиваться пароль NOPASSWD для выполнения /path/to/your/program .

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

Использование необработанной команды sh.sudo (которая преобразуется непосредственно в двоичный файл sudo ) без метода NOPASSWD возможно при условии, если самостоятельно подключить специальный ключевой аргумент. Этот метод обсуждается в основном в образовательных целях. Если вы потратите время на то, чтобы подключить ключевой аргумент к sh.sudo самостоятельно, то вы, по сути, воссоздали sh.contrib.sudo .

import sh # пароль должен заканчиваться новой строкой my_password = "password\n" # `-S` говорит: "получите пароль от `stdin`" # метод `.bake` аналогичен `functools.partial()` my_sudo = sh.sudo.bake("-S", _in=my_password) # вызываем созданную функцию `my_sudo` # с зашитыми в нее параметрами my_sudo.ls("root") 

По сути метод .bake делает то же самое что и functools.partial() .

Использование аргумента _fg=True

Еще один менее очевидный способ использования sudo — выполнить необработанную команду sh.sudo , но также вывести ее на передний план. Таким образом, sudo будет работать правильно, автоматически подключая stdin/out/err и запрашивая пароль, если он требуется. Однако недостатком использования _fg=True является то, что нельзя записать куда либо его вывод — все просто выводится на терминал.

import sh sh.sudo.ls("/root", _fg=True) 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Передача параметров в команды модуля sh
  • Коды завершения и исключения модуля sh
  • Перенаправление вывода команды модуля sh
  • Фоновое выполнение команды с модулем sh
  • Конвейер в стиле Bash и модуль sh
  • Использование sudo c модулем sh
  • Использование ssh с модулем sh
  • Специальные ключевые аргументы модуля sh
  • Объект запущенной команды модуля sh
  • Класс Command() модуля sh
  • Частые вопросы по модулю sh

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

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