Чи можу я автоматично входити в ssh за допомогою паролів з брелока 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, наприклад, в рамках дії Run Shell Script в Automator .

Вам потрібно створити програму, яка при виклику роздруковує пароль для стандартного виходу, наприклад, наступний сценарій bash, який потрібно зробити виконуваним за допомогою chmod +x pwd.sh:

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

Потім встановіть SSH_ASKPASSзмінну оточення до шляху до цієї програми, а потім запустіть sshв Автоматизаторі дію, як це:

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 у Лева) 1) Для неінтерактивних сесій ssh ​​все-таки запитав мене паролем, і після того, як я його ввів, я отримав STDIN is not a terminal. 2) Для інтерактивних сеансів із sshpass, -pопція, очевидно, нічого не робить. Але біг sshpassпід час SSH_ASKPASSвстановлення працює!
Чайтанья Гупта

@ChaitanyaGupta Незвичайно. Він працював на мене неінтерактивно з Автоматизатора на Леві. Щодо цього другого питання, можливо, у мене в цей момент відбувся брудний сесійний корпус, я вже не впевнений. +1 вам і дякуємо, що додали своє рішення на сайт.
Даніель Бек

Моє погано (щодо 1) - я намагався запустити неінтерактивну сесію в терміналі, а не в Автоматизаторі. Я спробував це в 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 / санкціонованих_кіїв на інший хост (для користувача, на якого ви хочете увійти) Якщо це зроблено з командою вручну, вам доведеться відповідно редагувати / etc / ssh / sshd_config і автоматизувати (шеф-кухар, відповідальний), ви надішлете повну умову для потрібного стану.

Ключ, який має значення для розповсюдження, - id_rsa.pub, захищайте приватний ключ

Щоб використовувати брелок для автентифікації на хостах, в автоматичному режимі прямо редагуйте на вашій машині команду ~ / .ssh / config та додайте:

Хост * UseKeychain так

Шукайте додаткову інформацію про параметри файлу ssh config, сподівайтеся, що все це стане в нагоді


1
Прочитайте перше речення органу запитання: "" Мені потрібно увійти на ssh-сервер, який не підтримує аутентифікацію на основі ключів. ''
Скотт

Привіт Скотт, я думаю, ви також пропустили ту частину, де він каже, що не хоче вводити пароль кожен раз, а це означає, що він це робить.
Рікардо Мендес

Ні, я цього не пропустив. Чому б ти повірив, що я це зробив?
Скотт

Bc ви все ще говорите
Рікардо Мендес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.