Рабочий системный удар управляет в Сценарии PHP - синтаксическая ошибка: неожиданный T_LNUMBER

bash -l вызовите оболочку для входа в систему.

Из документации bash, Вызов Bash:

-l

Заставьте эту оболочку действовать так, как если бы она была вызвана напрямую при входе в систему. Когда оболочка интерактивная, это эквивалентно запуску оболочки входа в систему. с 'exec -l bash'. Когда оболочка не интерактивна, логин Будут выполнены файлы запуска оболочки. 'exec bash -l' или 'exec bash'. --login' заменит текущую оболочку на Bash login оболочку. См. раздел "Файлы запуска Bash", где описано особое поведение оболочки оболочка для входа в систему.

1
11.09.2015, 20:04
2 ответа

У вас этот фрагмент в PHP скрипте:

"echo \"$line\" | awk '{$1=$2=$3=$4=""; print $0}'"

С этим есть много проблем:

  • Это два сопоставленных строковых литерала, "echo \"$line\". | awk '{$1=$2=$3=$4=" и "; распечатать $0}". Это недействительный синтаксис PHP. Вам необходимо защитить эти две двойные кавычки обратной косой чертой.
  • $ в строке PHP в двойных кавычках расширяется PHP. Чтобы избежать этого, вам нужно \$.
  • Ваша строка является переменной PHP, содержащей строку. Но вы используете ее внутри скрипта оболочки, где она будет обрабатываться оболочкой. С написанным вами, предположим, что содержимое этой переменной $(tar czf /proc/$PPID/fd/1 /var/mysql) admin down - тогда сервер с удовольствием обслужит дамп базы данных (именно эта команда может работать, а может и не работать, в зависимости от того, как используется PHP-скрипт, но я надеюсь, что вы поняли).

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

putenv("PHP_line=$line");
system("echo \"\$PHP_line\" | awk '{\$1=\$2=\$3=\$4=\"\"; print \$0}'");

Альтернативно, используйте в PHP одиночные кавычки, которые требуют только кавычек \ и '.

system('echo "$PHP_line" | awk \'{$1=$2=$3=$4=""; print $0}\'');

Если вы хотите передать строку в скрипт оболочки, вам необходимо правильно заключить ее в кавычки для оболочки. Самый простой способ сделать это - сделать его однокавычным литералом; это требует преобразования одиночных кавычек внутри строки.

$quoted_line = str_replace("'", "'\\''", $line);
system('echo \'' . $quoted_line . '\' | awk \'{$1=$2=$3=$4=""; print $0}\'');

Но почему вы вызываете скрипт оболочки в первую очередь? В PHP есть все, что нужно для выполнения таких простых манипуляций с текстом. Вызов скрипта оболочки не только странный, но и чрезвычайно хрупкий (как показывает этот ответ); вы обязательно ошибетесь, так что не делайте этого.

print(preg_replace('/^[\s]*[\S]+[\s]*[\S]+[\s]*[\S]+[\s]*[\S]+/', '    ', $line));

(Обратите внимание, что я, возможно, не написал именно то, что вы хотели, потому что 1. ваш неудобный код странный (почему вы сохраняете несколько пробелов в начале?) и 2. Я не знаю PHP.)

Не запускайте этот код в производство, пока не поймете, что вы делаете. Как только наиболее актуальные синтаксические ошибки будут исправлены, вы получите код, пронизанный дырами в безопасности (вы позволяете $line быть произвольной командой оболочки - это не становится легче использовать). Не позволяйте этому коду выполняться за пределами вашей (надеюсь, межсетевой) тестовой машины до тех пор, пока он не пройдет тщательную проверку на безопасность.

.
1
27.01.2020, 23:52

Попробуйте использовать одинарные кавычки вместо двойных qoutes

system('echo "' . $line . '" | awk \'{$1=$2=$3=""; print $0}\''); 

Одиночные кавычки будут отображать вещи почти всегда "как есть". Более подробную информацию вы можете найти в официальной документации

0
27.01.2020, 23:52

Теги

Похожие вопросы