Этот пост предназначен в первую очередь для новичков в разработке, впервые столкнувшихся с необходимостью запуска скриптов из-под root-а, взаимодействующих с ресурсами/устройствами, доступ до которых возможен только с сервера приложений, находящимся за NAT-ом. Частая ситуация в телекоме.

Дано: личная учетная запись на сервере приложения, ssh-доступ на этот сервер и беспарольный подъем до root-а у личной УЗ. Доступ под рутом отключен, скрипты функционируют из-под сервисного пользователя и вызываются различными сервисами и приложениями.

Задача: необходимо создать новый скрипт / пофиксить баги в существующем скрипте / расширить функционал скрипта с правами 755.

Проведенные мероприятия: смена прав на директории/файле, запуск скрипта из консоли, правки в Vim(выход Esc :q!), отладка print-ами, отрицание, гнев, торг, депрессия, принятие. Принятие что жизненно необходима отладка в нормальном дебаггере любимой IDEA.

Решение: получить видимость файлов по sftp как для root-а и прокинуть удаленную отладку.

Для начала спросим сервер где у него находится путь установки sftp-сервера, если отсутствует утилита, то предварительно поставим ее:

sudo apt install mlocate
locate sftp-server

В ответ получаем множество путей, в названии которых встречается упоминание sftp-server. Нас интересует конечный файл, в названии которого больше ничего нет.

Например:

/usr/libexec/openssh/sftp-server

Далее переходим в настройки WinSCP. Расширенные настройки соединения -> Среда -> SFTP и прописываем в параметрах протокола в поле "Сервер SFTP" найденный выше путь.

Затем указываем в качестве приложения по-умолчанию для открытия файлов с расширением *.py нашу IDEA. По двойному клику копия скрипта будет сохранена во временную директорию соединения, а сам скрипт открыт, например, в PyCharm.

Пробрасываем порты с удаленного сервера к своей локальной.

Для этого нам понадобится:

  • непопулярный порт на сервере, пусть будет 50005(его придется при каждом обрыве соединения менять, при падении VPN он остается занятым еще несколько часов).

  • непопулярный порт на локальной машине, пусть будет 555.

  • логин пользователя, пусть будет user

  • ipv4-адрес сервера, пусть будет 192.250.225.62

ssh -f -N -R 50005:127.0.0.1:555 user@192.250.225.62

Переходим в настройки Run/Debug Configuration Templates(alt+shift+F9 -> Edit Configuration... -> Edit Configuration Templates) и выбираем там Python Debug Server.

Прописываем в IDE host name: 127.0.0.1. Можно оставить и localhost, но иногда PyCharm не может по этому значению провести сопоставление.

Прописываем в Port: 555(непопулярный порт на локальной машине на который мы делали проброс порта с удаленного сервера выше)

В Path mapping указываем сопоставление между путем скрипта на сервере и его копией на локальной машине.

Заполняем поля IDE host name: 127.0.0.1(или localhost), Port: 555 и сопоставление путей между локальной копией скрипта и ее путем на сервере.

Для того что бы найти путь к временной директории куда WinSCP сохранил копию подопытного скрипта можно в контекстном меню файла выбрать Open in... -> File explorer в свойствах

Далее устанавливаем на удаленный сервер версию указанную в подсказках к Run/Debug Configuration

В данном примере это:

pip install pydevd-pycharm~=212.5457.59

В точку входа скрипта(на удаленном сервере) добавляем строки указанные во втором пункте(в нашей локальной копии они тоже должны обновиться). Изменив порт на тот непопулярный порт на сервере что мы указывали выше, 50005

import pydevd_pycharm

#классы скрипта

if __name__ == “main”:
    pydevd_pycharm.settrace('127.0.0.1', port=50005, stdoutToServer=True, stderrToServer=True)
    #тело скрипта

Запускаем в PyCharm дебаггер на созданной конфигурации, расставляем брэйкпоинты, дожидаемся строк

Waiting for process connection...

Starting debug server at port 555

Use the following code to connect to the debugger:

import pydevd

pydevd.settrace('localhost', port=555, stdoutToServer=True, stderrToServer=True)

Запускаем скрипт на сервере так как делали это раньше и наслаждаемся удаленной отладкой.

Комментарии (6)


  1. Pab10
    20.11.2021 12:21
    +1

    Какие причины не использовать SSH-интерпритатор с удаленной отладкой из коробки? blog.jetbrains.com/pycharm/2019/01/pycharm-2019-1-eap-2


    1. Kotofeus
      20.11.2021 13:15
      +1

      Он же вроде в Community недоступен?

      С другой стороны есть vscode в котором это "из коробки"...


      1. lvo
        20.11.2021 14:53

        На скриншоте PyCharm Pro.


    1. lvo
      20.11.2021 14:57
      +1

      Возможно, дело в sudo sftp-server. Такой способ доступа в PyCharm пока не поддерживается. С другой стороны, есть возможность настроить ssh+sudo: синхронизация файлов от имени пользователя, но запуск скриптов от sudo.


    1. Pab10
      20.11.2021 17:34

      Ну так нужно уточнять о какой версии IDE идет речь, что приходится городить такие адовые костыли и открывать рандомные порты на проде. Действительно, PyCharm Community Edition обрезан со всех сторон: www.jetbrains.com/ru-ru/pycharm/features/#chooseYourEdition
      Странно только что работодатель зажал $200 на лицензию.


  1. OlgaPy Автор
    29.11.2021 01:32

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

    Когда я нашла этот способ, года полтора назад, в доступе действительно была лишь Community версия. Причины этого не рассматриваются в рамках этого поста. Руки добрались описать только сейчас, после того как меня третий раз за месяц об этом спросили.

    Есть системные инженеры, администраторы, девопсы и другие позиции на которых необходимость закупки лицензии IDE неочевидна, не говоря уже о прочих факторах.