Bash

複雜情況下的引用規則

  • August 17, 2022

在編寫程式碼行時,我們有時需要考慮轉義一些字元。

我遇到了一個我自己無法回答的情況

在 PHP 中,exec 命令需要用引號 (’) 括起來的字元串。我們想呼叫命令 /bin/bash -c ,它還需要一個用引號 (’) 括起來的字元串

這個問題的解決方法如下:

$line = exec('/bin/bash -c \'read -e -p "Check to confirm string: " -i "'.$preFill.'" input; echo $input\'');

只要您不想在向使用者建議的文本中插入字元 (’),就沒有問題。我們可以看到一些使用 php -a 進行互動模式的範例:

php > $preFill = 'I m reach';
php > $line = exec('/bin/bash -c \'read -e -p "Check to confirm string: " -i "'.$preFill.'" input; echo $input\'');
Check to confirm string: I m reach
php >

問題是:我必須考慮哪些轉義規則才能以正確的方式將“我到達”放入 $preFill?

您需要對傳遞給bash的程式碼和傳遞給的程式碼sh(由php‘s開始exec())做一些引用:

$preFill = 'I m reach';
$prompt = 'Check to confirm string: ';
$bash_code = 'IFS= read -re -p ' .
             escapeshellarg($prompt) .
             ' -i ' .
             escapeshellarg($preFill) .
             ' input; printf "%s\n" "$input"';
$sh_code = 'exec /bin/bash -c ' . escapeshellarg($bash_code);
$output = exec($sh_code);
echo $output;

您還忘記IFS=and-r``read和一些圍繞 shell 參數擴展引號,記住echo不能用於任意數據

同時啟動shbash提示使用者似乎有點矯枉過正。

引用自:https://unix.stackexchange.com/questions/713920