Как указать пароль в команде ssh

Вопрос или проблема

Из терминала я ввожу: ssh user@ip, после чего он запрашивает пароль.
Существует ли способ указать пароль непосредственно в команде ssh?

Используйте sshpass, один из двух вариантов:

sshpass -ffilename ssh user@ip   # предпочтительнее
sshpass -pPa5sw0rd ssh user@ip   # избегайте этого

где ваш пароль находится в первой строке файла filename или это буквально Pa5sw0rd. Примечания:

  • В руководстве нет пробела после -p или -f, но как минимум sshpass 1.06 на моем Debian 10 это позволяет; ваш sshpass может работать по-другому.
  • Если ваш пароль содержит символы, которые интерпретирует ваша оболочка (например, $, ' или ;), то вам следует правильно заключить его в кавычки в командной строке (но не в файле).
  • Избегайте -p. Используйте chmod 600 filename, чтобы сделать файл приватным (хотя root все равно сможет получить к нему доступ). Читайте о соображениях по безопасности в руководстве.

Правильный способ сделать это — перейти от аутентификации по паролю к паре открытых/закрытых ключей. Это обычно не требует никакой переастановки и довольно просто.

Шаг 1: Если у вас нет ключа, создайте его: ssh-keygen сделает это за вас.

Шаг 2: Авторизуйте этот ключ на удаленном хосте: Выполните ssh-copy-id user@ip один раз, используя свой пароль.

Шаг 3: С этого момента ssh user@ip больше не будет запрашивать ваш пароль.

Хотя это может быть обходным путем, вы можете быстро выполнить вход, скопировав пароль в буфер обмена и вставив его, когда будет предложено. В пакетном файле на Windows это будет выглядеть примерно так:

clip <ваш-пароль>
ssh <пользователь>@<сервер>

Когда вы запустите скрипт, просто нажмите Ctrl + V, и вы внутри.

Вот решение, которое использует clarkwang/passh. Оно работает на macOS (тестировалось на 13.4.1), а также на Linux, FreeBSD, OpenWRT и некоторых других.

Скачать и скомпилировать

Предварительно скомпилированные бинарные файлы на данный момент отсутствуют, но всего несколько команд позволят установить это:

git clone https://github.com/clarkwang/passh && cd passh
cc -o passh passh.c
cp passh /usr/local/bin

Использование

passh -c1 -C -t10 -T -p hunter2 ssh -t user@host 'echo $HOSTNAME'

Объяснение опций

  • -c1 делает только одну попытку входа по паролю
  • -C завершает работу, если вход по паролю не удался
  • -t10 означает таймаут через 10 секунд
  • -T завершает работу, если произошел таймаут
  • -p указывает пароль для ввода

Другие опции

expect

Вот ответ, который использует expect. Я предпочитаю passh, потому что он не требует HEREDOC или отдельного скрипта и работает на встроенных платформах, таких как OpenWRT, которые не всегда поставляются с expect.

sshpass

sshpass был удален из Homebrew (редактировать: похоже, вернулся) и немного сложен для установки на macOS. Автор passh также задокументировал некоторые детали, объясняющие, почему он не работает, по адресу passh/sshpass-broken.md.

Я столкнулся с аналогичной проблемой. Когда я проверял все проекты с открытым исходным кодом, я не нашел подходящий инструмент, поэтому я написал один и скомпилировал в бинарный файл autossh. В системах Unix он использует passh для входа с паролем, а в Windows — putty.exe.

Вы можете использовать его для записи, восстановления и входа на удаленные серверы. При его использовании не забудьте установить переменную окружения ASKEY, чтобы защитить пароль.

добавить

❯ autossh add -u idhyt -p password -i 1.2.3.4 -n ubuntu
+-------+--------+-------+---------+------+
| индекс | имя    | пользователь | ip       | порт |
+=======+========+=======+=========+======+
| 1     | ubuntu | idhyt | 1.2.3.4 | 22   |
+-------+--------+-------+---------+------+

добавьте другую информацию о сервере с помощью опции -N/--note, например -N "истекает 2022-11-11"

Примечание! Пароль необходимо экранировать, если в нем есть специальные символы. Вы можете обратиться к следующей информации о том, какие символы необходимо экранировать при использовании bash.

удалить/rm/удалить/del

❯ autossh rm -i 1
+-------+------+------+----+------+
| индекс | имя | пользователь | ip | порт |
+-------+------+------+----+------+

удалите несколько записей с помощью rm -i 1 2 3 ...

список/ls/l

❯ autossh ls
+-------+--------+-------+---------+------+
| индекс | имя    | пользователь | ip       | порт |
+=======+========+=======+=========+======+
| 1     | ubuntu | idhyt | 1.2.3.4 | 22   |
+-------+--------+-------+---------+------+

возможно, scp что-то, добавьте параметр -a/--all, чтобы показать пароль.

❯ autossh ls --all
+-------+--------+-------+---------+------+----------+
| индекс | имя    | пользователь | ip       | порт | пароль |
+=======+========+=======+=========+======+==========+
| 1     | ubuntu | idhyt | 1.2.3.4 | 22   | пароль |
+-------+--------+-------+---------+------+----------+

вход

❯ autossh login -i 1
([email protected]) Пароль:
Добро пожаловать в Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-156-generic x86_64)

