Могу ли я автоматически войти в систему с помощью паролей из цепочки ключей OS X?

9

Мне нужно войти на сервер SSH, который не поддерживает аутентификацию на основе ключей. И я не хочу каждый раз вводить пароли.

Я использую OS X Lion (10.7.2). Я добавил пароли к цепочке ключей OS X [1]. Теперь я могу автоматически получить пароль из цепочки для ключей /usr/bin/security, однако не могу найти способ отправить этот пароль в приглашение ssh.

Я тоже попробовал sshpass. Однако, когда я пытаюсь запустить его, ssh завершает работу со следующей ошибкой:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Могу ли я войти на этот сервер без необходимости каждый раз вводить пароль?

Ноты

  1. Схема, которую я использую в связке ключей, выглядит следующим образом
    • Вид: Интернет-пароль
    • Аккаунт: имя пользователя
    • Где: ssh: // имя-сервера
Чайтанья Гупта
источник

Ответы:

11

Неинтерактивные сеансы SSH

Если вам не нужен интерактивный сеанс на удаленном сервере, вы можете выполнить его sshв среде без tty, например, в рамках действия « Выполнить сценарий оболочки» в Automator .

Вам нужно создать программу, которая при вызове печатает пароль для стандартного вывода, например, следующий скрипт bash, который вы должны сделать исполняемым с помощью chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Затем задайте для SSH_ASKPASSпеременной среды путь к этой программе, а затем запустите sshдействие Automator, например:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Когда нет tty, но SSH_ASKPASSи DISPLAY(для X11, установленного по умолчанию) установлены, SSH выполняет программу, указанную параметром, SSH_ASKPASSи использует свои выходные данные в качестве пароля. Это предназначено для использования в графической среде, так что может появиться окно с запросом вашего пароля. В этом случае мы просто пропустили окно, возвращая пароль из нашей программы. Вы можете использовать securityдля чтения из цепочки для ключей вместо этого, как это:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

lssshкомандной строке) является команда выполняется , когда sshуже вошли в систему , а его выход напечатан в Automator. Вы, конечно, можете перенаправить его в файл, чтобы записать вывод программы, которую вы запускаете.


Интерактивные сеансы SSH с использованием sshpass

Я скачал, скомпилировал и установил, sshpassи он работал отлично. Вот что я сделал:

  1. Получить инструменты разработчика Apple
  2. Скачать и открыть sshpass-1.05.tar.gz
  3. Откройте оболочку в каталог sshpass-1.05
  4. Запустить ./configure
  5. Запустить make
  6. Беги make install(тебе может понадобиться sudo)

Теперь программа установлена ​​в /usr/local/bin/sshpass. Выполните, используя следующую строку:

sshpass -pYourPassword ssh username@hostname

Вы можете прочитать пароль securityпрямо перед этим и использовать его следующим образом:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

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

Даниэль Бек
источник
Привет, я проголосовал за ваш ответ, так как он привел меня к решению. Однако то, что вы описали здесь, не сработало (это может относиться к версии ssh от Lion). 1) Для неинтерактивных сеансов ssh по-прежнему запрашивал у меня пароль, и после того, как я его ввел, я получил STDIN is not a terminal. 2) Для интерактивных сессий с sshpass, то -pвариант , видимо , ничего не делает. Но бег, sshpassпока SSH_ASKPASSнастроен, работает!
Чайтанья Гупта
@ChaitanyaGupta Странно. У меня это работало неинтерактивно из Automator на Lion. Что касается второй проблемы, возможно, в тот момент у меня была грязная сессия оболочки, я больше не уверен. +1 вам, и спасибо за добавление вашего решения на сайт.
Даниэль Бек
Мой плохой (относительно 1) - я пытался запустить неинтерактивный сеанс в терминале, а не в Automator. Я попробовал это в Automator сейчас, и я все еще получаю STDIN is not a terminalошибку. Однако на этот раз мне не предложили ввести пароль; Я верю, SSH_ASKPASSчто работает в Automator, так как, если я сделаю файл SSH_ASKPASSвзамен неправильного пароля, я получу Permission denied, please try again.ошибку.
Чайтанья Гупта
1
В последних примерах обратите внимание, что в Unix-подобных операционных системах аргументы командной строки и переменные среды могут быть видны другим пользователям в системе, поэтому это не безопасно в чувствительной многопользовательской среде.
Юрген Штробель
@DanielBeck любую идею, как заставить это работатьmacOs >= 10.13
nbari
7

Я нашел решение (спасибо Дэниелу Беку за предоставление ключевой информации, необходимой для этого). Обратите внимание, что я проверял это только с OS X Lion 10.7.2. Если это не работает для вас, попробуйте решение Дэниела.

Сначала нам нужно установить SSH_ASKPASSпеременную окружения - ее значением должен быть путь к программе, которая выводит пароль на стандартный вывод. Чтобы получить пароль из цепочки для ключей, вот как это должно выглядеть (я называю это get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Несколько замечаний:

  1. Это предполагает, что вы сохранили пароль в цепочке для ключей так, как я описал в вопросе

  2. Данная программа SSH_ASKPASSбудет вызываться без каких-либо аргументов; поэтому мы используем переменные окружения, чтобы передать ему имя пользователя и имя хоста.

Теперь мы можем установить SSH_PASSWORD_USERи SSH_PASSWORD_HOSTNAMEзапустить приложение sshpassдля входа на наш сервер.

Я создал другой скрипт ssh-kcpass, чтобы сделать это:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Чтобы войти на сервер ssh без ввода пароля, вам просто нужно запустить ssh-kcpass user@hostname.

Чайтанья Гупта
источник
Как заставить это работатьmacOS >= 10.13
nbari
-3

Привет, люди, с которыми я сталкивался в этой теме в поисках чего-то другого, но ... Не знаю, упускаю ли я что-то здесь ... но ваш подход кажется мне странным. почему бы просто не использовать аутентификацию с открытым ключом ... Сгенерировать ключ rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

В идеале вы должны использовать один раз ssh-copy-id user @ host и один раз аутентифицироваться с паролем, чтобы установить ключ на другом сервере, или использовать любой вид сценария или средства автоматизации для развертывания ключа в ~ / .ssh / authorized_keys на другой хост (для пользователя, к которому вы хотите авторизоваться). Если вы выполнили команду вручную, вам нужно соответствующим образом отредактировать / etc / ssh / sshd_config, а с помощью автоматизации (chef, ansible) вы получите полную кондигу для желаемого состояния.

Ключ, который имеет значение для распространения, это id_rsa.pub, храните закрытый ключ в безопасности.

Чтобы использовать связку ключей для аутентификации на хостах в автоматическом режиме, отредактируйте на вашем компьютере файл ~ / .ssh / config и добавьте:

Host * UseKeychain да

Ищите дополнительную информацию о параметрах конфигурационного файла ssh, надеюсь, что все это пригодится

Рикардо Мендес
источник
1
Прочтите первое предложение в теле вопроса: «Мне нужно войти на сервер ssh, который не поддерживает аутентификацию на основе ключей. ''
Скотт
Привет, Скотт. Я думаю, ты также пропустил ту часть, где он говорит, что не хочет вводить пароль каждый раз, а значит, он это делает.
Рикардо Мендес
Нет, я не пропустил это. Почему ты веришь, что я сделал?
Скотт
Bc вы все еще говорите
Рикардо Мендес