Насколько универсален sudo?

26

Я писал несколько инструкций о том, как что-то установить (связанных с TeX - если вы не спросите, я не испорчу ваш день, предоставив более подробную информацию) и использовал его sudoдля установки в масштабе всей системы. Кто-то заметил, что он не думал, что sudoэто доступно во всех дистрибутивах Linux (или Unix).

Есть ли в Unix дистрибутивы, которых нет sudo, и если да, то каковы они? Существует ли общепризнанная команда «Получи права суперпользователя», которая есть во всех системах?

Loop Space
источник

Ответы:

34

sudo не может считаться универсальным:

  • Red Hat Enterprise Linux : sudoпо умолчанию устанавливается в Red Hat Enterprise Linux и его производных 1, но он устанавливается только в RHEL 7 и более новых версиях, готовых к использованию.

    Red Hat Enterprise Linux 7 добавила новую опцию на экран установки, где вы создаете первого пользователя без полномочий root , флажок «Сделать этого пользователя администратором». Его назначение не задокументировано на этой странице руководства по установке, но один из его эффектов - позволить этому пользователю выполнить любую команду sudo. Это делается путем добавления этого пользователя в wheelгруппу, которая может выполнить любую команду в стандартной sudoконфигурации пакета.

    Red Hat Enterprise Linux с 3 по 6 также установлен sudoпо умолчанию 2, но до RHEL 7 он поставлялся настроенным так, что rootчерез него могли запускаться только команды. Самый простой способ исправить это - добавить одного или нескольких пользователей в wheelгруппу, затем запустить visudoот имени пользователя root и раскомментировать %wheel ALL=(ALL)...строку.

  • Debian : Начиная с Debian 9, минимальная установка включает sudo.

    В Debian 7 и 8 вам нужно было выбрать пакет « Стандартные системные утилиты » во время установки, чтобы получить его sudo. Если вы установите sudoэтот способ, установщик ОС автоматически добавит неадминистративного пользователя, которого вы создали ранее в процессе установки, в sudoгруппу, у которой есть разрешение на выполнение всех команд.

    В Debian 6 и более ранних версиях вам приходилось устанавливать с sudoпомощью via apt-getпосле установки и настраивать его вручную, чтобы предоставить пользователям без полномочий root возможность использовать его.

  • FreeBSD : sudoне устанавливается по умолчанию во FreeBSD. Вы должны построить его из портов.

  • NetBSD : то же, что и FreeBSD.

  • OpenBSD : sudoиспользуется для установки по умолчанию в OpenBSD, но они перешли к doasсостоянию на 5.8, выпущенный в октябре 2015 года . doasкорабли отключены по умолчанию.

    Чтобы получить sudoтекущие версии, вы должны установить его из репозитория пакетов. sudoПакет OpenBSD настроен так же, как в RHEL 3–6, так что только rootчерез него можно запускать команды, что скорее противоречит цели sudo. Если вы добавили не rootпользователя во время установки, он был добавлен в wheelгруппу, поэтому самый простой способ сделать его sudoполезным в системе OpenBSD - это раскомментировать %wheel ALL=(ALL)...строку через visudo.

  • Solaris : sudoпо умолчанию устанавливается в Solaris 11, но Solaris 10 и более ранние версии используют аналогичное, но не совсем то же самое pfexec.

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

Чем старше система, тем больше у нее шансов sudo. Хотя sudoон очень старый , он не стал популярным до середины 2000-х годов. Системы более старые, чем это, вряд ли будут иметь sudo. Unix-боксы, как правило, живут долго, поэтому не исключено, что вы все равно столкнетесь с такой системой сегодня.

Я рассчитываю только sudoна системы, которыми лично управляю, или на такие, как Ubuntu, macOS или openSuSE, где по умолчанию это единственный способ получить привилегии root.

suближе к универсальной команде «get me superuser привилегии», чем sudo, но тогда у вас есть системы, такие как Ubuntu и macOS, где корневая учетная запись по умолчанию заблокирована специально, чтобы заставить вас использовать sudoвместо su. Таким образом, вы также не можете назвать suуниверсальным.


Сноски :

  1. CentOS, Oracle Linux, Научный Linux ...

  2. Да, даже в минимальной установке.

Уоррен Янг
источник
9

sudoэто утилита, которая доступна практически на всех Linux-системах.
Тем не менее, он не включен по умолчанию во всех дистрибутивах. Все основные дистрибутивы имеют его по умолчанию.

В дистрибутивах Linux, таких как Arch Linux, Gentoo, LFS и т. Д., Которые позволяют пользователю полностью настраиваться, по умолчанию sudo не имеет.

В Arch Linux базовая система не поставляется с sudoустановленным. Пользователь должен вручную загрузить sudoи отредактировать файл sudoers.
То же самое для Gentoo и LFS. Я не знаю ни одного другого крупного дистрибутива без sudo.

И нет, я не думаю, что существует что-то более универсальное, чем sudoпредоставление привилегий суперпользователя. То есть, кроме входа в систему как root.

