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

93

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

Host Home
User netmoon
Port 22
HostName test.com

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

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

PS Я не хочу использовать пару открытый / закрытый ключ.

Netmoon
источник
1
Я в той же ситуации, и я не могу загрузить свой открытый ключ, потому что у меня есть доступ по SSH только для SVN. То есть, если я пытаюсь получить ssh svnhost, то получаю "(success (2 2 () (edit-pipeline svndiff1 отсутствующие записи commit-revprops глубина log-revprops частичное воспроизведение)))" ответ svnserve, а не оболочка
Uberto
См. Unix.stackexchange.com/a/83991/26493 и andre.frimberger.de/index.php/linux/…, чтобы узнать, как их использовать SSH_ASKPASS.
Олаф Дитче

Ответы:

56

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

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

От man ssh-copy-id:

ssh-copy-id - это скрипт, который использует ssh для входа на удаленный компьютер и добавления указанного идентификационного файла в файл ~ / .ssh / authorized_keys этого компьютера.

waltinator
источник
12
Это не работает, если удаленный администратор настаивает на отключении авторизации с открытым ключом ...
tomasz
2
Да, но реалистичность в системах, находящихся под вашим непосредственным наблюдением и контролем, не делает компромисс. Скажем, например, на бродячей виртуальной машине без внешних подключений, используемых исключительно для целей разработки на одном рабочем месте.
Скотт
36
Настаивать на драконовской безопасности без причины также никогда не заканчивается хорошо.
cwallenpoole
6
Иногда это хорошо кончается.
Девятого
3
ИМХО, настоящие пароли для аутентификации - это больше риска, чем нет. Я часто устанавливаю часто используемые пароли для ssh в качестве переменных окружения, так как не хочу вспоминать набор произвольных строк. Требуя, чтобы пользователи вводили их, просто просили, чтобы они были плохо сохранены.
eggmatters
26

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

jcollado
источник
можешь объяснить дальше?
Netmoon
@ Netmoon Я добавил небольшой пример к своему ответу, чтобы он стал понятнее.
Jcollado
Это не отвечает на вопрос о том, как поместить пароль в файл .ssh / config
Эрик Вудрафф,
1
Действительно, это не отвечает на этот вопрос. Но это решает проблему: не нужно вводить пароли вручную и сохранять их в файле. Что довольно, что требует ОП.
Arcesilas
19

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

игорь
источник
29
Если вы не указали в своей команде пробел ( sshpassвместо sshpass), вы просто сохранили свой пароль («MyPa55word») в файле истории вашей оболочки.
вальтинатор
1
@waltinator хорошая точка зрения
игорь
3
Ну, спрашивающий вопрос был в порядке с этим .ssh/config, почему не в истории оболочки тоже?
Дарт Egregious
Официально это не на Homebrew, но вы можете установить его из стороннего репозитория brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Больше: gist.github.com/arunoda/7790979
Джейкоб Форд
read -s password; sshpass -p "$password" ssh me@myservor.com, Это предотвратит появление пароля в истории
Alexander Bird
19

Как насчет 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
Эрик Вудрафф
источник
Это не будет работать, как ожидается, с -Wопцией. У вас есть обходной путь?
Тоан Нгуен
2
Он все еще спрашивает у меня пароль с этой прокси-командой ...
Victor Piousbox
1
Я также нахожу это все еще просит пароль. Кажется, все, что нужно сделать, это перевести проблему с test.comзапроса пароля на Homeзапрос пароля. В чем смысл? Какой трюк, чтобы заставить его работать?
Мартин Брамвелл
15

Боюсь, это невозможно.

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

цезий
источник
7
потому что у меня нет разрешения поставить другой ключ на сервере.
Netmoon
2
@ Netmoon: Если вы можете войти, вы можете добавить ключ, верно? Вам нужен только доступ на запись к вашему домашнему каталогу, если только системный администратор не настроит что-то странное.
Скотт Северанс
4
@ ScottSeverance Я думаю, что это ситуация, к которой относится этот вопрос. Не имея возможности добавить ключ. Да, это странно, но это часто случается.
user239558
5
У меня был очень распространенный опыт использования сред общего хостинга, где доступ с открытым ключом отключен, поэтому, даже если вы можете добавлять ключи, они не используются. это идет вразрез с разумом, да, но именно так многие хостинг-провайдеры настраивают свои серверы
billynoah
1
Есть ответы, которые показывают, что это возможно
Эрик Вудрафф
8

Вы можете создать простую замену сценария 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

Я использую приложение от VanDyke Software под названием SecureCRT .

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

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

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

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

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

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

david6
источник
извини я не понимаю Вы можете объяснить ?
Netmoon
1
переписано для вас ..
Давид6
2
Со времени публикации вышеупомянутого ответа было несколько итераций SecureCRT, включая последнюю, выпущенную VanDyke в начале декабря 2013 года. Каждая итерация улучшала программу, делая ее еще более универсальной. Он также имеет богатый API, который позволяет управлять программой / взаимодействовать со скриптами Python / VB. SecureCRT был частью моего основного инструментария в течение доброго десятилетия, и я очень рекомендую его.
Ville
Согласовано. Я продолжаю бета-тестирование каждого нового релиза и активно участвовал в раннем тестировании для портирования на Ubuntu .
david6
2

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

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

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
Кшиштоф Яблонский
источник
1

Спасибо, Арек за вдохновение ...

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

Я пробовал так много способов использования sshpassнапрямую в sshконфигурационном файле с помощью ProxyCommand, но, похоже, ничего не работало, как ожидалось, кроме случаев, когда я мог войти в ящик через RSA. Но тогда мне нужно было отправить пароль, чтобы открыть мой зашифрованный каталог. Тем не менее, моя функция ниже, кажется, работает для меня во всех случаях, даже для Cygwin.

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $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
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

Тогда ~/.ssh/configраздел выглядит так:

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

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

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

MerryDan
источник
1

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

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

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

enzotib
источник
Замечательно, что вы ссылаетесь на решение, но также полезно и опубликовать решение здесь. Таким образом, если ссылка когда-либо удаляется (как иногда происходит при обмене стека), здесь все еще можно найти подходящий ответ.
Пол
0

Вот мой сложный вариант ответа @ 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

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

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

Способ комбинирования - использование трубы:

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
Виллиан Z
источник
0

В блоге описан небольшой вариант способа использования, sshpass который можно найти здесь . Учитывая, что у вас есть зашифрованный паролем файл gpg (как это описано в блоге), вы можете сделать что-то вроде этого:

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

и просто сохраните эту команду как псевдоним в вашем .bashrc.

Если вы хотите туннелировать через это соединение, вы можете сделать что-то вроде

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
ricffb
источник