Чи можете ви встановити паролі в .ssh / config, щоб дозволити автоматичний вхід?


93

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

Host Home
User netmoon
Port 22
HostName test.com

Чи є спосіб встановити паролі для кожного з'єднання в цей файл, щоб, коли сервер запитує пароль, термінал вводить свій пароль і відправляє його на сервер?

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

PS Я не хочу використовувати пара публічних / приватних ключів.


1
Я перебуваю в тій же ситуації, і я не можу завантажити свій відкритий ключ, оскільки у мене є ssh доступ лише для svn. Тобто, якщо я спробую ssh svnhost я отримую "(успіх (2 2 () (редагувати-трубопровід svndiff1 відсутній-записи фіксують-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 / pooblasti_keys цієї машини.


12
Це не працює, якщо віддалений адміністратор наполягає на відключенні авторизації відкритого ключа ...
tomasz

2
Так, але бути реалістичним для систем, що знаходяться під вашим безпосереднім наглядом та контролем, це не робить компромісу. Скажімо, наприклад, про бродячу віртуальну машину без зовнішніх з'єднань, що використовуються виключно для цілей розвитку на одному сидінні.
Скотт

36
Наполягання на драконівській безпеці без причин також ніколи не закінчується добре.
cwallenpoole

6
Іноді це добре закінчується.
девт

3
ІМХО, наполягання паролів для аутентифікації є більш ризиком, ніж ні. Я часто встановлював паролі для ssh як змінні середовища, оскільки я ненавиджу запам'ятати набір довільних рядків. Вимогливі користувачі вводять їх просто просять погано зберігати їх.
яєчники

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, але частина користувача не є ' t використовували більшість випадків), але основна ідея все одно була б такою ж. Щодо файлу конфігурації, ви можете використовувати інший файл конфігурації або використовувати .ssh/configта написати свій власний код для розбору цього файлу та отримання пароля для певного користувача та хоста.


ви можете пояснити далі?
Netmoon

@Netmoon Я додав невеликий приклад до своєї відповіді, щоб він був більш зрозумілим.
jcollado

Це не відповідає на питання, як ввести пароль у .ssh / config файл
Ерік Вудруф

1
Дійсно, це питання не дає відповіді. Але це вирішує проблему: уникайте вводити паролі вручну та зберігати їх у файлі. Що досить те, що вимагає ОП.
Арсесілас

19

Для цього також є sshpassпрограма. Як користуватись: sshpass -p MyPa55word ssh me@myservor.com


29
Якщо ви не передмовте команду пробілом, ( sshpassзамість sshpass), ви просто зберегли свій пароль ("MyPa55word") у файлі історії вашої оболонки.
waltinator

1
@waltinator хороший момент
igor

3
Ну а запитальник запитання був чудовий з тим, що він знаходиться .ssh/config, чому ж не в історії оболонок?
Дарт Егрегійний

Офіційно це не на 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. Це запобіжить появі пароля в історії
Олександр Птах

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
Він все ще запитує мене з паролем із цією командою проксі ...
Віктор Piousbox

1
Я також вважаю, що він все ще запитує пароль. Здається, все це полягає в тому, щоб перенести проблему з test.comнеобхідності введення пароля до Homeвимагання пароля. В чому справа? У чому фокус, щоб змусити його працювати?
Мартін Брамвелл

15

Ні. Боюсь, це неможливо.

Єдиною реальною альтернативою є використання приватних ключів, але ви сказали, що не хочете (чому ні?).


7
тому що я не маю дозволу ставити ще один ключ на сервер.
Netmoon

2
@Netmoon: Якщо ви можете увійти, ви можете додати ключ, правда? Вам потрібен лише доступ для запису до домашнього каталогу, якщо тільки sysadmin не налаштував речі дивним чином.
Скотт Северанс

4
@ScottSeverance Я думаю, що саме до цього питання йдеться. Не маючи можливості додати ключ. Так, це дивно, але це часто буває.
користувач239558

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 під назвою SecureCRT .

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

Це не безкоштовно, але за розумною ціною. Я використовую його протягом багатьох років (працює в Windows або використовує Wine) для віддаленого доступу, емуляції терміналів та (дисперсного) управління мережею. Нарешті вони випустили рідну версію Linux на початку 2011 року.

Він має підтримку складних параметрів входу (або скриптів), збережених паролів (або сертифікатів), декількох сеансів на вкладках тощо.

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

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

Якщо ви багато займаєтесь віддаленим доступом (частина вашої головної ролі), то ця програма виправдає свої витрати в перший місяць використання.


вибачте, я не розумію. ти можеш пояснити ?
Netmoon

1
переробили для вас ..
david6

2
З моменту публікації вищезгаданої відповіді відбулося кілька ітерацій SecureCRT, включаючи останню, VanDyke, щойно вийшла на початку грудня 2013 року. Кожна ітерація вдосконалювала програму, роблячи її ще більш універсальною. Він також має багатий API, який дозволяє програмі керувати / взаємодіяти зі сценаріями Python / VB. SecureCRT є частиною мого основного набору інструментів протягом хорошого десятиліття, і я дуже рекомендую його.
Віль

Домовились. Я продовжую бета-тестування кожного нового випуску та активно беру участь у ранньому тестуванні на перенесення до 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 існує в розділі config, це переосмислює #Password.
$MYPASS_ENVVARце змінна середовище, що містить ваш пароль.

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


1

Відповідь @BrunoPereira на це запитання показує альтернативний спосіб підключення без явного введення пароля та уникнення ssh-ключів.

Ви можете створити скрипт, псевдонім або функцію ~/.bashrcдля швидкого виконання цієї команди.

Очевидно, що з цього підходу слід враховувати питання безпеки.


Чудово, що ви посилаєтесь на рішення - однак, також є хорошою практикою продовжувати та розміщувати рішення тут. Таким чином, якщо посилання коли-небудь видаляється (як це трапляється при обміні стеками періодично), тут все ще є відповідна відповідь.
Пол,

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

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

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

Спосіб поєднання - це використання труби:

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

Існує невеликий варіант способу, описаного в блозі про те, як користуватися ним, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.