Използване на помощните програми за изчакване - strace за наблюдение на бездействието на потребителя за почивка
Наскоро проучвах какви решения съществуват за внедряване на уеб-ssh прокси сървър. Същността на задачата е да се даде възможност на потребителите да се свързват към произволен ssh сървър чрез уеб интерфейс. Обикновено web-ssh решенията са проектирани да се свързват със сървъра, на който са разположени, но за моята цел исках потребителят да може да посочи IP, порт, потребителско име и парола (или ключ) и да се свърже с произволен сървър. Не можах да намеря такова решение.
Всъщност, разбира се, има Guacamole, но за моята задача използването на това приложение беше твърде скъпо както по отношение на ресурсите за разработка, така и по отношение на функциите и тяхната организация, така че отказах Guacamole.
За отворения пакет shellinabox обаче намерих решение в един блог на немски, което реших да докарам до необходимото ниво. В резултат на това получихме хубав Docker контейнер, който може да се намери както в GitHub, така и в Dockerhub, който решава всички необходими задачи.
- Ресурсите на терминалния прокси се използват неефективно, защото е принуден да обслужва неизползвани сесии;
- необслужван прозорец с ssh в браузъра предизвиква чувство на меланхолия и уязвимост.
Като цяло реших, че искам да се уверя, че shellinabox прекъсва връзката, ако потребителят не пише нищо в конзолата (stdin) в продължение на няколко минути и не се получават данни на stdout.
Едно доста продължително търсене в Google ми показа, че целта може да бъде постигната с помощта на командата timeout и strace. Командата timeout беше нова за мен, нейната цел егарантира, че процесът се прекъсва при достигане на определено време за изчакване, в случай че не се е прекратил сам.
Използвам често командата strace, но обикновено я използвам, за да проследя защо дадена услуга или команда не работи според очакванията. Като част от търсенето ми как да наблюдавам активността на stdin, stdout каналите на даден процес, открих, че strace може да предостави и това:
Като цяло тези команди бяха това, което ми трябваше, за да изпълня плана си. Общата схема изглежда така:
- Когато се отвори нова връзка, shellinabox изпълнява скрипт на Python;
- Скриптът на Python разклонява демон за наблюдение на дейността на процеса, който следи своя собствен PID;
- python скрипт изпълнява (exec) ssh (заменяйки се с ssh).
За тези, които искат веднага да видят как работи целият скрипт, изпращам го тук. За останалите по-нататък на части.
Накратко кодът може да бъде представен по следния начин.
Кодът е прост и разбиращ се. Цялата магия е във функцията monitor_daemon:
където ни интересува най-много частта:
в който наблюдението започва в цикъл, който след определен период на изчакване прекратява ssh процеса, ако е необходимо.
Това всъщност е всичко. Решението се оказа доста просто, но отне известно време за проучване на наличните инструменти.
PS: Не съм професионален разработчик на Python, кодът не е оптимален. PPS: Ако някой има желание да подобри кода, добре дошли в хранилището, с радост ще приема PR.