Bash - 변수에 달러 기호가 포함되어 있습니다.

Bash - 변수에 달러 기호가 포함되어 있습니다.

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것은 여기서 문제가 되지 않으며 공백과 와일드카드는 문제입니다.

바라보다:

답변2

execphp에서 이 함수가 를 통해 구현되는 경우 sh -c cmd다음을 호출해야 합니다.

 exec("bash.sh '$path'")

쉘 스크립트 $$에서는 eval.

관련 정보