Как запустить скрипт на виртуальной машине через 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 шт):

Автор решения: void

Не знаю, что мешает вам перевести текст, но права надо иметь следующие

Или так, если владельцу-пользователю дать права на чтение-запись (этот вариант предпочтительнее)

chmod 600 ~/.ssh/id_rsa

Или так, чтобы владельцу-пользователю дать только права на чтение

chmod 400 ~/.ssh/id_rsa

Иными словами, у вас на файл id_rsa выставлены недопустимые права (возможно, и на другие тоже - смотрите в конце этого текста). С помощью одной из команд выше вы можете это исправить. Не забывайте, что команды выполнять от имени того пользователя, про которого "речь" (я так думаю, это stepa). И еще:

  • Права на ssh директорию должны быть 700 (drwx------).
  • Публичный ключ: 644 (-rw-r--r--)
  • Приватный (как я выше написал): 600 (-rw-------).
→ Ссылка
Автор решения: Airat Galiullin

Попробуйте такой вариант:

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)}"
        }
→ Ссылка