désolé, vous devez avoir un tty pour exécuter sudo


13

J'avais déjà posé cette question dans Stack Overflow , mais on m'a demandé de la poster ici. Faire de même.

J'ai exécuté cette commande en utilisant mon programme java-

sudo -u <username> -S pwd

J'ai cette sortie-

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

J'ai essayé d'éditer / etc / sudoers mais il contient déjà

<username>       ALL=(ALL)       NOPASSWD: ALL

Ensuite, j'ai appris que cela peut être fait en commentant le code suivant dans / etc / sudoers

# Defaults requiretty

De plus, par défaut, lorsque nous tentons d'exécuter une commande en tant qu'autre utilisateur sudo, nous devons fournir notre propre mot de passe. Mais cela peut être changé en faisant le changement suivant dans / etc / sudoers-

Defaults targetpw

Ma question est, est-il possible d'exécuter ma commande ci-dessus en java sans apporter de modifications n'importe où, c'est-à-dire en ayant des paramètres par défaut ?


1
Est-ce pour cela que vous demandiez l' alternative plutôt artificielle pour sudo ?
slhck

6
Semble spécifique à la distribution si requirettyest activé par défaut. Selon sa sudopropre documentation, il est "désactivé par défaut".
mpy

Réponses:


3

Je ne sais pas comment exécuter les commandes shell en Java, mais regardez l'option -t pour la commande ssh

-t force pseudo-tty allocation.

C'est ce que je fais lorsque j'ai besoin d'exécuter la commande en tant que root sur ssh (désactivation de la connexion root directe et tty requis par sudo)


1
Bien que cette approche puisse résoudre le problème à première vue, on ne sait pas du tout comment elle est liée à la question. Pourriez-vous s'il vous plaît expliquer plus en détail?
pabouk

1
+1 pour résoudre le problème sans avoir à modifier les paramètres par défaut.
Luke

1

Ma question est, est-il possible d'exécuter ma commande ci-dessus en java sans apporter de modifications n'importe où, c'est-à-dire en ayant des paramètres par défaut?

sudo -u -S pwd

La réponse courte est non, vous devrez modifier les paramètres pour que sudo fasse les choses différemment de ce qu'il fait actuellement.

sudo n'est peut-être pas le bon outil pour cela. Les règles de Sudo sont là pour aider les administrateurs système à configurer un moyen d'obtenir des privilèges élevés qu'il est difficile d'abuser pour obtenir des privilèges supplémentaires / involontaires.

Si vous considérez ce que sudo fait pour vous:

  1. demande un mot de passe pour vérifier l'identité
  2. élever les privilèges
  3. puis obtenir éventuellement des privilèges en tant qu'autre utilisateur
  4. journaux sudo utiliser pour accéder ou exécuter des commandes

Si vous voulez que votre java exécute des commandes arbitraires en tant qu'utilisateurs arbitraires sans fournir de mot de passe à ces utilisateurs ou aux vôtres, vous remplacez essentiellement sudo. Dans ce cas, vous devez créer vos propres règles pour éviter les abus.

Il existe essentiellement deux façons de procéder:

  1. exécutez votre java avec des privilèges élevés et prenez et redonnez soigneusement les privilèges dont vous avez besoin (voir appels de fonction setuid () seteuid () C).
  2. exécuter un programme externe pour obtenir des privilèges élevés lorsque vous les souhaitez

Dans le cas # 1, votre programme java exécute lui-même ce que fait sudo, et vous devez implémenter votre propre ensemble de règles pour vous protéger des abus.

Il existe des programmes autres que sudo pour faire # 2. Un exemple peut être trouvé dans https://code.google.com/archive/p/exec-wrapper/downloads

Ce script shell pratique crée un programme C pour exécuter une autre commande (généralement un script). Ensuite, vous compilez le programme C en un binaire et marquez cette racine setuid ou vraiment il pourrait être setuid à n'importe quel utilisateur. (mode: 4555 et propriétaire: root)

Tant que vous êtes sur un système de fichiers qui le permet, l'exécution du programme binaire exécutera la commande configurée en tant qu'ID utilisateur propriétaire du programme binaire lui-même.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.