Подключитесь через 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не сработает.

Solefald
источник
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, говоря ему вызвать приложение, возвращающее ваш пароль, и запустить его как пакетное задание, чтобы предотвратить его чтение из терминала.
pehrs
источник