Права sudo и их определение в скрипте

Всем доброго дня!

Новичок в линукс, столкнулся с такой проблемой. Устанавливаю IDE для разработки на паскале CodeTyphon (CT). Установочный скрипт CT вначале проверяет, имеет ли пользователь привилегии sudo, и выдает ошибку если пользователь их не имеет.

Я прочел разную информацию про sudo, и прошел по шагам инструкцию по установке CT, в которой сказано:

  1. открыть sudoers, набрав в терминале команду “sudo nano /etc/sudoers”
  2. затем добавить строку вида “username ALL=(ALL) NOPASSWD: ALL” в конец файла
  3. Сохранить измененный файл

Все сделал по инструкции, но код в установочном скрипте CT:


CAN_RUN_SUDO=$(sudo -n uptime 2>&1|grep "load"|wc -l)
if !  ${CAN_RUN_SUDO} -gt 0 ]
thenecho "Current user can NOT run the sudo command"
echo "To correct this problem:"
echo "1) Install sudo"
echo "2) Add current user to sudo list"
echo "   with root privileges"


exit

Упорно делает выдает ошибку и делает “exit”. Обращался на форум CT, там ничего не смогли сказать, что у меня не так. Подозреваю, что именно в проверке, которая в строке на “if”, что-то происходит не так, и скрипт не дает мне установить программу.

Убрав в проверке символ отрицания “!”, установка пошла, и CT в итоге запустился. Но все равно мучает вопрос, почему именно у меня такая проблема, которую пришлось решать отменяя проверку в установочном скрипте?

Вот ветка на форуме pilotlogic.com, в которой пытался узнать почему у меня не устанавливался их продукт:
https://pilotlogic.com/sitejoom/index.php/forum/installation-setup/5848-install-ct-7-70-on-opensuse-tumbleweed.html

Судя по форуму pilotlogic.com у других пользователей при установке программы таких проблем не было. Подскажите, почему у меня такая проблема?

Установка OpenSUSE Tumbleweed на VirtualBox абсолютно новая и чистая, ничего вроде не ломал и не настраивал.

Покажите полный протокол “sudo -n uptime”, включая саму команду и завершающую подсказку shell после окончания работы.

Я не совсем понимаю, что означает полный протокол, просто вставил эту команду в терминал, вот что она выдала:

osv@localhost:~> sudo -n uptime
sudo: a password is required
osv@localhost:~> su
Пароль:  
**localhost:/home/osv #** sudo -n uptime
 16:15:47  в работе  0:28,  3 пользователя, средняя загруженность: 0,95, 0,53, 0,27
**localhost:/home/osv #** 


Заодно покажу сразу еще пару моментов:

**localhost:/home/osv #** id osv
uid=1000(osv) gid=1000(osv) группы=473(wheel),1001(sudo),1000(osv)

osv@localhost:~> sudo nano /etc/sudoers

##
## User privilege specification
##
root ALL=(ALL:ALL) ALL

## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL:ALL) ALL

## Same thing without a password
%wheel ALL=(ALL:ALL) NOPASSWD: ALL

## Read drop-in files from /etc/sudoers.d
@includedir /etc/sudoers.d

osv ALL=(ALL) NOPASSWD: ALL


То, что вы сделали.

osv@localhost:~> sudo -n uptime
sudo: a password is required
osv@localhost:~> 

Поэтому проверка в вашем скрипте и не работает. Вы можете выполнить хоть одну команду используя “sudo -n”? Покажите полную выдачу как root

sudo -l -U osv

Лучше было бы “id -a” под вашим пользователем.

osv@localhost:~> sudo nano /etc/sudoers

User privilege specification

root ALL=(ALL:ALL) ALL

Uncomment to allow members of group wheel to execute any command

%wheel ALL=(ALL:ALL) ALL

Same thing without a password

%wheel ALL=(ALL:ALL) NOPASSWD: ALL

Read drop-in files from /etc/sudoers.d

@includedir /etc/sudoers.d

osv ALL=(ALL) NOPASSWD: ALL

Это полный файл? В openSUSE он по умолчанию несколько длиннее.

sudo -l -U osv

osv@localhost:~> sudo -l -U osv
Matching Defaults entries for osv on localhost:
    always_set_home, secure_path=/usr/sbin\:/usr/bin\:/sbin\:/bin\:/usr/local/bin\:/usr/local/sbin, env_reset, env_keep="LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME
    LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE", !insults

User osv may run the following commands on localhost:
    (ALL : ALL) NOPASSWD: ALL
    (ALL) NOPASSWD: ALL
    (ALL : ALL) ALL
osv@localhost:~>

sudo -l -U osv


osv@localhost:~> su
Пароль:  
**localhost:/home/osv #** sudo -l -U osv
Matching Defaults entries for osv on localhost:
    always_set_home, secure_path=/usr/sbin\:/usr/bin\:/sbin\:/bin\:/usr/local/bin\:/usr/local/sbin, env_reset, env_keep="LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME
    LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE", !insults

