- Вопрос или проблема
- Скачать и скомпилировать
- Использование
- Объяснение опций
- Другие опции
- expect
- sshpass
- добавить
- удалить/rm/удалить/del
- список/ls/l
- вход
- резервное копирование или восстановление
- 💥 безопасность 💥
- Ответ или решение
- Способ указания пароля в команде SSH
- Использование sshpass
- Использование ключей 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. Вот как это можно сделать:
-
С помощью файла с паролем:
sshpass -f filename ssh user@ip
Где
filename
— это файл, содержащий ваш пароль (должен содержать только пароль на первой строке). -
С непосредственной передачей пароля:
sshpass -p 'Pa5sw0rd' ssh user@ip
В этом случае пароль указывается в самой команде. Однако следует заметить, что передача пароля таким способом менее безопасна, так как он может быть видим в истории команд.
Важные замечания:
- Всегда используйте команду
chmod 600 filename
, чтобы защитить файл с паролем от посторонних. Это необходимо, чтобы предотвратить доступ к файлу другим пользователям. - Отказ от использования
-p
в пользу метода с файлом с паролем считается более безопасным.
Использование ключей SSH
Еще одним безопасным и предпочтительным способом аутентификации является использование публичных и приватных ключей. Этот метод исключает необходимость ввода пароля при каждом подключении.
Шаги для настройки:
-
Создайте ключ, если у вас его еще нет:
ssh-keygen
Это создаст пару ключей (публичный и приватный).
-
Добавьте публичный ключ на удаленный сервер:
ssh-copy-id user@ip
После выполнения этой команды вам потребуется ввести пароль только один раз.
-
Теперь вы можете подключаться без пароля:
ssh user@ip
Вводить пароль больше не потребуется, что значительно упрощает процесс.
Альтернативные методы
-
Используйте
passh
: Это инструмент, который работает и на macOS, и на Linux, позволяя вводить пароль автоматически в процессе подключения. Пользоваться им можно следующим образом:passh -c1 -C -t10 -T -p hunter2 ssh -t user@host 'echo $HOSTNAME'
Этот подход схож с sshpass, но более гибок в настройках.
-
Инструменты командной строки Windows: В среде Windows вы можете использовать
clip
для копирования пароля и затем вставки его в терминале при запросе.
Заключение
Передача паролей в командной строке может показаться удобной, но требует особой осторожности из-за потенциальных угроз безопасности. Использование SSH-ключей — более безопасный и эффективный способ управления подключениями к удаленным серверам. Выбор подходящего метода зависит от ваших требований и уровня необходимой безопасности. Рассмотренные выше методы и инструменты позволяют вам сделать ваш рабочий процесс более эффективным и безопасным.