scusa, devi avere un tty per eseguire sudo


13

Avevo già posto questa domanda in Stack Overflow , ma mi è stato chiesto di pubblicarla qui. Quindi fare lo stesso.

Ho eseguito questo comando usando il mio programma Java

sudo -u <username> -S pwd

Ho ottenuto questo risultato

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

Ho provato a modificare / etc / sudoers ma contiene già

<username>       ALL=(ALL)       NOPASSWD: ALL

Poi, ho imparato che questo può essere fatto commentando il seguente codice in / etc / sudoers

# Defaults requiretty

Inoltre, per impostazione predefinita, quando si tenta di eseguire un comando come un altro utente che utilizza sudo, è necessario fornire la propria password. Ma questo può essere modificato apportando la seguente modifica in / etc / sudoers-

Defaults targetpw

La mia domanda è: è possibile eseguire il comando precedente in java senza apportare alcuna modifica ovunque, ad esempio avendo le impostazioni predefinite ?


1
È per questo che stavi chiedendo l' alternativa piuttosto ingegnosa per sudo ?
slhck,

6
Sembra distro specifico se requirettyè abilitato per impostazione predefinita. Secondo sudola propria documentazione , è "spento di default".
mpy

Risposte:


3

Non so come eseguire i comandi di shell in Java ma dare un'occhiata all'opzione -t per il comando ssh

-t force pseudo-tty allocation.

Questo è ciò che faccio quando devo eseguire il comando come root su ssh (disabilitazione dell'accesso root diretto e tty richiesti da sudo)


1
Sebbene questo approccio possa risolvere il problema a prima vista, non è affatto chiaro come sia correlato alla domanda. Potresti spiegare per favore in maggiori dettagli?
pabouk,

1
+1 per risolvere il problema senza dover modificare le impostazioni predefinite.
Luca

1

La mia domanda è: è possibile eseguire il mio comando sopra in java senza apportare modifiche da nessuna parte, ad esempio avendo impostazioni predefinite?

sudo -u -S pwd

La risposta breve è no, dovrai cambiare le impostazioni per fare in modo che sudo faccia le cose diversamente da come è attualmente.

sudo potrebbe essere lo strumento sbagliato per questo. Le regole di Sudo sono lì per aiutare gli amministratori di sistema a configurare un modo per ottenere privilegi elevati che è difficile abusare di ottenere privilegi aggiuntivi / non intenzionali.

Se consideri cosa fa sudo per te:

  1. richiede la password per verificare l'identità
  2. elevare i privilegi
  3. quindi facoltativamente ottenere i privilegi come altro utente
  4. registra sudo utilizzare per ottenere l'accesso o eseguire comandi

Se si desidera che java esegua comandi arbitrari come utenti arbitrari senza fornire password per tali utenti o per i propri, si sta essenzialmente sostituendo sudo. In tal caso, dovresti creare le tue regole su come prevenire gli abusi.

Esistono sostanzialmente due modi per farlo:

  1. esegui java con privilegi elevati e prendi con cura e restituisci i privilegi di cui hai bisogno (vedi setuid () seteuid () chiamate di funzione C).
  2. eseguire un programma esterno per ottenere privilegi elevati quando li si desidera

Nel caso del # 1 il tuo programma java si sta comportando come fa sudo, e dovresti implementare il tuo set di regole per proteggerti dagli abusi.

Ci sono programmi diversi da sudo per fare # 2. Un esempio è disponibile in https://code.google.com/archive/p/exec-wrapper/downloads

Questo comodo script di shell crea un programma C per eseguire un altro comando (di solito uno script). Quindi si compila il programma C in un binario e si contrassegna quella radice setuid o in realtà potrebbe essere impostata su qualsiasi utente. (modalità: 4555 e proprietario: root)

Finché ci si trova su un filesystem che lo consente, l'esecuzione del programma binario eseguirà il comando configurato come userid che possiede il programma binario stesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.