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