Как запустить скрипт на виртуальной машине через SSH из Яндекс Функций?
Я пытаюсь запустить Python-скрипт, который находится на виртуальной машине (ВМ), через Яндекс Функции. Проблема в том, что подключение к ВМ по SSH из Яндекс Функции не работает, я получаю ошибку:
> [email protected]: Permission denied (publickey). Load key
> "./id_rsa": bad permissions This private key will be ignored. It is
> required that your private key files are NOT accessible by others.
> Permissions 0666 for './id_rsa' are too open.
Как мне правильно настроить подключение по SSH из Яндекс Функций, чтобы успешно запустить скрипт на ВМ? Может быть, нужно использовать сервисный аккаунт или какие-то другие подходы для такого подключения?
Вот пример кода, который я использую:
import subprocess
import os
def handler(event, context):
key_path = './id_rsa'
ssh_command = [
'ssh',
'-i', key_path,
'-o', 'StrictHostKeyChecking=no',
'-o', 'UserKnownHostsFile=/dev/null',
'[email protected]',
'cd hh-parcer-all/app && python3 parcer.py'
]
try:
result = subprocess.run(ssh_command, capture_output=True, text=True)
if result.returncode == 0:
print("Скрипт успешно выполнен")
return {
"statusCode": 200,
"body": "Script executed successfully"
}
else:
print(f"Ошибка выполнения: {result.stderr}")
return {
"statusCode": 500,
"body": f"Error: {result.stderr}"
}
except Exception as e:
print(f"Ошибка: {str(e)}")
return {
"statusCode": 500,
"body": f"Error: {str(e)}"
}
Может быть, я что-то упустил или есть другие способы решить эту проблему?
Заранее спасибо за помощь!
Ответы (2 шт):
Не знаю, что мешает вам перевести текст, но права надо иметь следующие
Или так, если владельцу-пользователю дать права на чтение-запись (этот вариант предпочтительнее)
chmod 600 ~/.ssh/id_rsa
Или так, чтобы владельцу-пользователю дать только права на чтение
chmod 400 ~/.ssh/id_rsa
Иными словами, у вас на файл id_rsa выставлены недопустимые права (возможно, и на другие тоже - смотрите в конце этого текста). С помощью одной из команд выше вы можете это исправить.
Не забывайте, что команды выполнять от имени того пользователя, про которого "речь" (я так думаю, это stepa).
И еще:
- Права на ssh директорию должны быть 700 (drwx------).
- Публичный ключ: 644 (-rw-r--r--)
- Приватный (как я выше написал): 600 (-rw-------).
Попробуйте такой вариант:
import subprocess
import os
def handler(event, context):
key_path = './id_rsa'
# Установим права на приватный ключ
os.chmod(key_path, 0o600)
ssh_command = [
'ssh',
'-i', key_path,
'-o', 'StrictHostKeyChecking=no',
'-o', 'UserKnownHostsFile=/dev/null',
'[email protected]',
'cd hh-parcer-all/app && python3 parcer.py'
]
try:
result = subprocess.run(ssh_command, capture_output=True, text=True)
if result.returncode == 0:
print("Скрипт успешно выполнен")
return {
"statusCode": 200,
"body": "Script executed successfully"
}
else:
print(f"Ошибка выполнения: {result.stderr}")
return {
"statusCode": 500,
"body": f"Error: {result.stderr}"
}
except Exception as e:
print(f"Ошибка: {str(e)}")
return {
"statusCode": 500,
"body": f"Error: {str(e)}"
}