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:// имя-сервера

3 ответа3

10

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

Если вам не нужен интерактивный сеанс на удаленном сервере, вы можете выполнить ssh в среде без tty , например, как часть действия Run Shell Script в 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

ls (в командной строке ssh ) - это команда, выполняемая после входа в систему 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 для подключения, чтобы он извлекал и вводил пароль автоматически.

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 .

-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .