Не подлежит забвению

от автора

Вы не находите странным черту освистывать нечто до появления некого более функционального аналога оного и проявлять к этому нечто интерес после? На протяжении всего своего существования командная оболочка Windows неоднократно подвергалась жесткой критике, дескать, ее функциональность оставляет желать лучшего, что, казалось бы, должно было сойти на нет с появлением PowerShell, призванного устранить недочеты первой и упростить жизнь разработчикам и системным администраторам. Нет, PowerShell снискал должную популярность, но появился интерес и к самой командной строке особенно после того, как «селекционерами» были открыты способы запускать командные сценарии как WS[H|F] и HTA. Собственные эксперименты и наблюдения показали, что этим дело не ограничивается.

Некоторые символы в cmd наделены особой логикой, например, двоеточие в начале команды означает метку, а потому если командный сценарий состоит из единственной строки :label или даже одного двоеточия, интерпретатор просто ее проигнорирует; если после двоеточия стоит один из знаков перенаправления потока, сути это также не изменит — интерпретатор по-прежнему будет считать данную строку меткой, что в общем-то логично. Вообще, изменяя порядок использования некоторых спецсимволов командной строки, можно добиться любопытных побочных эффектов, таких как, скажем, запуск PHP кода в виде командного сценария:

:<?php /* @echo off   echo:Start   2>nul php "%~f0" %*   echo:End exit /b */ echo "\r";  foreach (array_slice($argv, 1, count($argv)) as $i) echo "$i\n"; ?> 

Или то же, но — bash:

:<<EOF @echo off   echo:Start   2>nul bash "%~f0" %*   echo:End exit /b EOF for i in $@;do echo $i;done 

Конечно же при этом обыгрываются особенности самих вызываемых интерпретаторов, но основная суть в том, что такое вообще возможно. Возможен также и запуск сценариев Perl, Ruby или Python как командных сценариев в виду наличия у перечисленных интерпретаторов ключа -x, заставляющий последние игнорировать первую строку передаваемого на исполнение кода. Строго говоря, данное утверждение справедливо для Python, а вот Perl и Ruby с данным ключом будут игнорировать все до тех пор, пока не встретят шебанги #!perl и #!ruby соответственно.

Perl:

@echo off   echo:Start   2>nul perl -x "%~f0" %*   echo:End exit /b #!perl foreach my $i (@ARGV) {print $i, "\n";} 

Ruby:

@echo off   echo:Start   2>nul ruby -x "%~f0" %*   echo:End exit /b #!ruby ARGV.each do |i| puts i;end 

Python:

@echo off&echo:Start&python3.4m -x "%~f0" %*&echo:End&exit /b from sys import argv for i in range(1, len(argv)): print(i) 

Подобный подход применим и к PowerShell, а вот утверждать, что описанное выше применимо и к другим интерпретируемым языкам, не стану, могу лишь допустить такую возможность причем с совсем другого ракурса.

ссылка на оригинал статьи https://habrahabr.ru/post/282816/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *