Как отвечать на запрос пароля при использовании SCP в оболочке script?

Прежде всего, мне хорошо известно, что в этой теме много вопросов. Я прочитал их, но все же могу найти подходящий ответ для моей ситуации.

Я хотел бы scp весь каталог ~/cs###/assign1 из локального в домашнюю директорию школы с оболочкой script. Мой вопрос в том, есть ли способ в моем script ожидать приглашения пароля, а затем имитировать событие на клавиатуре, чтобы "ввести" в мой пароль?


здесь - это действительно подробное руководство по настройке ключа

Ответ 1

Не разрешены ли ключи ssh? Это было бы лучшим решением.

Ответ 2

Используйте "sshpass"!

#!/bin/bash
sshpass -p "password" scp -r /some/local/path [email protected]:/some/remote/path

Ответ 3

Рассмотрите возможность использования ключей или внешней библиотеки.

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

Существуют библиотеки, которые могут делать то, что вы хотите (используйте SFTP-протокол, а не вызывающий scp), например libssh.

Опять же, я настоятельно рекомендую ключи.

Ответ 4

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

Что-то в этом направлении

ssh-keygen -t rsa
ssh school mkdir .ssh/
cat ~/.ssh/id_rsa.pub | ssh school "cat >>.ssh/authorized_keys"

(или dsa).

Но эй, это не serverfault, не так ли?; -)

Ответ 6

Я согласен, что вы должны использовать ключи. Но expect может автоматизировать интерактивный аспект процесса, если вы хотите жестко указать свой пароль в текстовом файле script.

Ответ 7

Если вы можете смонтировать каталог с компьютера Windows (например, через AFS, NFS или SMB, которые были выполнены в моих лабораториях в университете Windows), вы можете использовать pscp с помощью переключателя -pw.

Ответ 8

Вы не говорите, какую платформу вы используете дома и в школе. Предполагая, что Linux, Cygwin или OS/X у вас есть несколько вариантов:

  • Аутентификация открытого ключа, если она не отключен на сервере
  • ssh-agent и ssh-add для ввода пароля один раз за сеанс

Для опции (1) вы бы

  • создайте ключевую пару дома, используя ssh-keygen, без кодовой фразы закрытый ключ. Обратите внимание, что исключение кодовой фразы, вероятно, не очень хорошая идея, если другие люди используют один и тот же компьютер, но ваша цель заключалась в том, чтобы заставить вас вводить пароль.
  • загрузите ключ PUBLIC в свою школу учетной записи и поместить его в ~/.ssh/authorized_keys
  • Использовать scp с файлом идентификатора "-i" , где идентификационный файл - это полный путь к вашему закрытому ключу. Или добавьте запись в .ssh/config (см. Страницы руководства).

Для второго варианта ssh-agent позволяет кэшировать ваш пароль в локальном процессе один раз за сеанс. Вы устанавливаете время истечения срока действия

Ответ 9

Как уже многие говорили, использование ключей ssh ​​будет самым безопасным и лучшим способом. Если кто-то еще интересуется и ищет помощь, в справке Ubuntu есть быстрый и прямой способ для использования ssh-ключей.

Ответ 10

После настройки ssh-keygen, как описано здесь, вы можете сделать

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

где id_rsa - это локальный ключ, сгенерированный в настройке ssh-keygen.

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

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Затем с вашего терминала сделайте source ~/.bash_profile. Впоследствии, если вы наберете remote_scp в своем терминале, он должен запустить команду scp без пароля.

Ответ 11

Почему бы просто не использовать параметр "-r", чтобы скопировать его рекурсивно? Или вместо этого используйте rsync?

Вы также можете использовать аутентификацию с открытым ключом, которая не требует помощи на их конце, если у вас есть фактическая учетная запись пользователя. См. this