bash -l
вызовите оболочку для входа в систему.
Из документации bash
, Вызов Bash:
-l
Заставьте эту оболочку действовать так, как если бы она была вызвана напрямую при входе в систему. Когда оболочка интерактивная, это эквивалентно запуску оболочки входа в систему. с 'exec -l bash'. Когда оболочка не интерактивна, логин Будут выполнены файлы запуска оболочки. 'exec bash -l' или 'exec bash'. --login' заменит текущую оболочку на Bash login оболочку. См. раздел "Файлы запуска Bash", где описано особое поведение оболочки оболочка для входа в систему.
У вас этот фрагмент в 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
быть произвольной командой оболочки - это не становится легче использовать). Не позволяйте этому коду выполняться за пределами вашей (надеюсь, межсетевой) тестовой машины до тех пор, пока он не пройдет тщательную проверку на безопасность.
Попробуйте использовать одинарные кавычки вместо двойных qoutes
system('echo "' . $line . '" | awk \'{$1=$2=$3=""; print $0}\'');
Одиночные кавычки будут отображать вещи почти всегда "как есть". Более подробную информацию вы можете найти в официальной документации