Respuesta de captura intentando conectarse para abrir SSH

1

Quiero poder intentar conectarme a un host mediante la autenticación de contraseña y almacenar la respuesta del servidor en una variable. Esto es para ver qué hosts en mi lista aceptan contraseñas para sus servicios ssh.

El problema es que no puedo redireccionar esta respuesta a una variable: Contraseña de root @ ip:

El objetivo es capturar "root @ ip's password:" como una cadena y almacenarla en una variable.

En cambio, el script se cuelga en la contraseña de root @ ip: y espera una entrada, lo que evita que el bucle continúe hasta la iteración.

Código:

#!/bin/bash

usernames=( root admin Administrator '' guest Anonymous )
response=

while read ip; do
    for user in "${usernames[@]}"; do
        response="$(ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no $user@$ip)" 
        printf "The response is $response"
    done
done <ssh_telnet_open_ip_list

Editar, el código se ha mejorado y esto es lo que tengo ahora:

#!/bin/bash
printf "\nProbing SSH services:\n\n"
while read ip; do
    printf "Response from $ip:\n"
    ssh -v root@$ip -o "StrictHostKeyChecking=no" -o "PreferredAuthentications=publickey" -I /dev/null 2>&1 | \
        grep "debug1: Authentications that can continue" | \
        cut -d : -f 3
    echo "------------------------------------------"
done <ssh_telnet_open_ip_list.txt

Salida de ejemplo:

Probing SSH services:

Response from ip:
 publickey,gssapi-with-mic,password
------------------------------------------
Response from ip:
------------------------------------------
Response from ip:
 publickey,password
------------------------------------------
Response from ip:
 publickey,gssapi-with-mic,password
------------------------------------------
Response from ip:
 publickey,gssapi-keyex,gssapi-with-mic,password
------------------------------------------
Response from ip:
 publickey,password

etc ...

    
pregunta Fingers 18.11.2018 - 17:30
fuente

2 respuestas

1

El comando

ssh -v user@ip -o "PreferredAuthentications=publickey" -I /dev/null 2>&1 | \
    grep "debug1: Authentications that can continue" | \
    cut -d : -f 3

La salida

publickey,gssapi-keyex,gssapi-with-mic,keyboard-interactive,hostbased

Cómo funciona

  • El comando SSH se conecta, pero solo usa la autenticación de clave pública, usando / dev / null como clave
  • El comando grep extrae la línea de registro con los cifrados admitidos
  • El comando de corte solo extrae los cifrados admitidos
  • Como la conexión SSH no se puede hacer sin una clave, se cierra, regresando del comando de inmediato

Cómo interpretar la salida

  • Si ve keyboard-interactive , es probable que se acepte la autenticación de contraseña
  • Si ve publickey , se acepta la autenticación basada en clave
respondido por el jrtapsell 18.11.2018 - 19:48
fuente
0

En bash, necesitarás un ayudante como sshpass para hacer esto. Puede ver esto detallado en la respuesta de @ CSPei a Pase una contraseña a ssh en bash puro en StackOverflow.

Probablemente obtendrías una implementación más limpia utilizando algo como Paramiko en Python. La llamada del Cliente generará una excepción más concisa para usted:

  

excepción paramiko.ssh_exception. BadAuthenticationType ( explicación ,    tipos )

     

Excepción generada cuando se usa un tipo de autenticación (como contraseña),   pero el servidor no está permitiendo ese tipo. (Sólo puede permitir   clave pública, por ejemplo.)

    
respondido por el gowenfawr 18.11.2018 - 18:09
fuente

Lea otras preguntas en las etiquetas