Подключитесь через SSH и введите пароль автоматически, без использования открытого ключа


20

Сервер разрешает соединения SSH, но не использует аутентификацию с открытым ключом. Я не могу изменить это в данный момент (из-за технических трудностей, а не из-за организационных проблем), но я пойду на это как можно скорее!

Что мне нужно прямо сейчас , чтобы выполнять команды на сервере , используя обычный старый счет + пароль аутентификации из сценария . То есть мне нужно сделать это неинтерактивным способом. Является ли это возможным? И как мне это сделать?

Клиент, который будет выполнять скрипт, работает на Ubuntu Server 8.04. Сервер работает Cygwin и OpenSSH.


2
Каковы технические трудности с включением аутентификации на основе ключей? Возможно, вам следует задать этот вопрос вместо этого или в дополнение к этому.
Зоредаче

1
Я спрашиваю это. :-) serverfault.com/questions/125842/… Сейчас мне просто нужен путь эвакуации, так как я уже некоторое время стучу по нему. Но, конечно, моя цель - заставить его работать в долгосрочной перспективе.
Удалено

Ответы:


22

Существует утилита Linux под названием sshpass. Он позволяет вам делать именно то, что вы хотите, и будет принимать пароль сервера либо в качестве аргумента командной строки, либо из файла (я предпочитаю этот способ, поэтому у меня не отображается пароль сервера в истории оболочки), и вы используете его вот так:

sshpass -f file_with_password ssh user@server ls -la

Это будет SSH на сервер и запустится ls -la. Одна вещь, однако, вы должны сначала вручную подключиться к серверу ssh (если вы этого еще не сделали), чтобы сервер был добавлен к вашему ~/.ssh/known_hosts. Если вы этого не сделаете, sshpassне сработает.


2
Это не стандартная часть OpenSSH, и буквально ни одна из моих машин (Mac OS X 10.7, Ubuntu 12.04, FreeBSD 8, Debian 3.1) не имеет его ...
voretaq7

@ voretaq7: sshpass - это проект SourceForge: sourceforge.net/projects/sshpass
kevinarpe

1
@KCArpe Я думаю, вы не поняли мою точку зрения («Весь мир - не ваша машина Linux - попробуйте выбрать решения, которые работают в других местах»). Использование SSH_ASKPASSпеременной является более общим решением, которое работает в любой системе с OpenSSH и не требует установки дополнительного программного обеспечения. Для некоторых из нас (в регулируемых отраслях) установка нового программного обеспечения запускает большую административную работу.
voretaq7

@ voretaq7 Использование SSH_ASKPASSне работает на всех системах. Даже если клиент поддерживает это, он не будет работать, если сервер использует keyboard-interactive. Я действительно столкнулся с этой проблемой при написании скрипта для распространения authorized_keysфайла на несколько встроенных машин.
Касперд

8

Вы можете использовать Expect для этого. Очевидно, что это не является предпочтительным с точки зрения безопасности, потому что это потребует от вас использования скрипта, который содержит ваш пароль в виде открытого текста. (Но я не буду это обсуждать, поскольку в своем вопросе вы сказали, что планируете использовать аутентификацию с открытым ключом как можно скорее!)


Похоже, это решит мою проблему! Я проверю это завтра. Это не окончательное решение, но оно предлагает некоторую безопасность. Когда я думаю об этом, если пользователь сценария единственный, кому разрешено читать сценарий. Тогда он будет таким же безопасным, как и мой закрытый ключ, который также «только» защищен разрешениями файловой системы. Или я что-то пропустил?
Удалено

Я вернусь с результатами завтра. :-) Спасибо, что ответили!
Удалено

Вроде работает. Но sshpass был проще для этого конкретного случая ИМХО.
Удалено

7

Немного зависит от языка сценария, который вы используете. Я пишу почти все на Python сейчас, где это не проблема. И pyssh, и Paramiko позволяют просто и без проблем написать пароль.

Если вы намереваетесь сделать это с помощью (ba) sh-скриптов и использовать OpenSSH, это будет сложнее. OpenSSH явно запрещает вам вводить пароли в командной строке (поскольку все пользователи могут видеть командную строку, используя что-то вроде этого ps -fe, что плохо для mojo). В этом случае вам придется напрямую взаимодействовать с программой ssh ​​и иметь два варианта:

  • Вы можете написать значительное количество кода поддержки, используя что-то вроде Expect.
  • Вы делаете хак, используя переменную SSH_ASKPASS, говоря ему вызвать приложение, возвращающее ваш пароль, и запустить его как пакетное задание, чтобы предотвратить его чтение из терминала.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.