darnir
источник
1
sudoможет поставляться в большинстве дистрибутивов, но не все из них настраивают каждого пользователя как способного его запустить.
Jsbillings
Еще один хороший момент. Зависит от того, что говорит файл sudoers.
Дарнир
7

Наиболее широко используемый дистрибутив, Ubuntu, использует sudoв качестве рекомендуемого метода для получения прав root (при использовании командной строки - пользователи, которые придерживаются GUI, получат запрос пароля, не понимая и не заботясь о том, что происходит под капотом). Другие дистрибутивы могут или не могут поощрять настройку sudo и могут даже не отправлять его. С другой стороны, suдоступно везде и может использоваться на большинстве систем, кроме тех, где sudoдоступно только потому, что у пользователя не будет пароля root.

Между suи sudoвы покроете почти всех ваших пользователей. Немного экзотики, которым нужно califeили opили которые уже pfexecзнают, что делать. Даже если они этого не делают, система, которая не использует ни, suни sudoвероятно, будет иметь файлы в незнакомых местах и ​​достаточно вещей, о которых вы даже не думали, что ваши инструкции, вероятно, все равно не будут работать.

Жиль "ТАК - перестань быть злым"
источник
6

Чтобы ответить на ваш вопрос, наиболее точно, sudoне считается универсальным. По правде говоря, все понятие «универсальный» часто представляет собой красную сельдь. Это особенно верно в отношении кросс-дистрибутивной совместимости. Как только вы добавите множество различных версий программного обеспечения, универсальность станет полуреалистичной. Сценарии по своей природе прагматичны, если бы они были педантичными, написание переносимых сценариев было бы практически невозможно.

Обычно я измеряю свою предполагаемую среду исполнения, полу-современный дистрибутив Linux, ожидаю POSIX-оболочку с обычными утилитами GNU. Для сценариев, которые могут работать за пределами Linux, я ожидаю только полного стандарта POSIX. Очевидно, что многие скрипты специфичны для Linux или дистрибутива, поэтому часто сужают область переносимости.

Чтобы рассмотреть ваш конкретный сценарий,

#!/bin/sh


## Exit Point
die() {
    [ -n "$2" ] && echo "$2"
    exit $1
}


## Require SuperUser Execution, Otherwise Re-Execute
[ `id -u` -ne 0 ] && {

    command -v lsb_release > /dev/null && {
        DISTRO="`lsb_release -is`"
        [ "$DISTRO" = "Ubuntu" ] && SUPERUSER='sudo'
    }
    SUPERUSER="${SUPERUSER:-su}"

    case "$SUPERUSER" in
        su)
            su -c "$0"
            ;;
        sudo)
            sudo "$0"
            ;;
    esac
}

## Require SuperUser Execution
[ `id -u` -ne 0 ] && die 78




echo 'Script Executed by UID'
id -u




## Clean Up
die 0

этот вставленный скрипт является комплиментом оболочки POSIX, я всегда пишу Dash-совместимый.

Дж. М. Беккер
источник
Но не требует ли ваш скрипт установки sudo? Есть ли способ получить доступ суперпользователя без использования sudo? Через простой сценарий?
Дарнир
@darnir: нет, вставленный скрипт не требует sudoустановки. Это требует суперпользовательского исполнения и может использовать, sudoесли оно доступно. Если sudoнедоступно, скрипт должен быть запущен от имени пользователя root, иначе он будет запущен die.
Дж. М. Беккер
@darnir: Кроме того, на самом деле ничего не называется "простой сценарий". Почти все, кроме встроенных в оболочку, выполняется через обычные двоичные файлы. В этом весь смысл оболочки - вызывать другие команды, будь то интерактивные или автоматизированные. Именно эта определяющая характеристика отделяет оболочку от языков программирования общего назначения. Таким образом, независимо от того, как вы приобрели суперпользователя, вы делаете это с помощью внешних команд ... при условии, что вы не программируете с необработанными интерфейсами ядра.
Дж. М. Беккер
1
@varesa: Интересно, что Ubuntu является полной противоположностью в конфигурациях по умолчанию sudo / su. Вы можете проверить, какие разрешения sudo доступны пользователю, выполнив sudo -l. К сожалению, в этой ситуации он непригоден, так как может потребовать ввода пароля. Подумав об этом более тщательно, я на самом деле думаю, что всю концепцию лучше всего достичь с помощью тестирования на дистрибутиве. Использование, su -cесли не запущен suдистрибутив по умолчанию, в этом случае используется sudo su -c. Как уже упоминали другие, лучше всего оставить повышение прав суперпользователя для пользователя, я бы посчитал, что любой сценарий вокруг удобен.
Дж. М. Беккер
1
@varesa: я обновил вставленный скрипт, чтобы уменьшить вероятность использования ненастроенного sudo. Это должно выполняться правильно в большинстве дистрибутивов, при условии, что по умолчанию su/ sudoконфигурации. Я знаю, что устаревшую Ubuntu, pre lsb_release, нужно будет решить ... Но это действительно просто пример, и его, очевидно, можно расширить.
Дж. М. Беккер