Як SSH в одному рядку


26

Як би я підключився до іншого комп’ютера через SSH в одній лінії? Якби я це робив ssh host@IP, мені потрібно було б ввести пароль у другому рядку. Я думав, що можу зробити щось подібне:, ssh host@IP | echo passwordале це ставить пароль, перш ніж запитувати його.


3
Таке мислення походить з часів telnet і очікуйте, коли ще Інтернет був безпечнішим місцем. Відповідь Аллена правильна, відповідь Джакує технічно правдива, але не є інструментом для роботи в більшості місць.
Criggie

3
Це гарне запитання для налаштування входу без пароля. Я б просив вас переглянути свою прийняту відповідь. Яка відповідь Джакову -правильна, і буде працювати, правильний спосіб зробити це за допомогою ключів SSH, описаних у відповіді Аллана.
Скотт

Якби sshчитав пароль від stdin, то echo password | ssh host@IPпрацював би, але зазвичай SSH намагається читати безпосередньо з терміналу.
Paŭlo Ebermann

Відповіді:


82

Ви повинні використовувати SSH ключі для автентифікації, а не ставити свій пароль в командному рядку, оскільки це надзвичайно небезпечно.

Як це працює, як тільки ви встановите свої SSH ключі, все, що вам потрібно зробити, - це виконати команду:

ssh user@host

і не набираючи іншої речі, ви автоматично входите в систему.


Скопіюйте відкритий ключ SSH на Mac / FreeBSD / Linux з macOS

Це передбачає, що ви маєте доступ до віддаленого сервера через автентифікацію на основі пароля (введення пароля), і що ви вже створили свою приватну / публічну ключ (якщо ні, див. Нижче). У наступному прикладі ми використовуємо RSA. Для початку скопіюємо ключ (зверніть увагу, що "домашній" каталог відрізняється між macOS, Linux, BSD тощо):

Використання SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Або просто передати файл файлу authorized_keys(я віддаю перевагу цьому методу):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Ім'я вашого ключа може відрізнятися) Якщо каталог .ssh не існує на віддаленому сервері, вам потрібно буде увійти та створити його.

Тепер ключ скопійовано з mac на віддалений сервер. Встановіть правильні дозволи для відкритого ключа SSH на віддаленому сервері:

chmod 600  ~/.ssh/id_rsa.pub

Далі додайте ключ до файлу дозволеного_кейта SSH, якщо файл не існує, створіть його.

Якщо файл authorized_keysвже існує в ~/.sshкоманді, використовуйте таку команду:

cat id_rsa.pub >> authorized_keys

Якщо файл не існує, введіть такі команди:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Створення SSH публічного / приватного ключа на macOS

Відкрийте термінал, перейшовши до програми -> Утиліти -> Термінал

У терміналі використовуйте наступну команду для запуску генерації ключів

ssh-keygen -t rsa

Далі вам буде запропоновано вказати місце, де ви хочете створити файл приватного ключа:

Введіть файл, у якому потрібно зберегти ключ ( /Users/username/.ssh/id_rsa):

Залиште це порожнім, щоб створити ключ у розташуванні за замовчуванням, яке є /Users/username/.ssh/id_rsa. Файл відкритого ключа буде створений у тому самому місці та з тим самим іменем, але з розширенням .PUB.

Після того, як вам буде запропоновано вибрати парольну фразу. Це необов'язковий пароль для використання приватного ключа.

Enter passphrase (empty for no passphrase):

Ваш ключ SSH генерується.

Тепер майте на увазі, якщо ви введете парольну фразу, вам потрібно буде вводити її щоразу, коли ви підключаєтесь. Утиліта ssh-agentзберігатиме парольну фразу в пам'яті, полегшуючи необхідність вручну вводити її вручну кожного разу при підключенні, коли ви перебуваєте в одному сеансі. Детальніше дивman ssh-agent


6
Абсолютно це - ключі можуть і повинні повністю замінити паролі для будь-якого ssh доступу через Інтернет. Я б запропонував вам розширити необхідність захисту приватного ключа, що його не те, що потрібно мати на всіх ваших комп'ютерах.
Criggie

+1 Це дійсно гарна відповідь не тільки через те, що він говорить, а й через те, як ви це пояснили. Все, що користувачам простіше стежити і допомагає їм бути більш безпечним, є плюсом у моїх книгах!
Мономет

7
Чудова відповідь. Просто хотів додати, що ssh-copy-idце приємний інструмент для автоматизації деяких з перерахованих.
Скотт

Згадка про ssh-агент також може допомогти. Більшість (усіх?) Версій OS X / macOS поставляються разом із ним, і він дозволяє без пароля входити, навіть коли ключ захищений паролем.
Qsigma

1
@Scot - він не є частиною macOS за замовчуванням і повинен бути встановлений через Homebrew або MacPorts . Я не прихильник встановлення програмного забезпечення для речей, яке може бути виконано в 1 рядок або короткий сценарій, написаний самостійно, і тому я вважав, що це не в межах відповіді. Однак це невелика корисна корисність і варто згадати.
Аллан

