Как стать автором
Обновить

SFTP под root-ом в WinSCP для удаленной отладки(PyCharm)

Время на прочтение3 мин
Количество просмотров5.4K

Этот пост предназначен в первую очередь для новичков в разработке, впервые столкнувшихся с необходимостью запуска скриптов из-под 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)

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

Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии6

Публикации

Истории

Работа

Data Scientist
76 вакансий
Python разработчик
122 вакансии

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань