Неоднозначные параметры командной строки Perl и влияние на безопасность eval с -i?

Я знаю, что это неправильно. Я просто хочу знать, как Perl анализирует это.

Итак, я играл с perl, мне нужно было perl -neя набрал perl -ieповедение было довольно интересным, и я хотелось бы знать, что случилось.

$ echo 1 | perl -ie'next unless /g/i'

Итак, perl Прервано (дамп ядра)на этом. Чтение perl --helpЯ вижу, что -iпринимает расширение для резервных копий.

-i[extension]     edit <> files in place (makes backup if extension supplied)

Для тех, кто не знает, -eпросто eval. Итак, я думаю, что могло произойти одно из трех: либо оно было проанализировано как

  1. perl -i -e'next, если только /g/i'i не получит undef, остальное идет как аргумент e
  2. perl -ie 'следующий, если /g/i'я получаю аргумент e, остальное висит как имя файла
  3. perl -i"-e'next, если только /g/i'"целое вещь как аргумент i

Когда я запускаю

$ echo 1 | perl -i -e'next unless /g/i'

Программа не прерывается. Это наводит меня на мысль, что 'следующее, если только /g/i'не анализируется как буквальный аргумент для -e. Однозначно, вышеизложенное будет проанализировано таким образом, и это будет иметь другой результат.

Так что же это? Ну, поигравшись еще немного, я получил

$ echo 1 | perl -ie'foo bar'
Unrecognized switch: -bar  (-h will show valid options).

$ echo 1 | perl -ie'foo w w w'
... works fine guess it reads it as `perl -ie'foo' -w -w -w`

Поигравшись с вышеизложенным, я попробовал это...

$ echo 1 | perl -ie'foo e eval q[warn "bar"]'
bar at (eval 1) line 1.

Теперь я совсем запутался..Так как же Perl анализирует это? Наконец, кажется, что вы действительно можете получить команду Perl eval всего лишь -i. Имеет ли это значение для безопасности?

$ perl -i'foo e eval "warn q[bar]" '
6
задан Evan Carroll 22 May 2012 в 21:28
поделиться