User osv may run the following commands on localhost:
    (ALL : ALL) NOPASSWD: ALL
    (ALL) NOPASSWD: ALL
    (ALL : ALL) ALL
**localhost:/home/osv #** 

id -a

osv@localhost:~> id -a
uid=1000(osv) gid=1000(osv) группы=1000(osv),473(wheel),1001(sudo)
osv@localhost:~>

Весь sudoers (не закомментированные строки):


Defaults always_set_home

Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/bin:/usr/local/sbin"
Defaults env_reset

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE"

Defaults !insults
root ALL=(ALL:ALL) ALL

%wheel ALL=(ALL:ALL) NOPASSWD: ALL

@includedir /etc/sudoers.d

osv ALL=(ALL) NOPASSWD: ALL
%sudo    ALL=(ALL:ALL) ALL

Если вы внимательно прочитает “man sudoers”, то увидите, что используется последняя строчка (более формально - последняя запись, которая применима к конкретным параметрам запуска sudo).

osv@localhost:~> id -a
uid=1000(osv) gid=1000(osv) группы=1000(osv),473(wheel),1001(**sudo**)
osv@localhost:~>

Весь sudoers (не закомментированные строки):

Defaults always_set_home

Defaults secure_path=“/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/bin:/usr/local/sbin”
Defaults env_reset

Defaults env_keep = “LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE”

Defaults !insults
root ALL=(ALL:ALL) ALL

%wheel ALL=(ALL:ALL) NOPASSWD: ALL

@includedir /etc/sudoers.d

osv ALL=(ALL) NOPASSWD: ALL
**%sudo ALL=(ALL:ALL) ALL
**

Эту строку я добавил в качестве эксперимента, пока искал и читал разные варианты побороть проблему по форумам. Что с этой строкой, что без нее скрипт установки показывал ошибку, и выходил по “exit”.

Когда Вы написали, что лучше привести полный файл sudoers, я и привел тот вариант, который изначально был (точнее его нижнюю, окончательную часть), и не работал:

osv@localhost:~> sudo nano /etc/sudoers


##
## User privilege specification
##
root ALL=(ALL:ALL) ALL


## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL:ALL) ALL


## Same thing without a password
%wheel ALL=(ALL:ALL) NOPASSWD: ALL


## Read drop-in files from /etc/sudoers.d
@includedir /etc/sudoers.d


osv ALL=(ALL) NOPASSWD: ALL

Т.е. без последней строчки, тоже было не все гладко.

Каюсь, “man sudoers” не читал, просто проходил шаг за шагом инструкцию, как установить CT, на сайте разработчика. И так как дело не пошло, попробовал искать информацию, и спрашивать специалистов, которые не первый день работают в системе.

Сейчас для эксперимента еще раз запущу установку, в соответствии с Вашей рекомендацией (без последней строчки), может я действительно запутался.

Попробовал еще раз, при настройке когда последняя строчка в sudoers

osv ALL=(ALL) NOPASSWD: ALL

И все равно проверка в скрипте установки не проходит.

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

https://i.ibb.co/k30Gt5L/suse.png
https://ibb.co/q09Dv7H

Уважаемые специалисты и модераторы, не в пику Suse будет сказано, повторил все те-же шаги на виртуальной машине с Mint, встало все без злополучной ошибки и вывода про права sodo и всего прочего.

Очень хочется, чтобы на Suse все прошло тоже без сучка и задоринки, очень уж понравилась система, дизайн приятный, YaST и прочие прелести…

ну так у вас sudo заработал без пароля или нет?
вообще, это странный, мягко говоря, инсталлятор, который требует дать полные права юзеру

судя по всему, не указан псевдоним рута, сделайте в ясте:

https://susepaste.org/images/99001970.png

Я, как бы это помягче сказать, настолько несведущ, что не понимаю как проверить работу sudo без пароля.

По второму Вашему совету, который про YaST, проверю сейчас.

ну так вся идея в том, чтобы запустить что-нибудь, хотя бы

sudo ls

и оно не спрашивало пароль

Да, пароль не спрашивает.

osv@localhost:~> sudo ls
 bin   CodeTyphonIns   CodeTyphonIns.zip   eclipse   eclipse-workspace   tmp   Видео   Документы   Загрузки   Изображения   Музыка   Общедоступные  'Рабочий стол'   Шаблоны
osv@localhost:~>

А где в YaST сделать такие настройки? У меня нет пункта sudo в “Безопасность и пользователи”:

sudo zypper in yast2-sudo

Потому что скрипт ищет в выдаче uptime строчку load, а у вас выдача на русском языке:

Перед запуском скрипта установите переменную окружения LANG в значение C.

При чем здесь модераторы?

Нашел в интернет, как установить переменную окружения, но не уверен, что сделал правильно.

export VAR="C"

Затем смотрю, поменялась ли она:

osv@localhost:~/CodeTyphonIns> printenv LANG
ru_RU.UTF-8

Видимо нет, или я что-то не так понял, или установил неправильно.

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

Спасибо, догадывался, что в YaST чего-то не хватает, но не знал как добавить.