Всем доброго хабрадня!
Сегодня я расскажу вам, уважаемые читатели, об одной бредовой идее, пришедшей в мою голову и даже воплощённой в жизнь.
Для начала немного предыстории. Недавно возникла очень острая необходимость в ssh доступе на некоторый unix-based компьютер, дабы выполнить там svn diff > mypatch.diff
и перекинуть результат по ftp. Но оказалось, что целевая машина по некоторым причинам не хочет пинговаться! Причём, по словам админов, и не предвидится пинг к ней, хотя выход в интернет она имеет. И я решил, что неплохо бы пробросить ssh через что-то стороннее. В голову сразу начали лезть VPN, reverse ssh, туннели и прочее. Но для большинства решений нужна дополнительная машина и/или дополнительный софт, либо это требует перенастройки самой сети (что для меня совсем не вариант — сеть-то не моя). Я уже готов был отчаяться и гуглить упорнее, но тут в мою не совсем здоровую голову пришла мысль: а что если заюзать дропбокс?
Собственно, идея предельно проста. В дропбоксе делаем папку, за которой на целевой машине следит скрипт. И при обнаружении в ней нужного файлика (в моём случае — *.sh
), запускает его, перенаправляя stdout и stderr в текстовый файлик. А тот текстовый файлик опять таки кидает в дропбокс, но в другую папочку.
В итоге, вышло примерно следующее: в дропбоксе есть папки shell_in, shell_out и shell_done. Скрипт следит за первой папкой, при обнаружении скрипта перемещает его во временную папку, добавляет дату-время к имени, выполняет, вывод записывает в файлик и кидает в shell_out, а отработавший скрипт перемещает в shell_done, для истории.
Сам же скрипт, который мы будем кидать, может делать что угодно, что не требует user interaction. Например, копировать некие файлы в дропбокс — вот и некий аналог FTP нарисовался!
Плюсы и минусы такого метода:
+ от целевой системы требуется только дропбокс и коннект к сети
+ скрипты выполняются от имени пользователя, под которым запущен демон
+ гибкость подхода, легко портируется под любую OS
+ скрипты можно запускать отовсюду, где есть текстовый редактор и дропбокс
- гудбай MC =(
- низкая скорость передачи файлов в сравненнии с ftp
- нет возможности запускать скрипты через sudo
- ни разу не риалтайм
- даже для простейших команд надо создавать скрипт
- чтобы узреть вывод приложения, приходится читать текстовый файлик
- да и вообще такой способ — бред, но прикольный =)
В общем, решил я это дело реализовать. В качестве инструмента выбрал shell script. Хорошего платформонезависимого способа слежения за файловой системой сходу не нашёл, так что решил проверять наличие файлов в бесконечном цикле со sleep
'ами в 5 секунд. Если кто подскажет хороший способ так не делать, — буду признателен.
Код тривиален, но на всякий случай я выкладываю его на github — вдруг да пригодится кому?
В планах — сделать аналог для windows, демон на batch, ищущий тоже батники. Лучше же всего — переписать всё на C++ или Python — для платформонезависимости (и заодно для задействования платформенных нотификаторов об изменении файла).
PS: всё вышеизложенное сделано just for fun, для реальной работы лучше использовать что-нибудь типа xmpp-ssh, или же иные хорошие вещи. Хотя, такая штука может и пригодиться, например, поможет запустить TeamViewer, ежели он выключен.
Автор: silvansky