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 whoami
comando:
$ 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 << EOF
costrutto 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.
ssh <user@server> sudo <script>
, poiché stavo ottenendo l'erroresudo: no tty present and no askpass program specified