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

Я не мог использовать ответ Митча, потому что хотел установить Ubuntu минимально, а образ ISO не работал (vmlinuz нет). Поэтому вместо этого я адаптировал его для использования NetbootInstall

Я поместил загруженные файлы в / boot / netboot и добавил следующую запись в конфигурацию grub:

menuentry "NetInstall" {
    linux (hd0,0)/boot/netboot/ubuntu-installer/amd64/linux
    initrd (hd0,0)/boot/netboot/ubuntu-installer/amd64/initrd.gz
}

I затем забыл запустить

sudo update-grub

, поэтому мне пришлось снова загрузиться в существующий linux, но, наконец, обновив grub, фактическая установка прошла очень гладко.

83
задан 14.12.2019, 22:15

12 ответов

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

  • хост может находиться в любом месте командной строки ssh; то есть он также поддерживает синтаксис ssh <args> <host> <commands>
  • не жестко кодирует путь к ssh
  • более надежному анализу ssh_config
  • Bonus: обертка для [ 118]

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
ответ дан 14.12.2019, 22:16

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

Вместо запуска другого процесса оболочки это просто функция, выполняемая в текущей оболочке bash. Он запускает один awk, чтобы проанализировать файл конфигурации и выяснить, брать ли пароль из переменной оболочки или из открытого текста пароля в файл конфигурации ssh (с awk в eval, а не description, из-за проблем, с которыми я столкнулся при использовании description). Я пробовал так много способов использовать 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 - это переменная окружения, содержащая ваш пароль.

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

0
ответ дан 14.12.2019, 22:16

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

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

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

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

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

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

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

0
ответ дан 14.12.2019, 22:17
  • 1
    Начиная с регистрации вышеупомянутого ответа было несколько повторений SecureCRT, включая последний один VanDyke, просто выпущенный в начале декабря 2013. Каждое повторение улучшало программу, делающую его еще более универсальный. Это также имеет богатый API, который позволяет программе управляться/соединяться интерфейсом со сценариями Python/VB. SecureCRT был частью моего базового инструментария в течение хорошего десятилетия, и я настоятельно рекомендую его. – knatten 14.12.2019, 22:18
  • 2
    извините, я don' t понимают. можно ли объяснить? – Peter Lawrey 14.12.2019, 22:18
  • 3
    перефразированный для Вас.. – Jason Aller 14.12.2019, 22:18
  • 4
    Согласованный. я продолжаю проводить бета-тестирование каждого нового выпуска, и был в большой степени вовлечен в раннее тестирование на портирование на Ubuntu. – joel.neely 14.12.2019, 22: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
0
ответ дан 14.12.2019, 22:18
  • 1
    Это все еще просит у меня пароль с этой командой прокси... – Pablo Cabrera 14.12.2019, 22:18
  • 2
    Это не будет работать как ожидалось с -W опция. У Вас есть какое-либо обходное решение? – gordon 14.12.2019, 22:19
  • 3
    Я также нахожу, что это все еще просит пароль. Все это, кажется, делает, переместить проблему от test.com требование пароля к Home требование пароля. What' s точка? What' s прием, чтобы заставить его работать? – Bobby Borszich 14.12.2019, 22:19

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

0
ответ дан 14.12.2019, 22:18
  • 1
    Действительно, это не отвечает на тот вопрос. Но это решает проблему: избегите необходимости вводить пароли вручную и хранить их в файле. Который симпатичен, чего требует OP. – Lukasz Czerwinski 14.12.2019, 22:18
  • 2
    можно ли объяснить далее? – graveca 14.12.2019, 22:19
  • 3
    Этот doesn' t отвечают на вопрос того, как поместить пароль в .ssh/config файл – Vihung 14.12.2019, 22:19
  • 4
    @Netmoon я добавил небольшой пример к своему ответу на мой это более ясный. – Vladimir Dyuzhev 14.12.2019, 22:19

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

Способ сделать это - зашифровать ваш пароль с помощью ключа в дополнение к 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
0
ответ дан 14.12.2019, 22:19

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

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

