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

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

Host Home
User netmoon
Port 22
HostName test.com

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

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

  • Я не хочу использовать пару открытого / закрытого ключа.
74
задан 16 December 2011 в 11:38

12 ответов

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

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

Из man ssh-copy-id:

[F1]
40
ответ дан 25 May 2018 в 15:55
  • 1
    Это не работает, если удаленный администратор настаивает на отключении авторизации открытого ключа ... – tomasz 26 September 2014 в 02:36
  • 2
    Да, но быть реалистичным в системах под вашим полным контролем и контролем не идет на компромисс. Скажем, например, на виртуальной виртуальной машине без внешних подключений, используемых исключительно для целей разработки на одном месте. – Scott 30 October 2014 в 22:29
  • 3
    Настаивание на драконовской безопасности без причины также никогда не заканчивается хорошо. – cwallenpoole 23 December 2014 в 21:22
  • 4
    Иногда это заканчивается хорошо. – devth 22 September 2015 в 03:26
  • 5
    ИМХО, настойчивость паролей для аутентификации более рискованна. Я часто устанавливал часто используемые пароли для ssh в качестве переменных среды, поскольку я не хочу помнить набор произвольных строк. Требовав, чтобы пользователи вводили их, они просто просят их плохо хранить. – eggmatters 16 February 2016 в 21:32

Если вы действительно не хотите использовать пару открытого / закрытого ключа, вы можете написать скрипт 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-адресов (в примере предполагается, что это будет что-то вроде user@host, но пользовательская часть не используется большую часть времени), но основная идея все равно будет такой же. При изменении конфигурационного файла вы можете использовать другой файл конфигурации или использовать .ssh/config и написать свой собственный код для разбора этого файла и получения пароля для данного пользователя и хоста.

21
ответ дан 25 May 2018 в 15:55
  • 1
    можете ли вы объяснить дальше? – Netmoon 16 December 2011 в 12:29
  • 2
    @Netmoon Я добавил небольшой пример моего ответа на мой вопрос. – jcollado 18 December 2011 в 19:14
  • 3
    Это не отвечает на вопрос о том, как поместить пароль в файл .ssh / config – Eric Woodruff 18 March 2016 в 22:20
  • 4
    Действительно, он не отвечает на этот вопрос. Но это решает проблему: не нужно вводить пароли вручную и хранить их в файле. Это довольно то, что требует OP. – Arcesilas 30 April 2017 в 23:19

Для этого также существует sshpass программа. Как использовать: sshpass -p MyPa55word ssh me@myservor.com

15
ответ дан 25 May 2018 в 15:55
  • 1
    Если вы не предисловите вашу команду пробелом, (sshpass вместо sshpass), вы только что сохранили свой пароль («MyPa55word "») в файле истории вашей оболочки. – waltinator 29 June 2016 в 21:27
  • 2
    @waltinator хорошая точка – igor 16 September 2016 в 18:25
  • 3
    Хорошо, что вопрос об этом был прекрасен, когда он находился в .ssh/config, почему бы и в истории оболочек? – Darth Egregious 23 November 2017 в 22:48
  • 4
    Это не официально на Homebrew, но вы можете установить с стороннего репо с brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Подробнее: gist.github.com/arunoda/7790979 – Jacob Ford 18 January 2018 в 08:04
Нет. Это невозможно, я боюсь.

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

13
ответ дан 25 May 2018 в 15:55
  • 1
    потому что у меня нет разрешения на использование другого ключа на сервере. – Netmoon 15 December 2011 в 17:42
  • 2
    @Netmoon: Если вы можете войти в систему, вы можете добавить ключ, верно? Вам нужен только доступ на запись в ваш домашний каталог, если только системный администратор не установил вещи странным образом. – Scott Severance 20 December 2011 в 10:07
  • 3
    @ScottSeverance Я думаю, что это ситуация, на которую ссылается этот вопрос. Невозможно добавить ключ. Да, это странно, но это часто случается. – user239558 16 May 2013 в 20:16
  • 4
    У меня был очень распространенный опыт работы с общедоступными хостинговыми средами, где доступ к открытым ключам отключен, поэтому, даже если вы можете добавлять ключи, они не используются. это идет вразрез с да, но именно так многие хостинг-провайдеры создали свои серверы – billynoah 9 June 2014 в 19:01
  • 5
    Есть ответы, которые показывают, что это возможно – Eric Woodruff 18 March 2016 в 22:18

Как насчет ProxyCommand:

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

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

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p
10
ответ дан 25 May 2018 в 15:55
  • 1
    Он не будет работать, как ожидалось, с опцией -W. У вас есть обходное решение? – Toan Nguyen 9 May 2017 в 10:24
  • 2
    Он по-прежнему запрашивает у меня пароль с помощью этой прокси-команды ... – Victor Piousbox 4 November 2017 в 03:34

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

http://www.vandyke.com/products/securecrt/

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

У этого есть поддержка сложных настроек входа (или скриптов), сохраненных паролей (или сертификатов), вкладок нескольких сеансов и т. Д. [!d5 ]

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

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

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

4
ответ дан 25 May 2018 в 15:55
  • 1
    извините, я не понимаю. Вы можете объяснить ? – Netmoon 16 December 2011 в 12:38
  • 2
    переформулировано для вас .. – david6 16 December 2011 в 15:13
  • 3
    Начиная с публикации вышеупомянутого ответа было несколько итераций SecureCRT, включая последнюю версию VanDyke, выпущенную в начале декабря 2013 года. Каждая итерация улучшала программу, делая ее еще более универсальной. Он также имеет богатый API, который позволяет управлять программой или взаимодействовать с сценариями Python / VB. SecureCRT был частью моего основного инструментария в течение хорошего десятилетия, и я очень рекомендую его. – Ville 20 December 2013 в 03:15
  • 4
    Согласен. Я продолжаю бета-тестирование каждой новой версии и активно участвовал в раннем тестировании для портирования на Ubuntu . – david6 20 December 2013 в 04:36

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

#!/bin/bash

host=$1
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

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

Host foohost
    User baruser
    #Password foobarpassword
4
ответ дан 25 May 2018 в 15:55

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

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

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

1
ответ дан 25 May 2018 в 15:55

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

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

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
1
ответ дан 25 May 2018 в 15:55

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

хост может находиться где угодно в командной строке ssh; т.е. он также поддерживает синтаксис ssh <args> <host> <commands>, не затрудняет кодирование пути к ssh более надежный синтаксический разбор 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 "$@")


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


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
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
0
ответ дан 25 May 2018 в 15:55

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

Способ сделать это - зашифровать ваш пароль, используя ключ в дополнение к @Eric Woodruff ' s. proxyCommand.

Способ комбинирования - использовать 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
0
ответ дан 25 May 2018 в 15:55

Спасибо 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\",\$2; exit 1 } /#Password / && inhost { printf \"PASSWORD=%s\",\$2; } /^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 - переменная среды, содержащая ваш пароль.

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

0
ответ дан 9 October 2018 в 09:41

Другие вопросы по тегам:

Похожие вопросы: