Paramiko только как задание cron недействителен закрытый ключ RSA

Скрипт Paramiko отлично работает из интерактивного терминала с использованием id_rsa. При запуске в качестве задания cron он внезапно обнаруживает, что id_rsa недействителен. Для всех связанных файлов были установлены разрешения Test 777, но безрезультатно. Журналы показывают, что задание выполняется от имени надлежащего пользователя.

paramiko.ssh_exception.SSHException: not a valid RSA private key file

Итак, похоже, что оператор if в конце блока выполняется только как задание cron: `

  def _read_private_key(self, tag, f, password=None):
            lines = f.readlines()
            start = 0
            beginning_of_key = "-----BEGIN " + tag + " PRIVATE KEY-----"
            while start < len(lines) and lines[start].strip()
                                                 != beginning_of_key:
            start += 1
        if start >= len(lines):
            raise SSHException("not a valid " + tag + " private key file")
` 

Любые идеи приветствуются.

Обновлено: мой код для загрузки ключа try: client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.WarningPolicy) client.connect(hostname = '<target>', key_filename = '/home/user/.ssh/id_rsa',username='root')

Покажите нам код, который вы используете для загрузки ключа.

Martin Prikryl 17.12.2018 20:54

Надеюсь, вы не установили 777 разрешений на свой закрытый ключ!

Martin Prikryl 17.12.2018 20:55

Обновленный с запрошенным кодом, я скопировал закрытый ключ и переместил его в каталог тестирования и изменил разрешения, теперь он удален. Все это в тестовой среде.

DocSpiegel 17.12.2018 22:00

Я не понимаю, что вы имеете в виду под «Я скопировал закрытый ключ и переместил его в каталог тестирования и изменил разрешения, теперь он удален». - вы загружаете ключ из /home/user/.ssh, а не из каталога тестирования. Почему файл удален? + Возникает ли у вас та же проблема, если вы генерируете новый ключ RSA?

Martin Prikryl 18.12.2018 08:37

Приношу свои извинения, позвольте мне объяснить. Когда я считал, что это, возможно, проблема с разрешениями, вместо того, чтобы играть с разрешениями в моем каталоге .ssh и файлах внутри, я скопировал id_rsa и переместил его в каталог, содержащий скрипт paramiko. Я скорректировал путь в скрипте, чтобы отразить это изменение. Затем я изменил разрешения для этого файла и каталога. После того, как это продолжало терпеть неудачу, я удалил копию id_rsa, а затем изменил путь в скрипте обратно в каталог .ssh, где он находится сейчас. Я попробую новый ключ, просто странный ключ отлично работает при запуске в интерактивной оболочке.

DocSpiegel 18.12.2018 14:52

новый ключ RSA не решил проблему. та же ошибка, что и раньше.

DocSpiegel 18.12.2018 15:12

Добавьте with open('/home/user/.ssh/id_rsa', 'r') as fin:print fin.read() в свой код и проверьте, соответствует ли содержимое, которое он выводит при запуске из cron, ожидаемому.

Martin Prikryl 19.12.2018 08:31

да, с этим добавленным вывод будет именно таким, как ожидалось.

DocSpiegel 19.12.2018 14:37

Хорошо, вы проверяли, не подбирает ли cron другую версию Python или Paramiko?

Martin Prikryl 19.12.2018 14:38

Я запустил which python, а затем добавил этот полный путь к заданию cron как /usr/bin/python при вызове python. Я также запустил env и сделал путь cron точно таким же, как у моей интерактивной оболочки.

DocSpiegel 19.12.2018 14:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
389
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я столкнулся с подобной ситуацией, и мне на помощь приходит ssh-keygen. Вы должны сделать копию id_rsa и преобразовать ее в тип RSA с помощью ssh-keygen, а затем указать этот путь для "key_filename"

Чтобы преобразовать «BEGIN OPENSSH PRIVATE KEY» в «BEGIN RSA PRIVATE KEY»

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

Другие вопросы по теме