¿Puedes establecer contraseñas en .ssh / config para permitir el inicio de sesión automático?

71

Estoy usando ubuntu 11.10. Estoy usando ssh para conectarme a muchos servidores diariamente, así que pongo sus parámetros en el archivo .ssh/config ; así:

Host Home
User netmoon
Port 22
HostName test.com

¿Hay alguna manera de poner contraseñas en este archivo para cada conexión? Entonces, cuando el servidor solicita una contraseña, la terminal pone su pase y lo envía al servidor.

Es porque a veces me paro de la pc y cuando regreso y escribo la contraseña, y presiono enter, la terminal dijo CONEXIÓN CERRADA.

  • No quiero usar un par de claves público / privado.
pregunta Netmoon 15.12.2011 - 12:36

11 respuestas

42

Cambiar la seguridad por conveniencia nunca termina bien ...

¿Podría usar ssh-copy-id del paquete openssh-client ?

de man ssh-copy-id :

ssh-copy-id is a script that uses ssh to log into a remote 
machine and append the indicated identity file to that 
machine's ~/.ssh/authorized_keys file.
    
respondido por el waltinator 20.12.2011 - 04:50
21

Si realmente no desea utilizar un par de claves público / privado, puede escribir un script expect para ingresar la contraseña automáticamente en función de la dirección de destino.

Editar: Lo que quiero decir es que puede tener un script que, por un lado, use expect para ingresar la contraseña y, por otro lado, lea la contraseña para un usuario y host dados desde una configuración archivo. Por ejemplo, la siguiente secuencia de comandos python funcionará para el escenario de día soleado:

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

y el formato del archivo de configuración sería el siguiente:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Nota: Como se explicó, el script python necesitaría ser mucho más complejo para manejar todos los posibles errores y mensajes de preguntas de ssh y todas las posibles URL (en el ejemplo se supone que será algo así como user@host , pero la parte del usuario no se usa la mayoría de las veces), pero la idea básica seguiría siendo la misma. Regading el archivo de configuración, puede usar un archivo de configuración diferente o usar .ssh/config y escribir su propio código para analizar ese archivo y obtener la contraseña para un usuario y host dados.

    
respondido por el jcollado 15.12.2011 - 14:26
15

No. Esto no es posible, me temo.

La única alternativa real es usar claves privadas pero has dicho que no quieres (¿por qué no?).

    
respondido por el Caesium 15.12.2011 - 12:40
15

También hay sshpass programa para eso. Cómo utilizar: sshpass -p MyPa55word ssh me@myservor.com

    
respondido por el igor 16.01.2014 - 14:58
12

¿Qué tal ProxyCommand:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

También puedes usar ssh -W en lugar de nc :

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p
    
respondido por el Eric Woodruff 10.06.2015 - 19:48
5

Puede crear un reemplazo sencillo de scripts en / usr / local / bin:

#!/bin/bash

host=
password='awk "/#Password/ && inhost { print \$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config'

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

Y luego en su archivo ~ / .ssh / config puede usar

Host foohost
    User baruser
    #Password foobarpassword
    
respondido por el Arek Burdach 26.09.2016 - 13:54
4

Utilizo una aplicación de VanDyke Software llamada SecureCRT .

enlace

No es gratis, pero tiene un precio muy razonable. Lo he usado durante años (corriendo en Windows o usando Wine) para acceso remoto, emulación de terminal y administración de red (dispersa). Finalmente lanzaron una versión nativa de Linux a principios de 2011.

Tiene soporte para configuraciones de inicio de sesión complejas (o scripts), contraseñas almacenadas (o certificados), múltiples sesiones con pestañas, etc.

Al inicio, puede elegir qué destino remoto (y protocolo) desde una lista estructurada (vista en árbol) de máquinas remotas (o locales) almacenadas, o simplemente crear una conexión (que luego se almacena).

Lo encontré particularmente útil para sitios remotos con autenticación avanzada, puertos no estándar o negociación de acceso a firewall.

Si realiza mucho acceso remoto (parte de su función principal), esta aplicación justificará su gasto en el primer mes de uso.

    
respondido por el david6 16.12.2011 - 06:37
1

La respuesta de @BrunoPereira a esta pregunta muestra un método alternativo para conectarse sin ingresar explícitamente una contraseña y evitar las claves ssh.

Puede crear un script, un alias o una función en su ~/.bashrc para ejecutar rápidamente ese comando.

Obviamente, hay consideraciones de seguridad que debe tener en cuenta con este enfoque.

    
respondido por el enzotib 15.12.2011 - 13:02
1

Respondiendo a la pregunta que hizo, no, no es posible configurar la contraseña predeterminada en el archivo de configuración de ssh.

Pero si de hecho, como dices " es porque a veces me paro de la pc y cuando regreso y escribo la contraseña, y presiono enter, la terminal dijo CONEXIÓN CERRADA. ", ¿por qué no? evitar el cierre de la sesión en su lugar? SSH puede mantener las conexiones vivas para usted.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
    
respondido por el Krzysztof Jabłoński 23.03.2018 - 11:05
0

Aquí está mi variación elaborada sobre la respuesta de @ ArekBurdach. Ofrece las siguientes extensiones:

  • el host puede estar en cualquier lugar de la línea de comandos ssh ; es decir, también admite la sintaxis ssh <args> <host> <commands>
  • no codifica la ruta a ssh
  • análisis más robusto de ssh_config
  • Bonificación: envoltorio para scp , también

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
 == "Password" && inhost { print  }
/^\s*Host\s/ {
    if ( in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
 == "Password" && inhost { print  }
/^\s*Host\s/ {
    if ( in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

Instalación

Defina alias en su ~/.bashrc :

alias ssh=ssh-wrapper
alias scp=scp-wrapper

Configuración

Con la directiva IgnoreUnknown , ssh no se queja de una nueva directiva Password introducida, por lo que (a diferencia de la respuesta de @ ArekBurdach), podemos hacer que esto aparezca como una configuración "real". Si no te gusta esto, es trivial cambiar la secuencia de comandos a la comentada.

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword
    
respondido por el Ingo Karkat 31.01.2017 - 16:44
0

Si no tiene acceso directo al par de claves, puede cifrar la contraseña en su máquina local.

La forma de hacerlo es encripta tu contraseña con la tecla además del ProxyCommand de @Eric Woodruff.

Una forma de combinar es usar tubería:

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

donde

Host real-destination
    Hostname test.com
    User netmoon
    
respondido por el Willian Z 02.04.2018 - 05:14

Lea otras preguntas en las etiquetas