13

Існує кілька можливостей. Ваш приклад, очевидно, не спрацює, але ви можете досягти чогось подібного, використовуючи sshpassутиліту:

sshpass -p password ssh host@IP

Зауважте, це не рекомендується, оскільки цей показник passwordбуде видно для інших процесів або в історії оболонок.

Набагато кращий спосіб зробити це - налаштувати аутентифікацію без паролів за допомогою SSH-ключів. Коротко:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

Я спробував так, sshpassяк ви рекомендували, але він сказав, що команда не знайдена.
Бен А.

8
Ну ... Вам, мабуть, доведеться його встановити. І ні, я не рекомендую. Налаштування автентифікації без паролів за допомогою ssh-ключів.
Jakuje

4
@BenA. налаштувати аутентифікацію без паролів, визначивши публічну / приватну клавіатуру та встановивши її на обох задіяних машинах. Це набагато простіше (і насправді безпечніше) ніж будь-який пароль
nohillside

8
Тисяча разів ні. sshpass - це брудний хак, який використовується для підключення до пристроїв, які розмовляють ssh, але не роблять ключі належним чином, і його основне використання - це сценарії налаштування. Ви не використовуєте sshpass на багатокористувацькій машині ps auxw | grep sshpass , а іншим користувачам повідомлять пароль ssh.
Criggie

1
@Criggie, не повністю. Хоча я на 100% відстаю від рішення, заснованого на ключах, у мене є sshpass на пару внутрішніх лише Raspberry Pis (для випадкових завдань та доступу до випадкових клієнтів; передача ключів лише для внутрішнього використання - це клопоти). Запуск команди дає наступний результат: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. zzzzzzzzбуквально; sshpass маскує вміст пароля. Можливо, раніше ітерації були менш відомими для конфіденційності.
фліт

3

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

Скористайтеся програмою, яка викликається expectдля цього. Очікуємо, буде спостерігати stdout (і я думаю, що stderr, якщо налаштовано правильно) для вас, чекаючи певних повідомлень і відповідати на них результатом. Очікуйте, що це насправді сценарій мови, і коли я робив це те саме, мені було дуже важко, щоб власні сценарії працювали належним чином через час. Однак очікуйте, що також є зручна утиліта під назвою autoexpect.

Завдяки автоматичному очікуванню він буде спостерігати за вами та генерувати сценарій очікування для вас. Просто запустіть autoexpect і потрібну команду:

autoexpect ssh host@ip 

і робіть те, що ви зазвичай робите. Коли ви вийдете з програми (ввівши exitоболонку ssh'd), вона створить сценарій. У випадку, якщо ви не хочете, щоб весь сценарій, який ви пишете, був у сценарії очікування, ви можете відредагувати сценарій з автоекспедиції (викликається script.exp) для виходу, перш ніж вводити exitкоманду в оболонку. Рядок, який потрібно перейти, щоб змінити закінчення сценарію:

expect eof

що означає очікувати закінчення файлу. Сподіваюся, це допомагає!


1
У випадку, якщо ніхто ще не сказав цього: Ласкаво просимо до Питання різних!
Synoli

2

Використовувати expectпросто неправильно входити в ssh-з'єднання для будь-якого іншого, крім тестового набору.

Те, що @ ben-a шукає, вже реалізовано в ssh. Хитрість полягає в тому, як ним користуватися. Отже, ось що:

  1. Створіть загальнодоступні / приватні ключові слова, використовуючи ssh-keygen. Використовуйте або ECDSA або RSA як -t(або тип), а для RSA використовуйте 2048 або 4096 як -b(або довжину BITS). Цього повинно вистачити на момент написання. ЗАВЖДИ використовуйте ПАРОЛЬ!
  2. Використовуйте ssh-copy-idвищезазначену методологію для створення ~/.ssh/authorized_keysфайлу на машині, на якій ви входите (він же сервер) . Всередині є копія відкритого ключа, який ви тільки що створили.
  3. Тепер на машині, яку ви використовуєте для входу в "сервер" (або клієнт), ви відкриваєте файл ~/.ssh/config. Якщо його немає, ви можете створити його.
  4. У цей файл ви додаєте наступне для своїх потреб

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Тепер ви можете скористатись лише ssh <name>для налаштування з'єднання, але все одно знадобиться пароль для вашого ключа. Для вирішення цього питання використовуйте розроблений для цієї мети розроблений та включений ssh-агент. Щоб додати ключ до агента, просто використовуйте ssh-add <path to keyfile>. Вам буде запропоновано пароль, і він буде надійно зберігати для вас ключ для цього сеансу. Якщо вона видає помилку "не може знайти ssh-агент" (або подібне), це означає, що, ймовірно, агент не був запущений. Ви можете запустити його для цього сеансу, використовуючи ssh-agent bash. Це запустить нову оболонку з активним в ній агентом.

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

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