Shell Script para iniciar sesión en un servidor ssh

29

Intenté escribir un script de shell que puede iniciar sesión automáticamente en un servidor ssh usando la contraseña que se menciona en el script. He escrito el siguiente código:

set timeout 30
/usr/bin/ssh -p 8484 [email protected]
expect 
{
   "[email protected]'s password" 
   {
      send "password\r" 
   }
}

Este código no se está ejecutando correctamente, todavía está pidiendo la contraseña. ¿Puede alguien ayudarme a resolver esto?

Pradeepchhetri
fuente
2
Relacionado: pasar contraseña a su / sudo / ssh
Piotr Dobrogost
serverfault.com/questions/241588/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

36

Una vez escribí un expectscript para iniciar sesión en un servidor ssh (como su caso) y mi script fue algo como esto:

#!/usr/bin/expect

spawn ssh [email protected]
expect "password"
send "MyPassword\r"
interact

Creo que tal vez interactfalta en tu guión.

saeedn
fuente
Esto está muy bien trabajando absolutamente para mí y estoy atascado en este lugar, interactúan proporciona terminal interactivo con el sistema, pero estoy tratando de automatizar aún más pasos gusta hacer cdy lsy leer el contenido del archivo también. ¿Es posible hacerlo después de interactuar? Responda
Hansiemithun
@Hansie puede enviar un lscomando después del inicio de sesión. Por ejemplo, después de enviar la contraseña, haga un expectcon el texto del símbolo del sistema (para asegurarse de haber iniciado sesión), luego send "ls\r". Todo esto va antes interact.
saeedn
la pregunta era ligeramente incorrecta y lo siento después de hacer ls y leer el contenido, puedo imprimir lo mismo. Pero cómo sacar eso de la sesión ssh en una variable para acceder desde la máquina local. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Pero la salida no funciona para mí. Mi pregunta publicada: stackoverflow.com/questions/51628465/… . Necesito file_listdespués de salir para acceder desde el símbolo del sistema local
Hansiemithun
31

Lo estás haciendo por el camino equivocado. Lo que desea hacer es generar un par de claves ssh sin contraseña y luego (siempre que el servidor admita la autenticación de clave RSA) puede ingresar sin tener que escribir una contraseña para todos. Este es un riesgo de seguridad si su clave privada se almacena en algún lugar donde podría ser robada.

Sigue estos pasos:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. prensa Return cuando se le solicite la frase de contraseña
  5. prensa Return una segunda vez para confirmar.

Ahora habrá dos archivos en su ~/.sshdirectorio, mysshkey.puby mysshkey. mysshkey.pubes su clave pública, esta es segura de poner en servidores remotos. mysshkeyes su clave privada sin contraseña, es no seguro para poner en servidores remotos (o alguna parte de otra persona podría obtener una copia).

En el servidor que desea SSH en:

  1. Inicie sesión en el servidor remoto
  2. mkdir -p ~/.ssh
  3. Copie y pegue el contenido de mysshkey.pub en~/.ssh/authorized_keys
  4. Asegúrese de que ~/.ssh/authorized_keyses chmod'd de600

Ahora, para ponerlo en acción en su máquina local, ejecute el siguiente comando:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

Y se iniciará sesión sin que se le solicite una contraseña.

Este es un método mucho más preferible para administrar inicios de sesión automáticos, ya que no termina codificando su contraseña en varios lugares que deben actualizarse si alguna vez la cambia.

sintetizadorpatel
fuente
2
Usaría claves RSA en lugar de DSA. Pero aparte de eso, totalmente de acuerdo.
glglgl
12
a veces no puede agregar claves al host remoto, por ejemplo, dispositivos de red.
DarkHeart
1
Intenté esto ssh todavía está pidiendo una contraseña. ¿Tiene que dar específicamente una dirección IP? Lo probé con <user> @ <domain-name> y solo con el nombre de dominio.
Jay Bienvenu
Este comando dijo demasiados argumentos? (para el paso 3)
Joseph Astrahan
Tuve que cambiar a ssh-keygen -t dsa e ingresar manualmente la ubicación del archivo.
Joseph Astrahan
20

En las distribuciones basadas en Debian, el sshpasspaquete proporciona una manera más fácil de hacer lo que desea. El paquete está disponible para muchas otras distribuciones populares. Primero debe configurarlo:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Luego invoque el comando SSH desde un script como este:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 [email protected]

Esto proporciona más flexibilidad, como si está utilizando una configuración regional diferente o necesita cambiar la contraseña, que las soluciones que utilizan expect.

likeitlikeit
fuente
7

Primero instale el sshPass sudo apt-get install sshpass

Luego cree un alias en el archivo .bashrc como

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Ahora vuelva a cargar su archivo .bashrc modificado por source ~/.bashrc

Ya has terminado.

