извини, ты должен иметь tty для запуска sudo

13

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

Я выполнил эту команду, используя мою программу 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 без каких-либо изменений, то есть с настройками по умолчанию ?

AlwaysALearner
источник
1
Вот почему вы спрашивали довольно придуманную альтернативу для sudo ?
Slhck
6
Кажется дистрибутивным, если requirettyвключен по умолчанию. Согласно sudoсобственной документации он по умолчанию выключен.
mpy

Ответы:

3

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

-t force pseudo-tty allocation.

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

Спрашивай и учись
источник
1
Хотя такой подход может решить проблему с первого взгляда, совершенно не ясно, как он связан с вопросом. Не могли бы вы объяснить более подробно?
Пабук
1
+1 за решение проблемы без необходимости изменения каких-либо настроек по умолчанию.
Лука
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)

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

Мистер Айс
источник