bash 스크립트에 변수를 전달하는 PHP 스크립트가 있습니다.
exec("bash.sh $path")
Bash 스크립트는 다음과 같습니다:
#!/bin/bash
path=$1
echo $path
경로가 다음과 같이 달러 기호로 끝나는 경우:myfile.$$$
출력은 다음과 같습니다myfile.32577$
에코가 정확하도록 변수에서 달러를 어떻게 이스케이프합니까?
답변1
PHP는 exec()
셸을 통해 명령을 실행하므로 스크립트가 실행되기 전에도 명령줄을 처리하는 셸이 있습니다. $$
셸의 프로세스 ID는 특수 변수이지만 변수인 것처럼 보이는 다른 항목에 대해서는 동일한 변수를 얻게 됩니다.
이것PHP 매뉴얼exec
셸에서 처리되는 명령이나 인수를 인용하라는 명시적 알림:
경고하다
사용자 제공 데이터가 이 함수에 전달되도록 허용하는 경우 다음을 사용하십시오.escapeshellarg()또는escapeshellcmd()사용자가 시스템을 속여 임의의 명령을 실행하도록 할 수 없는지 확인하십시오.
명령을 직접 실행할 수 있는 system()
/others 버전 (예: Perl의 / 다중 인수 버전)을 찾을 수 없으므로 유일한 옵션은 다음을 사용하는 것입니다.exec()
system()
exec()
escapeshellarg()
. 매개변수를 작은따옴표로 묶고 작은따옴표를 처리합니다.
$ php -r '$foo="$$$"; system("/bin/echo $foo");'
21836$
$ php -r '$foo="$$$"; system("/bin/echo " . escapeshellarg($foo));'
$$$
(이것을 사용 escapeshellcmd()
하여 전체 스크립트를 인용할 수 있지만 이것이 필요한 상황은 피하고 싶습니다. 셸 언어는 일부 모호한 상황에서는 인용이 실패할 정도로 복잡합니다.)
또한 Kusalananda가 언급했듯이 (평소와 같이) Bash 스크립트에서 변수를 참조하고 싶습니다. 따라서 .달러 기호 echo "$path"
대신 사용하는 echo $path
것은 여기서 문제가 되지 않으며 공백과 와일드카드는 문제입니다.
바라보다:
- 분사 Greg의 위키에서
- 언제 큰따옴표가 필요합니까?
답변2
exec
php에서 이 함수가 를 통해 구현되는 경우 sh -c cmd
다음을 호출해야 합니다.
exec("bash.sh '$path'")
쉘 스크립트 $$
에서는 eval
.