Sudo sobre SSH pasando una contraseña, no se requiere tty:
Puede usar sudo sobre ssh sin forzar a ssh a tener un pseudo-tty (sin el uso del interruptor ssh "-t") diciéndole a sudo que no requiera una contraseña interactiva y simplemente tome la contraseña del stdin. Para ello, utilice el interruptor "-S" en sudo. Esto hace que sudo escuche la contraseña en stdin y deje de escuchar cuando vea una nueva línea.
Ejemplo 1 - Comando remoto simple
En este ejemplo, enviamos un whoami
comando simple :
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Le estamos diciendo a sudo que no emita un aviso y que tome su entrada de stdin. Esto hace que la contraseña de sudo pase completamente silenciosa, por lo que la única respuesta que obtiene es la salida de whoami
.
Esta técnica tiene el beneficio de permitirle ejecutar programas a través de sudo sobre ssh que requieren la entrada de stdin. Esto se debe a que sudo está consumiendo la contraseña en la primera línea de stdin, y luego permite que cualquier programa que ejecute continúe agarrando stdin.
Ejemplo 2: comando remoto que requiere su propio stdin
En el siguiente ejemplo, el comando remoto "cat" se ejecuta a través de sudo, y estamos proporcionando algunas líneas adicionales a través de stdin para que se muestre el gato remoto.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
La salida demuestra que la <remote_sudo_password>
línea está siendo consumida por sudo, y que el gato ejecutado remotamente muestra las líneas adicionales.
Un ejemplo de dónde esto sería beneficioso es si desea usar ssh para pasar una contraseña a un comando privilegiado sin usar la línea de comando. Diga, si desea montar un contenedor cifrado remoto a través de ssh.
Ejemplo 3 - Montaje de un contenedor remoto VeraCrypt
En este script de ejemplo, estamos montando de forma remota un contenedor VeraCrypt a través de sudo sin ningún texto adicional:
#!/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
Cabe señalar que en todos los ejemplos de línea de comandos anteriores (todo excepto el script), la << EOF
construcción en la línea de comando hará que todo lo que se escriba, incluida la contraseña, se registre en la máquina local .bash_history. Por lo tanto, se recomienda encarecidamente que, para el uso en el mundo real, lo use completamente a través de un script, como el ejemplo de veracrypt anterior, o, si está en la línea de comando, coloque la contraseña en un archivo y redirija ese archivo a través de ssh.
Ejemplo 1a - Ejemplo 1 sin contraseña de línea de comandos local
El primer ejemplo se convertiría así:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Ejemplo 2a - Ejemplo 2 sin contraseña de línea de comandos local
y el segundo ejemplo sería:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Poner la contraseña en un archivo separado es innecesario si está poniendo todo en un script, ya que el contenido de los scripts no termina en su historial. Sin embargo, aún puede ser útil, en caso de que desee permitir que los usuarios que no deberían ver la contraseña ejecuten el script.
ssh <user@server> sudo <script>
, ya que llegaba el errorsudo: no tty present and no askpass program specified