modo corretto di sudo su ssh


150

Ho uno script che esegue un altro script tramite SSH su un server remoto usando sudo. Tuttavia, quando digito la password, viene visualizzata sul terminale. (Altrimenti funziona bene)

ssh user@server "sudo script"

Qual è il modo corretto per farlo in modo che io possa digitare la password per sudo su SSH senza che la password compaia mentre scrivo?


2
per quanto mi riguarda, il motivo per cercare un modo per superare ssh era che non funzionava quando provavo qualcosa del genere ssh <user@server> sudo <script>, poiché stavo ottenendo l'erroresudo: no tty present and no askpass program specified
knocte

Risposte:


244

Un altro modo è utilizzare l' -tinterruttore per ssh:

ssh -t user@server "sudo script"

Vedi man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
Bene, sapevo dell'opzione -t, ma non sapevo che funzionasse per i comandi sudo.

3
a cosa serve l'opzione -t?
Vince il


3
Qui non funziona: ssh -t localhost <<< "sudo touch file;"EDIT Apparentemente è importante che tu fornisca effettivamente il comando come parametro, non attraverso lo standard in (che ha senso col senno di poi).
Espiazione limitata

il -tmetodo mostrerà anche un output colorato di comandi che normalmente lo fanno.
karmakaze,

24

Sono stato in grado di automatizzarlo completamente con il seguente comando:

echo pass | ssh -tt user@server "sudo script"

vantaggi:

  • nessuna richiesta di password
  • non mostrerà la password nella cronologia bash della macchina remota

Per quanto riguarda la sicurezza: come ha detto Kurt , l'esecuzione di questo comando mostrerà la tua password nella cronologia bash locale ed è meglio salvare la password in un file diverso o salvare il comando all in un file .sh ed eseguirlo. NOTA: il file deve disporre delle autorizzazioni corrette in modo che solo gli utenti autorizzati possano accedervi.


8
Verrà visualizzato nella cronologia bash del sistema locale, inclusa la password. Meglio archiviare la password in un file e catalogare il file.
Kurt Fitzner,

4
Amico, lo sapevo -t, ma non avevo letto abbastanza attentamente il manuale per vedere che potresti passarlo due volte! Questo è quello che stavo cercando da mesi! Come aggiunta di sicurezza, ho semplicemente impostato una variabile password prima di eseguire read -s -p "Password: " pw, quindi l'ho fatto echo "$pw" | ..... L'ho ora trasformato in uno script utile per me :).
Kael

Ha funzionato come un incanto per me!
MiKr13,

Perché non configuri semplicemente sudo senza password per qualsiasi utente e comando specifico devi eseguire? Questo non è un problema SSH ...
nomen

@nomen anche la tua soluzione è valida, ma richiede passaggi aggiuntivi. Se ho molti dispositivi senza un utente sudo senza password, posso creare uno script di automazione usando questa soluzione. A volte lavori su un sistema che non possiedi e non vuoi o non puoi apportare modifiche, a volte ci sono altre considerazioni.
ofirule

6

Supponendo che non si desideri richiedere la password :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Esempio

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
Questo è / molto / pericoloso poiché la password in chiaro termina sulla riga di comando. Le righe di comando sono pubbliche e possono essere visualizzate da ogni altro utente e processo sul sistema. Ad esempio, "ps auxwwwww" di un utente non privilegiato mostrerà tutti i processi in esecuzione e le righe di comando che li hanno eseguiti.
Kurt Fitzner,

3
Per non parlare dell'inserimento della password (in chiaro) nel file bash_history.
Layne Bernardo,

5

Sudo su SSH passando una password, non è necessario:

Puoi usare sudo su ssh senza forzare ssh ad avere una pseudo-tty (senza l'uso dell'opzione ssh "-t") dicendo a sudo di non richiedere una password interattiva e di prendere la password da stdin. Puoi farlo usando l'opzione "-S" su sudo. Questo fa in modo che sudo ascolti la password su stdin e interrompa l'ascolto quando vede una nuova riga.

Esempio 1 - Comando remoto semplice

In questo esempio, inviamo un semplice whoamicomando:

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Stiamo dicendo a sudo di non inviare un prompt e di prendere il suo input da stdin. Questo rende la password sudo completamente silenziosa, quindi l'unica risposta che ricevi è l'output whoami.

Questa tecnica ha il vantaggio di consentire l'esecuzione di programmi tramite sudo su ssh che a loro volta richiedono input da stdin. Questo perché sudo sta consumando la password sulla prima riga di stdin, quindi lasciando che qualunque programma esegua continui a catturare stdin.

Esempio 2 - Comando remoto che richiede il proprio stdin