в Windows вам нужно скачать putty.exe и разместить его в той же директории, что и инструмент.

резервное копирование или восстановление

файл записи находится по адресу $HOME/.autossh.toml, вы можете изменить и сделать его резервную копию.

если вы не знаете местоположение, вы можете использовать команду в режиме отладки, чтобы найти его.

❯ RUST_LOG=DEBUG autossh list
[2024-06-19T10:04:22Z DEBUG  autossh::ssh::record] данные записи находятся в `/home/idhyt/.autossh.toml`

💥 безопасность 💥

поля password по умолчанию в виде открытого текста,

если вы хотите зашифровать его, импортируйте переменные окружения ASKEY перед использованием.

export ASKEY="СекретныйКлюч" в bash или set ASKEY="СекретныйКлюч" в cmd.

❯ export ASKEY="защищенный"
❯ autossh add -u idhyt -p password -i 1.2.3.4 -n ubuntu
> autossh list --all
+-------+--------+-------+---------+------+----------+
| индекс | имя    | пользователь | ip       | порт | пароль |
+=======+========+=======+=========+======+==========+
| 1     | ubuntu | idhyt | 1.2.3.4 | 22   | пароль |
+-------+--------+-------+---------+------+----------+
❯ cat ~/.autossh.toml | grep password
password = "IiaMr0ce4iKF5AvXf+rtFQ9mET0Ug4hLOoGeybzyOQx/lUvh"

Ответ или решение

Способ указания пароля в команде SSH

При использовании команды SSH для подключения к удаленному серверу появляется необходимость в аутентификации. Обычно вы вводите свой пароль после того, как команда ssh user@ip запросит его. Но есть ситуации, когда ввод пароля вручную становится неудобным или невозможным. В таком случае можно использовать специальный инструмент для автоматизации процесса аутентификации.

Использование sshpass

Одним из наилучших решений для указания пароля непосредственно в команде SSH является программа sshpass. Этот инструмент позволяет передавать пароль в виде аргумента при вызове SSH. Вот как это можно сделать:

  1. С помощью файла с паролем:

    sshpass -f filename ssh user@ip

    Где filename — это файл, содержащий ваш пароль (должен содержать только пароль на первой строке).

  2. С непосредственной передачей пароля:

    sshpass -p 'Pa5sw0rd' ssh user@ip

    В этом случае пароль указывается в самой команде. Однако следует заметить, что передача пароля таким способом менее безопасна, так как он может быть видим в истории команд.

Важные замечания:

  • Всегда используйте команду chmod 600 filename, чтобы защитить файл с паролем от посторонних. Это необходимо, чтобы предотвратить доступ к файлу другим пользователям.
  • Отказ от использования -p в пользу метода с файлом с паролем считается более безопасным.

Использование ключей SSH

Еще одним безопасным и предпочтительным способом аутентификации является использование публичных и приватных ключей. Этот метод исключает необходимость ввода пароля при каждом подключении.

Шаги для настройки:

  1. Создайте ключ, если у вас его еще нет:

    ssh-keygen

    Это создаст пару ключей (публичный и приватный).

  2. Добавьте публичный ключ на удаленный сервер:

    ssh-copy-id user@ip

    После выполнения этой команды вам потребуется ввести пароль только один раз.

  3. Теперь вы можете подключаться без пароля:

    ssh user@ip

    Вводить пароль больше не потребуется, что значительно упрощает процесс.

Альтернативные методы

  1. Используйте passh: Это инструмент, который работает и на macOS, и на Linux, позволяя вводить пароль автоматически в процессе подключения. Пользоваться им можно следующим образом:

    passh -c1 -C -t10 -T -p hunter2 ssh -t user@host 'echo $HOSTNAME'

    Этот подход схож с sshpass, но более гибок в настройках.

  2. Инструменты командной строки Windows: В среде Windows вы можете использовать clip для копирования пароля и затем вставки его в терминале при запросе.

Заключение

Передача паролей в командной строке может показаться удобной, но требует особой осторожности из-за потенциальных угроз безопасности. Использование SSH-ключей — более безопасный и эффективный способ управления подключениями к удаленным серверам. Выбор подходящего метода зависит от ваших требований и уровня необходимой безопасности. Рассмотренные выше методы и инструменты позволяют вам сделать ваш рабочий процесс более эффективным и безопасным.

Оцените материал
Добавить комментарий

Капча загружается...