13

Я уже задавал этот вопрос в Stack Overflow, но меня попросили опубликовать его здесь. Так и поступаю так же.

Я выполнил эту команду, используя мою программу 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 с помощью sudo , мы должны предоставить наш собственный пароль. Но это можно изменить, сделав следующее изменение в /etc /sudoers-

Defaults targetpw

Мой вопрос, возможно ли выполнить вышеупомянутую команду в Java без каких-либо изменений, то есть с настройками по умолчанию?

2 ответа2

3

Я не знаю, как запускать команды оболочки в Java, но посмотрите опцию -t для команды ssh

-t force pseudo-tty allocation.

Это то, что я делаю, когда мне нужно запустить команду от имени пользователя root через ssh(прямое отключение учетной записи root и tty требуется для sudo)

1

Мой вопрос, возможно ли выполнить вышеупомянутую команду в Java без каких-либо изменений, то есть с настройками по умолчанию?

sudo -u -S pwd

Короткий ответ - нет, вам нужно изменить настройки, чтобы sudo делал что-то не так, как сейчас.

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

Если вы считаете, что sudo делает для вас:

  1. запрашивает пароль для подтверждения личности
  2. повысить привилегии
  3. затем при желании получить права как другой пользователь
  4. журналы sudo используют для получения доступа или запуска команд

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

Есть два основных способа сделать это:

  1. Запустите Java с повышенными привилегиями и тщательно извлекайте и возвращайте необходимые привилегии (см. вызовы функций setuid () seteuid () C).
  2. запустить внешнюю программу, чтобы получить повышенные привилегии, когда вы хотите их

В случае с # 1 ваша java-программа выполняет то же, что и sudo, и вы должны реализовать свой собственный набор правил для защиты от злоупотреблений.

Есть программы, отличные от sudo, для # 2. Один пример можно найти в https://code.google.com/archive/p/exec-wrapper/downloads

Этот удобный сценарий оболочки создает программу на C для запуска другой команды (обычно сценария). Затем вы компилируете программу на C в двоичный файл и отмечаете, что setuid root, или действительно, он может быть установлен для любого пользователя. (режим: 4555 и владелец: root)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .