GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puedo hacer que SSH use un programa askpass incluso si se ejecutó desde una terminal?

Esto será un poco más complicado, pero la combinación de varias piezas hará que funcione:

Explicación

  1. Para forzar ssh usar $SSH_ASKPASS programa, no puede permitir ssh para ver el verdadero tty . Es solo condición. Esto se puede hacer usando setsid y usando -n cambiar a ssh .

    Este caso iniciaría la conexión, pero no podría interactuar con el shell, que probablemente también sea su requisito;) (y también rompe su TTY local).

    Pero puedes renunciar a la "primera sesión". También debe agregar -N interruptor, que suprimirá el comando remoto y hará solo la autenticación .

    Además, la posible salida "basura" se puede redirigir a &> /dev/null si no te interesa.

  2. Configurar ControlMaster en ssh_config . Es una característica interesante y una vez que se establece la conexión, puede "iniciar" sesiones bastante rápido. Este fragmento en ~/.ssh/config debería hacer eso:

    ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p
    ControlMaster auto
    ControlPersist 5m
    

    Puede agregar eso en algunos host bloquear la lista de sus "candidatos lentos", o simplemente en todas partes. Casi no hay gastos generales.

Línea final

Entonces debería poder conectarse de esta manera al host que espera que le lleve un tiempo:

setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session

Todo el proceso podría simplificarse con alias o función bash haciendo ambas cosas en un solo paso, pero se deja en la imaginación de los lectores.

Solo argumentos de línea de comandos

Puede unir ambas cosas en la línea de comandos sin ssh_config parte:

setsid ssh -nNMS ~/.ssh/masters/%C host
# wait, insert password in the X11 prompt
ssh -S ~/.ssh/masters/%C host
# will bring you directly to your session

La siguiente función debería funcionar cuando no se especifican las opciones de SSH:

ssh() {
    if ! command ssh -o PasswordAuthentication=no "$1" true
    then
        setsid -w ssh -fnN "$1"
    fi
    command ssh "[email protected]"
}
  • -f indica a SSH que vaya al segundo plano justo antes de la ejecución del programa, que es después de obtener la contraseña.
  • -w le dice a setsid para esperar a que termine el programa. En este caso, eso sucede cuando SSH pasa a un segundo plano. Combinado con ssh -f , se puede eliminar la espera manual entre los dos comandos SSH.
  • La función asume que el primer argumento es el nombre de host.
  • La prueba es solo para evitar conexiones SSH innecesarias.

Un manual de SSH (man ssh ):

Si ssh no tiene un terminal asociado pero DISPLAY y SSH_ASKPASS están configurados, ejecutará el programa especificado por SSH_ASKPASS.

Por lo tanto, debe desasociar la terminal (por ejemplo, agregando una tubería) y asegurarse de que DISPLAY no está configurado (si desea usar la terminal para su frase de contraseña en su lugar).

Ejemplo sencillo:

echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...

Lo mismo con ssh-add :

$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory

Con OpenSSH 8.4 puede configurar $SSH_ASKPASS_REQUIRE variable de entorno a force . Citando la página man de ssh(1):

 SSH_ASKPASS_REQUIRE   Allows further control over the use of
                       an askpass program.  If this variable
                       is set to "never" then ssh will never
                       attempt to use one.  If it is set to
                       "prefer", then ssh will prefer to use
                       the askpass program instead of the TTY
                       when requesting passwords.  Finally, if
                       the variable is set to "force", then
                       the askpass program will be used for
                       all passphrase input regardless of
                       whether DISPLAY is set.

Dado que OpenSSH 8.4 se lanzó el 27 de septiembre de 2020, deberá esperar un poco para que esta función esté disponible en cualquier distribución importante de Linux.


Linux
  1. ¿Diferencia entre Systemd y el programa de inicio de terminal?

  2. Ssh:¿configurar los colores de la terminal de la máquina local para usar los de la máquina en la que entro Ssh?

  3. Linux:¿podemos obtener información del compilador de un binario Elf?

  4. Ssh:¿necesito un Tty para ejecutar Sudo si puedo Sudo sin contraseña?

  5. Cómo usar SSMTP para enviar un correo electrónico desde la terminal de Linux

Cómo usar la herramienta de compresión 7zip desde la terminal de Linux

¿Cómo enviar pulsaciones de teclas (f5) desde la terminal a un programa Gui?

¿Cómo puedo obtener la fecha y la hora actuales en la terminal y establecer un comando personalizado en la terminal para ello?

¿El programa lynx falla con 'No se puede acceder al archivo de inicio'?

¿Puedo recuperar un proceso nano de una terminal anterior?

¿Puede un programa decir que se está ejecutando bajo sudo?