Ahora puede ejecutar el ssh utilizando el alias creado anteriormente sshLoginen la terminal.

bpathak
fuente
5

puedes usar esto:

sshpass -p 'yourpassword'  ssh user@ip
Behrooz Mohamadi nasab
fuente
2

Todo lo que necesita para crear una clave hash y guardarla en su PC

Sólo tipo

ssh-keygen -t rsa -b 4096 # just press Enter till the end

luego ingrese

ssh-copy-id <user>@<server>

luego inicie sesión normalmente usando

ssh <user>@<server>

Ahora no necesitas una contraseña

Nota: Guardar su contraseña en un texto plano es peligroso

Este método está creando un valor hash de su contraseña utilizando RSA con clave pública de longitud 4096 que es muy segura.

Mohammad Hizzani
fuente
1
Esto parece ser una repetición de esta respuesta .
roaima
#roaima Sí, pero algo sugiere el ssh-copy-idcomando increíblemente útil , que nadie más mencionó. Lo estoy votando por eso.
Huw Walters
1

Inicio de sesión sin contraseña SSH utilizando SSH Keygen en 5 sencillos pasos :

Configuración del entorno: ingrese la descripción de la imagen aquí

Paso 1: Autenticación SSH-Kegen Keys en - (192.168.0.12)
Primero inicie sesión en el servidor 192.168.0.12 con un usuario y genere un par de claves públicas con el siguiente comando.

ingrese la descripción de la imagen aquí

Paso 2: Cree el directorio .ssh en - 192.168.0.11
Use SSH del servidor 192.168.0.12 para conectar el servidor 192.168.0.11 para crear el directorio .ssh debajo de él, utilizando el siguiente comando.

ingrese la descripción de la imagen aquí

Paso 3: Cargue las claves públicas generadas a - 192.168.0.11
Use SSH desde el servidor 192.168.0.12 y cargue la nueva clave pública generada (id_rsa.pub) en el servidor 192.168.0.11 en el .sshdirectorio del usuario como un nombre de archivo autorizado_keys.

ingrese la descripción de la imagen aquí

Paso 4: Establecer permisos en - 192.168.0.11
Debido a las diferentes versiones SSH en los servidores, necesitamos establecer permisos en.ssh directorio y el authorized_keysarchivo.

ingrese la descripción de la imagen aquí

Paso 5: Inicie sesión desde 192.168.0.12 a 192.168.0.11 Servidor sin contraseña
A partir de ahora podemos iniciar sesión en 192.168.0.11 como usuario sheena desde el servidor 192.168.0.12 como usuario tecmint sin contraseña.

ingrese la descripción de la imagen aquí

Premraj
fuente
Gracias ... esto funcionó para mí, excepto que en el paso 4 recibí una dramática "advertencia": "¡ARCHIVO DE CLAVE PRIVADA SIN PROTECCIÓN! ... ... /. Ssh / id_rsa 'están demasiado abiertos ... la clave privada será ignorado ... malos permisos ". Lo hice chmod 700 id_rsaen el directorio .ssh en el servidor local (cliente, es decir, 192.168.0.12 en su ejemplo): problema resuelto
mike rodent
2
Por favor , no publique imágenes de texto .
roaima
1

Como ya se describió en otras respuestas, también lo uso sshpasspero lo combino con elread comando para almacenar mi contraseña en una variable de entorno temporal. De esta manera, mi contraseña nunca se escribe en ningún lugar en claro. Aquí está el comando de una línea que uso:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Después de eso, debe ingresar su contraseña (no aparece nada en la pantalla) y luego presionar enter abrirá la conexión.

Piloto de tormenta
fuente
0

Hace poco hice esto, esto puede ayudarte:

sshpass -p 'password' username@ipaddress

Si esto no funciona, tendrá que generar claves en la otra máquina con la que desea conectarse

ssh-keygen

generará claves privadas y públicas y le pedirá una ubicación, déjelo en blanco, guardará las claves en la carpeta .ssh de forma predeterminada, le pedirá una frase de contraseña, también puede dejarlo vacío en la carpeta .ssh y cambiar el nombre de clave pública para 'autorizado_claves'

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

esto agregará el usuario a la lista ahora vaya al directorio de inicio y otorgue permiso y reinicie los servicios sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

ahora tendrá que mover la clave privada al sistema en esa ubicación desde donde va a ejecutar el comando ssh, luego podrá conectarse con

sshpass -p 'password' ssh -i id_rsa username@ip

si incluso eso no funciona, vaya a / etc / ssh, abra sshd_config con vim editor, verifique si pubkeyAuthenticatoin está activado o no, si no lo cambia a sí, reinicie los servicios sshd y luego pruébelo, definitivamente funcionará .

Utkarsh Gupta
fuente
0

El primer argumento es el nombre de host y el segundo es la contraseña.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Ejecución: ./script.expect

Shivam Mehrotra
fuente