Чому такий сценарій видаляє себе?


84

Якщо створити виконуваний файл із наступним вмістом і запустити його, він видалиться сам.
Як це працює?

#!/bin/rm


@DigitalTrauma Хе, це була моя перша думка, коли я це побачив.
кіт

це не про rm, це про #!. Питання може бути переосмислено, як працює будь-який виконуваний сценарій із #!твором.
njzk2

1
Як вам вдалося натрапити на це?
користувач1717828

1
Це, безумовно, епічне питання. Я шкодую, що можу схвалити це лише один раз.
Даніла Ківер

Відповіді:


112

Ядро інтерпретує рядок, починаючи з #!і використовує його для запуску сценарію, передаючи ім'я сценарію; так що це закінчується

/bin/rm scriptname

який видаляє сценарій. (Як вказує Стефан Шазелас , тут достатньо, щоб знайти сценарій - якщо ви вказали відносний або абсолютний шлях, це пройдено як є, інакше будь-який шлях, який був знайдений, є попереднім, включаючи, можливо, рядок порожніх, якщо ваш містить це і сценарій знаходиться в поточному каталозі. Можна пограти за допомогою ехо-скрипту - - щоб побачити, як це працює.)scriptnamePATHPATH#!/bin/echo

Як зазначав Хоббс , це означає, що ваш сценарій насправді є rmсценарієм, а не bashсценарієм - останній почав би з цього #!/bin/bash.

Див. Як Запуск програм для отримання детальної інформації про те, як це працює в Linux; коментарі до цієї статті дають детальну інформацію про інші платформи. #!називається shebang, ви знайдете багато інформації, шукаючи цей термін (спасибі Аарону за пропозицію). Як вказував jlp , ви також знайдете його як "фунт баг" або "хеш баг" ( #загальновідомий як "фунт" - у країнах, які не використовують £- або "хеш", і !як "удар") ). У Вікіпедії є додаткова інформація.


9
Інші назви "#!" Ви можете почути, як "фунт баг" і "хеш-баг". Докладніше див. En.wikipedia.org/wiki/Shebang_(Unix) .
jlp

@jlp Фунт чуб? Це на кшталт "баг за долар"? Хе ...
кіт

Нагадує про ol ' CrunchBang
Xen2050

1
Технічно аргументом to rmбуде шлях до сценарію, тобто перший аргумент до системного виклику execve (), здійсненого процесом. Як правило, якщо ви запустили сценарій як ./scriptname, такий буде, ./scriptnameі якщо ви посилаєтесь на нього як scriptname, це буде /path/to/scriptnameде /path/toзаписом, $PATHде цей скрипт був знайдений. Як правило, це буде лише в тому scriptnameвипадку, якщо у вас є порожня рядок $PATHі ви викликали сценарій як scriptnameі scriptnameє в поточному каталозі.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.