Вибачте, ти повинен мати тти для запуску судо


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, ми маємо вказати свій власний пароль. Але це можна змінити, внісши наступну зміну в / etc / sudoers-

Defaults targetpw

Моє запитання: чи можна виконати мою вищевказану команду в java, не вносячи будь-яких змін, тобто встановивши налаштування за замовчуванням ?


1
Це чому ви запитували досить надуману Альтернативу для судо ?
slhck

6
Здається специфічним для дистрибутива, якщо requirettyвін включений за замовчуванням. Згідно sudoз власною документацією, це "за замовчуванням".
mpy

Відповіді:


3

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

-t force pseudo-tty allocation.

Це те, що я роблю, коли мені потрібно запустити команду як root над ssh (відключення прямого кореневого входу та tty, що вимагає sudo)


1
Хоча такий підхід міг би вирішити проблему з першого погляду, зовсім не ясно, як це пов’язано з цим питанням. Чи можете ви поясніть, будь ласка, детальніше?
пабук

1
+1 для вирішення проблеми, не потрібно змінювати налаштування за замовчуванням.
Лука

1

Моє запитання: чи можна виконати мою вищевказану команду в java, не вносячи будь-яких змін, тобто встановивши налаштування за замовчуванням?

sudo -u -S pwd

Коротка відповідь - ні, вам потрібно буде змінити налаштування, щоб отримати sudo, щоб робити речі інакше, ніж це відбувається зараз.

Судо може бути неправильним інструментом для цього. Правила Судо існують, щоб допомогти системним адміністраторам налаштувати спосіб отримання привілейованих привілеїв, які важко зловживати для отримання додаткових / ненавмисних привілеїв.

Якщо ви враховуєте, що для вас робить судо:

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

Якщо ви хочете, щоб ваша Java запускала довільні команди як довільні користувачі, не надаючи пароль ні тим, ні вашим власним, ви по суті заміняєте sudo. У такому випадку слід створити власні правила, як запобігти зловживанням.

В основному це два способи:

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

У випадку №1 ваша програма java виконує те, що робить судо, і вам слід застосувати свій власний набір правил для захисту від зловживань.

Існують інші програми, ніж судо для занять №2. Один приклад можна знайти на https://code.google.com/archive/p/exec-wrapper/downloads

Цей зручний скрипт оболонки створює програму C для запуску іншої команди (зазвичай це сценарій). Потім ви компілюєте програму C у двійковий файл і відзначаєте цей коренепід setuid або він може бути налаштований для будь-якого користувача. (режим: 4555 та власник: root)

Поки ви знаходитесь у файловій системі, яка це дозволяє, запуск бінарної програми запустить налаштовану команду як userid, який належить самій бінарній програмі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.