
Я уже задавал этот вопрос вПереполнение стека, но меня попросили разместить его здесь. Так что делаю то же самое.
Я выполнил эту команду с помощью моей программы Java-
sudo -u <username> -S pwd
Я получил этот вывод-
command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo
Я пробовал редактировать /etc/sudoers, но он уже содержит
<username> ALL=(ALL) NOPASSWD: ALL
Затем я узнал, что это можно сделать, закомментировав следующий код в /etc/sudoers
# Defaults requiretty
Также, по умолчанию, при попытке выполнить команду от имени другого пользователя с помощью sudo
, мы должны предоставить свой собственный пароль. Но это можно изменить, внеся следующие изменения в /etc/sudoers-
Defaults targetpw
Мой вопрос:возможно ли выполнить мою команду выше в Java, не внося никаких изменений где-либо, т.е. имея настройки по умолчанию??
решение1
Я не знаю, как запускать команды оболочки в Java, но взгляните на опцию -t для команды ssh.
-t force pseudo-tty allocation.
Именно это я и делаю, когда мне нужно запустить команду как root через ssh (прямой вход root отключен, а tty требуется для sudo)
решение2
Мой вопрос: возможно ли выполнить мою команду выше в Java, не внося никаких изменений где-либо, т. е. имея настройки по умолчанию?
sudo -u -S пароль
Короткий ответ — нет, вам придется изменить настройки, чтобы заставить sudo выполнять действия иначе, чем сейчас.
sudo может быть неподходящим инструментом для этого. Правила sudo призваны помочь системным администраторам настроить способ получения повышенных привилегий, который будет трудно использовать для получения дополнительных/непреднамеренных привилегий.
Если вы задумаетесь о том, что делает для вас sudo:
- запрашивает пароль для подтверждения личности
- повысить привилегии
- затем по желанию получить привилегии другого пользователя
- журналы sudo, используемые для получения доступа или выполнения команд
Если вы хотите, чтобы ваша java запускала произвольные команды как произвольные пользователи, не предоставляя пароль ни для этих пользователей, ни для вашего собственного, вы по сути заменяете sudo. В этом случае вам следует создать свои собственные правила для предотвращения злоупотреблений.
По сути, это можно сделать двумя способами:
- запускайте Java с повышенными привилегиями и осторожно берите и возвращайте необходимые вам привилегии (см. вызовы функций setuid() seteuid() C).
- запустить внешнюю программу, чтобы получить повышенные привилегии, когда они вам нужны
В случае №1 ваша Java-программа сама выполняет то, что делает sudo, и вам следует реализовать собственный набор правил для защиты от злоупотреблений.
Существуют и другие программы, помимо sudo, для выполнения пункта 2. Один из примеров можно найти вhttps://code.google.com/archive/p/exec-wrapper/downloads
Этот удобный скрипт оболочки создает программу C для запуска другой команды (обычно скрипта). Затем вы компилируете программу C в двоичный файл и отмечаете этот setuid root или на самом деле он может быть setuid для любого пользователя. (режим :4555 и владелец: root)
Если ваша файловая система это позволяет, запуск двоичной программы приведет к выполнению настроенной команды от имени пользователя, которому принадлежит сама двоичная программа.