Вопрос или проблема
Я не могу заставить работать команду scp
с sshpass
, когда использую пользовательский файл идентификации
и пользовательский порт
. Когда я активирую подробный режим (sshpass -v), я вижу, что scp (или что-то в этом роде) запрашивает пароль от закрытого ключа.
Команда scp работает нормально, когда я ввожу пароль:
scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
Введите пароль для ключа '/home/debian/sshkey-withpass_rsa':
file.txt 100% ...
Но это не работает с sshpass (версия 1.09). Ошибок нет, просто зависает… Если я активирую подробный режим (sshpass -v), я вижу сообщение “Введите пароль для ключа …”.
Пароль — это первая строка файла /home/debian/sshkey-withpass_rsa.txt.
sshpass -f /home/debian/sshkey-withpass_rsa.txt scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
Есть идеи? Спасибо
После многократного чтения справки я обнаружил, что опция -P
используется для установки запроса пароля. По умолчанию sshpass
ищет строку assword:
. Однако при использовании аутентификации на основе ключей, запрос пароля — это Введите пароль для ключа
, поэтому он не содержит assword
, из-за чего он не работает.
Таким образом, чтобы это заработало с аутентификацией на основе ключей, нам нужно установить пользовательское значение для запроса с помощью -P
:
sshpass -P "пароль для ключа" -f thepasswordfile.txt scp ...
Хорошо, что вы решили проблему. Но полезно знать, что в таких случаях (или даже более сложных) всегда можно прибегнуть к expect
(конечно, сначала нужно его установить). Используйте такой скрипт (не проверялся):
#!/usr/bin/expect
spawn scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
expect "пароль для ключа"
send "вашпароль\r"
Ответ или решение
Решение проблемы с использованием sshpass
и scp
при наличии пользовательского файла идентификации и порта
Когда возникает необходимость копировать файлы с использованием scp
и sshpass
, особенно в условиях, когда используется пользовательский порт и ключ с паролем, могут возникнуть определённые сложности. Ниже мы рассмотрим, как успешно использовать sshpass
с scp
, опираясь на предоставленные вами детали.
Проблема
Вы сталкиваетесь с ситуацией, когда команда scp
, использующая sshpass
, не работает, и утилита ожидает ввода пароля для шифрованного ключа. При запуске команды scp
напрямую, ввод пароля проходит успешно, но при использовании sshpass
возникает зависание.
Анализ ситуации
Полная команда, которую вы использовали, выглядит следующим образом:
sshpass -f /home/debian/sshkey-withpass_rsa.txt scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
После активации режима отладки (-v
) в sshpass
, вы обнаружили, что выводит сообщение о необходимости ввести пароль для ключа: Enter passphrase for key
.
По умолчанию sshpass
ожидает найти строку assword:
для отображения запроса пароля. Однако, в вашем случае, из-за использования ключа с паролем, требуется настроить sshpass
так, чтобы он искал именно строку Enter passphrase for key
.
Решение
Чтобы правильно использовать sshpass
в таких сценариях, вам необходимо воспользоваться параметром -P
, который позволяет задать пользовательский запрос пароля. Следует использовать следующую команду:
sshpass -P "Enter passphrase for key" -f /home/debian/sshkey-withpass_rsa.txt scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
В данном случае, параметр -P
заставит sshpass
искать строку Enter passphrase for key
, что поможет избежать подобной ситуации с зависанием.
Альтернативный подход с использованием expect
Если вы предпочитаете более надёжный способ автоматизации ввода пароля, особенно для более сложных сценариев, вам стоит обратить внимание на утилиту expect
. Вот пример простого скрипта, который выполняет нужные действия:
#!/usr/bin/expect
spawn scp -P 30001 -i /home/debian/sshkey-withpass_rsa file.txt [email protected]:/home/debian/
expect "Enter passphrase for key"
send "ваш_пароль\r"
expect eof
Чтобы использовать этот скрипт, вам потребуется установить expect
и настроить правильные разрешения.
Заключение
Ваша проблема была вызвана тем, что sshpass
не способен корректно обработать запрос на ввод пароля для ключа. Настройка правильного запроса с помощью параметра -P
позволяет решить задачу. Попытайтесь также рассмотреть вариант автоматизации с помощью expect
, который может быть более универсальным в ситуациях с несколькими входными данными.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться. Успехов в вашей работе с scp
и sshpass
!