Скрипт 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')
Надеюсь, вы не установили 777 разрешений на свой закрытый ключ!
Обновленный с запрошенным кодом, я скопировал закрытый ключ и переместил его в каталог тестирования и изменил разрешения, теперь он удален. Все это в тестовой среде.
Я не понимаю, что вы имеете в виду под «Я скопировал закрытый ключ и переместил его в каталог тестирования и изменил разрешения, теперь он удален». - вы загружаете ключ из /home/user/.ssh
, а не из каталога тестирования. Почему файл удален? + Возникает ли у вас та же проблема, если вы генерируете новый ключ RSA?
Приношу свои извинения, позвольте мне объяснить. Когда я считал, что это, возможно, проблема с разрешениями, вместо того, чтобы играть с разрешениями в моем каталоге .ssh и файлах внутри, я скопировал id_rsa и переместил его в каталог, содержащий скрипт paramiko. Я скорректировал путь в скрипте, чтобы отразить это изменение. Затем я изменил разрешения для этого файла и каталога. После того, как это продолжало терпеть неудачу, я удалил копию id_rsa, а затем изменил путь в скрипте обратно в каталог .ssh, где он находится сейчас. Я попробую новый ключ, просто странный ключ отлично работает при запуске в интерактивной оболочке.
новый ключ RSA не решил проблему. та же ошибка, что и раньше.
Добавьте with open('/home/user/.ssh/id_rsa', 'r') as fin:
print fin.read()
в свой код и проверьте, соответствует ли содержимое, которое он выводит при запуске из cron, ожидаемому.
да, с этим добавленным вывод будет именно таким, как ожидалось.
Хорошо, вы проверяли, не подбирает ли cron другую версию Python или Paramiko?
Я запустил which python
, а затем добавил этот полный путь к заданию cron как /usr/bin/python
при вызове python. Я также запустил env
и сделал путь cron точно таким же, как у моей интерактивной оболочки.
Я столкнулся с подобной ситуацией, и мне на помощь приходит 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
Покажите нам код, который вы используете для загрузки ключа.