Можете ли вы установить пароли в .ssh / config, чтобы разрешить автоматический вход в систему?

74

Я использую ubuntu 11.10. Я использую ssh для ежедневного подключения ко многим серверам, поэтому я помещаю их параметры в файл .ssh/config ; например:

Host Home
User netmoon
Port 22
HostName test.com

Есть ли способ установить пароли в этом файле для каждого соединения? Поэтому, когда сервер запрашивает пароль, терминал ставит свой проход и отправляет его на сервер.

Это потому, что иногда я стою далеко от компьютера, и когда я возвращаюсь и набираю пароль, и нажимаю enter, терминал говорит CONNECTION CLOSED.

  • Я не хочу использовать пару открытого / закрытого ключа.
задан Netmoon 15.12.2011 в 12:36
источник

12 ответов

44

Торговля с безопасностью для удобства никогда не заканчивается хорошо ...

Не можете ли вы использовать ssh-copy-id из пакета openssh-client ?

От 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.
    
ответ дан waltinator 20.12.2011 в 04:50
источник
23

Если вы действительно не хотите использовать пару открытого / закрытого ключа, вы можете написать скрипт expect , чтобы автоматически вводить пароль в зависимости от адреса назначения.

Изменить: я имею в виду, что у вас может быть сценарий, который, с одной стороны, использует expect для ввода пароля для вас и, с другой стороны, считывает пароль для данного пользователя и хоста из конфигурации файл. Например, следующий сценарий python будет работать в сценарий солнечного дня:

#!/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)

и формат файла конфигурации будет выглядеть следующим образом:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Примечание. Как объяснялось, скрипт python должен быть намного сложнее обрабатывать все возможные ошибки и сообщения вопросов из ssh и всех возможных URL-адресов (в примере предполагается, что это будет что-то вроде [email protected] , но часть пользователя больше не используется), но основная идея все равно будет такой же. При изменении конфигурационного файла вы можете использовать другой файл конфигурации или использовать .ssh/config и написать свой собственный код для разбора этого файла и получения пароля для данного пользователя и хоста.

    
ответ дан jcollado 15.12.2011 в 14:26
16

Для этого также существует sshpass . Как пользоваться: sshpass -p MyPa55word ssh [email protected]

    
ответ дан igor 16.01.2014 в 14:58
15

Нет. Это невозможно, я боюсь.

Единственная реальная альтернатива - использовать секретные ключи, но вы сказали, что не хотите (почему бы и нет?).

    
ответ дан Caesium 15.12.2011 в 12:40
14

Как насчет ProxyCommand:

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

Вы можете использовать ssh -W вместо nc :

ProxyCommand sshpass -pmypass ssh [email protected]%h-raw -W localhost:%p
    
ответ дан Eric Woodruff 10.06.2015 в 19:48
6

Вы можете создать простую замену скрипта ssh в / usr / local / bin:

#!/bin/bash

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

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

И затем в вашем файле ~ / .ssh / config вы можете использовать

Host foohost
    User baruser
    #Password foobarpassword
    
ответ дан Arek Burdach 26.09.2016 в 13:54
4

Я использую приложение из программного обеспечения VanDyke под названием SecureCRT .

Ссылка

Это не бесплатная, но очень разумная цена. Я использовал его в течение многих лет (работает в Windows или с помощью Wine) для удаленного доступа, эмуляции терминала и (распределенного) сетевого управления. Наконец, в начале 2011 года они выпустили родную версию Linux.

Он поддерживает сложные параметры входа в систему (или скрипты), сохраненные пароли (или сертификаты), множественные сеансы с вкладками и т. д.

При запуске вы можете выбрать удаленный объект (и протокол) из структурированного списка (древовидное представление) сохраненных удаленных (или локальных) компьютеров или просто создать соединение (которое затем сохраняется).

Я нашел его особенно полезным для удаленных сайтов с расширенной аутентификацией, нестандартными портами или согласованием доступа к межсетевому экрану.

Если вы делаете удаленный доступ много (часть своей основной роли), то это приложение будет оправдывать его расходы в первый месяц использования.

    
ответ дан david6 16.12.2011 в 06:37
1

Отвечая на заданный вами вопрос, нет необходимости настраивать пароль по умолчанию в конфигурационном файле ssh.

Но если действительно, как вы говорите: « Это потому, что иногда я стою от компьютера, а когда я возвращаюсь и набираю пароль, и нажимаю enter, терминал говорит CONNECTION CLOSED. », то почему предотвратить закрытие сеанса? SSH может поддерживать связь для вас.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
    
ответ дан Krzysztof Jabłoński 23.03.2018 в 11:05
1

Ответ @BrunoPereira на этот вопрос показывает альтернативный метод подключения без явного ввода пароля и исключения ключей ssh.

Вы можете создать скрипт, псевдоним или функцию в ~/.bashrc , чтобы быстро выполнить эту команду.

Очевидно, есть соображения безопасности, которые вы должны учитывать при таком подходе.

    
ответ дан enzotib 15.12.2011 в 13:02
0

Если у вас нет прямого доступа к паре ключей, вы можете зашифровать пароль на своей локальной машине.

Способ сделать это зашифруйте свой пароль с помощью ключа в дополнение к прокси-команде @Eric Woodruff.

Способ объединения состоит в использовании pipe:

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

где

Host real-destination
    Hostname test.com
    User netmoon
    
ответ дан Willian Z 02.04.2018 в 05:14
0

Спасибо Arek за вдохновение ...

Вместо запуска другого процесса оболочки это просто функция, запущенная в текущей оболочке bash. Он запускает одиночный awk для анализа файла конфигурации и выясняет, следует ли брать пароль из переменной оболочки или из файла, написанного с помощью пароля, в файл конфигурации ssh (с awk в eval вместо описания из-за проблем, с которыми я сталкивался, используя описание). Я пробовал так много способов использования sshpass непосредственно в конфигурационном файле ssh с помощью ProxyCommand, но ничего не работало так, как ожидалось, за исключением случаев, когда я мог входить в ящик через rsa, но затем мне нужно было отправить пароль для открытия моего зашифрованного каталога.

function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/#Passvar / && inhost { printf \"PASSVAR=%s\",\; exit 1 } /#Password / && inhost { printf \"PASSWORD=%s\",\; } /^Host / && inhost { inhost=0; exit 1 } /^Host $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}

Затем раздел ~/.ssh/config выглядит следующим образом:

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

Если в разделе конфигурации присутствует #Passvar , это переопределяет #Password .
$MYPASS_ENVVAR - это переменная среды, содержащая ваш пароль.

Наслаждайтесь!

    
ответ дан MerryDan 28.09.2018 в 16:07
0

Вот моя сложная вариация в ответе @ ArekBurdach. Он предлагает следующие расширения:

  • хост может находиться где угодно в командной строке ssh ; то есть он также поддерживает синтаксис ssh <args> <host> <commands>
  • не жестко кодирует путь к ssh
  • более strong анализ ssh_config
  • Бонус: обертка для scp , тоже

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
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "[email protected]")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "[email protected]"
else
    "$(which ssh)" "[email protected]"
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
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "[email protected]")


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

Установка

Определите псевдонимы в ~/.bashrc :

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

Конфигурация

С директивой IgnoreUnknown ssh не жалуется на недавно введенную директиву Password , поэтому (в отличие от ответа @ ArekBurdach) мы можем сделать это как «реальную» конфигурацию. Если вам это не нравится, тривиально изменить сценарий на закомментированный.

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

Host foohost
    User baruser
    Password foobarpassword
    
ответ дан Ingo Karkat 31.01.2017 в 16:44