0
ответ дан 14.12.2019, 22:20
  • 1
    I' ve имел очень общий опыт общих сред хостинга, где доступ с открытым ключом отключен, поэтому даже при том, что можно добавить ключи, они не используются. это идет вразрез с причиной да, но that' s путь многие поставщики услуг хостинга настраивают свои серверы – cletus 14.12.2019, 22:20
  • 2
    Существуют ответы, которые показывают, что это возможно – Stefan Mücke 14.12.2019, 22:21
  • 3
    потому что я don' t имеют разрешение поместить, другой включает сервер. – MattW. 14.12.2019, 22:21
  • 4
    @Netmoon: Если можно войти в систему, можно ли добавить ключ, правильно? Вам только нужен доступ для записи к Вашему корневому каталогу, если системный администратор не настроил вещи странно. – p3t0r 14.12.2019, 22:21
  • 5
    @ScottSeverance я думаю, что это - ситуация этот вопрос, относится к. Не имея способность добавить ключ. Да это странно, но это часто происходит. – Kashif Nazar 14.12.2019, 22:21

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

0
ответ дан 14.12.2019, 22:20
  • 1
    Хорошо задающий вопрос согласился с ним находиться в .ssh/config, почему не в истории оболочки также? – Allen Wong 14.12.2019, 22:21
  • 2
    It' s не официально на Домашнем пиве, но можно установить от стороннего repo с brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb.Еще: gist.github.com/arunoda/7790979 – Cees Timmerman 14.12.2019, 22:21
  • 3
    read -s password; sshpass -p "$password" ssh me@myservor.com. Это будет препятствовать тому, чтобы пароль показал в истории – Ferrybig 14.12.2019, 22:21
  • 4
    Если Вы не снабжаете свою команду предисловием с пространством, (sshpass вместо sshpass), Вы только что сохранили свой пароль (" MyPa55word") в Вашем shell' s файл истории. – Peter Lawrey 14.12.2019, 22:22
  • 5
    Положительная сторона @waltinator – orbfish 14.12.2019, 22:22

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

Но если действительно, как вы говорите, « Это потому, что иногда я стою в стороне от компьютера, и когда я возвращаюсь и набираю пароль и нажимаю ввод, терминал сказал, что СОЕДИНЕНИЕ ЗАКРЫТО. », то почему бы не предотвратить вместо этого закрывать сессию? SSH может поддерживать связь для вас.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
0
ответ дан 14.12.2019, 22:21

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

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

Из man ssh-copy-id:

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

0
ответ дан 14.12.2019, 22:22
  • 1
    По моему скромному мнению, настойчивость паролей для аутентификации является большим количеством риска, чем нет. Я часто устанавливал часто используемые пароли для ssh как переменные среды, поскольку я не испытываю желания помнить ряд произвольных строк. Требовательными пользователями вводят их, просто просит, чтобы они были плохо сохранены. – skomisa 14.12.2019, 22:22
  • 2
    Иногда это заканчивается хорошо. – nafg 14.12.2019, 22:22
  • 3
    Да, но быть реалистичным в системах при Вашем всем прямом контроле и управлении не идет на компромисс. Скажите, например, на бродячей виртуальной машине без внешних соединений, используемых только в целях разработки на единственном месте. – Heiner 14.12.2019, 22:23
  • 4
    Настаивание на драконовской безопасности без причины также никогда не заканчивается хорошо. – Count 14.12.2019, 22:23
  • 5
    Этот doesn' t работают, если удаленный администратор настаивает на том, чтобы отключать авторизацию с открытым ключом... – Erik Allik 14.12.2019, 22:23

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

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

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

0
ответ дан 14.12.2019, 22:22
  • 1
    It' s большой, что Вы связываетесь с решением - однако, it' s также хорошая практика, чтобы идти вперед и отправить решение здесь. Тот путь, если ссылка когда-либо удаляется (как это иногда происходит на обмене стека) существует все еще применимый ответ здесь. – nafg 14.12.2019, 22:23

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

Теги

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