Nel seguente esempio, il comando remoto "cat" viene eseguito tramite sudo e stiamo fornendo alcune linee extra tramite stdin per la visualizzazione del gatto remoto.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

L'output dimostra che la <remote_sudo_password>linea viene consumata da sudo e che il gatto eseguito in remoto visualizza quindi le linee extra.

Un esempio di dove ciò sarebbe utile è se si desidera utilizzare ssh per passare una password a un comando privilegiato senza utilizzare la riga di comando. Ad esempio, se si desidera montare un contenitore crittografato remoto su SSH.

Esempio 3 - Montaggio di un contenitore VeraCrypt remoto

In questo script di esempio, stiamo montando in remoto un contenitore VeraCrypt tramite sudo senza alcun testo di richiesta aggiuntivo:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Va notato che in tutti gli esempi della riga di comando sopra (tutto tranne lo script) il << EOFcostrutto sulla riga di comando farà sì che tutto ciò che viene digitato, inclusa la password, sia registrato nella .bash_history della macchina locale . Pertanto, si consiglia vivamente di utilizzarlo interamente per il mondo reale tramite uno script, come nell'esempio di veracrypt sopra, oppure, se sulla riga di comando, inserire la password in un file e reindirizzare quel file tramite ssh.

Esempio 1a - Esempio 1 senza password della riga di comando locale

Il primo esempio sarebbe quindi:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

Esempio 2a - Esempio 2 senza password della riga di comando locale

e il secondo esempio diventerebbe:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Inserire la password in un file separato non è necessario se si inserisce tutto in uno script, poiché il contenuto degli script non finisce nella cronologia. Tuttavia, può essere utile nel caso in cui si desideri consentire agli utenti che non devono vedere la password di eseguire lo script.


Nel comando remoto ssh, perché è necessario eseguire cate reindirizzare i risultati su sudo? Puoi usare solo sudocome comando remoto principale ssh?
joanpau,

@joanpau L'iniziale catviene utilizzato per reindirizzare la password dell'utente sudo sull'altro lato. Se l'utente può eseguire sudo senza password, non è necessario, ma non suggerisco questa configurazione. Il motivo per cui viene reindirizzato è impedire la visualizzazione della password nella riga di comando del sistema remoto. Le righe di comando non sono sicure, qualsiasi utente può vedere tutte le righe di comando con ps auxwww.
Kurt Fitzner

Sto chiedendo catil comando in ssh cat \| sudo --prompt="" -S.... Se le -Sforze sudoper leggere la password da stdin, il gatto e la pipa sono assolutamente necessari? Il comando ssh potrebbe essere semplicemente sudo --prompt="" -S...?
joanpau,

@jonpau Quel comando cat sta prendendo stdin e lo sta inviando tramite sudo per passare la password sudo. Sta mostrando come è possibile reindirizzare la password sudo attraverso ssh tramite stdin in modo sicuro.
Kurt Fitzner,

1

Il modo migliore è ssh -t user@server "sudo <scriptname>", per esempio ssh -t user@server "sudo reboot". Richiederà prima la password per l'utente e poi il root (poiché stiamo eseguendo lo script o il comando con il privilegio di root.

Spero che abbia aiutato e chiarito i tuoi dubbi.



0
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost 
echo \"$varCommand\" | sudo bash

2
... e fornisci una spiegazione per il tuo codice.
pepato

-1

Ho affrontato un problema,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Poi ho provato con

#1
vim /etc/sudoers
Defaults:user1    !requiretty

non ha funzionato

#2
user1   ALL=(user2)         NOPASSWD: ALL

che ha funzionato correttamente!


Questo in realtà non realizza ciò che viene chiesto. L'idea è di richiedere ancora la password, ma consentirne la digitazione su ssh. Quello che hai fatto è stato appena dato all'utente1 pieno accesso sudo all'utente2 senza una password. Questo va bene per applicazioni specifiche, ma non è la migliore idea come soluzione generale.
Possum,

-7

A seconda del tuo utilizzo, ho avuto successo con quanto segue:

ssh root@server "script"

Ciò richiederà la password di root e quindi eseguirà il comando correttamente.


26
Yikes, SSH come root? Questa è una cattiva idea per ogni sorta di ragioni.
darkfeline,

12
Ricorda che ssh non è telnet. Non è più pericoloso ssh come root di quanto lo sarebbe ssh come un altro utente ed eseguire sudo. La tua password è crittografata allo stesso modo tramite la connessione SSH.
Stéphane,

22
Stéphane è assolutamente corretto per quanto riguarda la sicurezza della password. Tuttavia, utilizzando root anziché sudo, si perde la traccia di controllo che accompagna sudo. Inoltre, l'accesso root potrebbe non essere disponibile.
djeikyb,
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.