SSH: esegue il comando sudo


45

Ho uno script di shell interattivo, che in un punto deve ssh su un'altra macchina (basata su Ubuntu) ed eseguire qualcosa come root (l'utente dovrebbe inserire la sua password, ma il comando remoto dovrebbe essere eseguito come indicato nello script):

# ...
ssh remote-machine 'sudo ls'
# ...

Tuttavia, ricevo sempre questo messaggio di errore:

sudo: no tty present and no askpass program specified

OK, è abbastanza chiaro. Ma come posso eludere questo? Dovrebbe succedere qualcosa del genere:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

Risposte:


52

Il meraviglioso sshha una cura per tutto. Il punto è aggiungere il -tflag per forzare ssh ad allocare una pseudo-tty:

ssh -t remote-server 'sudo ls'

1
I PTY possono comunque rovinare le cose con gli script. lsl'output conterrà le terminazioni \ r \ n per esempio.
Tobu,

1
Il modo più semplice è quello di forzare ls in modalità non terminale. ls | catlo farà - vedrà che stdout è una pipe. In questa domanda specifica, questo non è rilevante, poiché apparentemente è progettato per essere eseguito in modo interattivo da un terminale, quindi probabilmente vuoi colonne e colori e quant'altro.
Gabe,

0

Questo metodo eseguirà un singolo script usando sudo dopo ssh:

Supponiamo di avere un utente "remoto" con funzionalità sudo e abbiamo uno script che vogliamo che venga eseguito come root.

1) Imposta uno script in / etc / passwd da usare al login:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) All'interno di "login.sh", eseguiamo lo script che vogliamo eseguire come "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Normalmente chiederà due volte la password: ssh login + sudo. Se si desidera inserirlo solo una volta, provare sudo senza password (non consigliato). <- leggi il commento di Boldewyn.

Il vantaggio principale è che "ssh" non richiede altri parametri (as -t) e sudo è forzato sul lato server. Inoltre, una volta terminato lo script, anche l'utente viene disconnesso.

Potrebbe non essere così elegante, ma è semplice e funziona.


Uh Oh. Mettere l'utente remoto nel sudoersfile su un server come questo è una catastrofe in attesa di accadere. Se qualcuno ottiene l'accesso come utente (ad es. Tramite il server Web), può immediatamente diventare root. Grazie, ma cercavo soluzioni che non mettessero in conflitto la configurazione del mio server. Se avessi una soluzione, che in qualche modo riutilizza magicamente l'autenticazione da SSH per il sudocomando, sarei più interessato (e forse inizierei a cercare sostituzioni per SSH ...).
Boldewyn,

@Boldewyn: sì, l'impostazione "sudo senza password" ha quel rischio per la sicurezza ... è un passaggio facoltativo. Sono d'accordo con te, se SSH potesse riutilizzare l'autenticazione, questo tipo di "soluzioni" non sarebbe richiesto. Grazie per il tuo commento.
lepe,

-1

È possibile eseguire il comando seguente per ottenere l'accesso come root senza interattività:

ssh server " sudo command" < sudopassword.txt

1
Non funzionerà perché stdin non sarà un dispositivo terminale (leggerà dal file specificato).
Anthony G - giustizia per Monica
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.