คุณสามารถทำได้ด้วย declare
แทน eval
, ตัวอย่างเช่น:
แทน:
string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"'
echo "Initial string: $string"
eval 'for word in '$string'; do echo $word; done'
ทำ:
declare -a "array=($string)"
for item in "${array[@]}"; do echo "[$item]"; done
แต่โปรดทราบว่ามันไม่ปลอดภัยกว่านี้หากข้อมูลเข้ามาจากผู้ใช้!
ดังนั้นถ้าคุณลองใช้คำว่า string ดังนี้
string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo" `hostname`'
คุณได้รับ hostname
ประเมินแล้ว (อาจมีบางสิ่งที่คล้ายกัน rm -rf /
)!
ความพยายามที่ง่ายมาก ๆ ที่จะปกป้องมันเพียงแค่แทนที่ตัวอักษรอย่าง backtrick `และ $
string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo" `hostname`'
declare -a "array=( $(echo $string | tr '`$<>' '????') )"
for item in "${array[@]}"; do echo "[$item]"; done
ตอนนี้คุณได้ผลลัพธ์เช่น:
[aString that may haveSpaces IN IT]
[bar]
[foo]
[bamboo]
[bam boo]
[?hostname?]
รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการและข้อดีข้อเสียที่คุณอาจพบในคำตอบที่ดี: https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided-in-bash-and-what-should-i-use-instead/17529221#17529221
แต่ก็ยังมีใบเวกเตอร์สำหรับการโจมตี ฉันต้องการได้ในวิธีทุบตีของข้อความสตริงเช่นในอัญประกาศคู่ (") แต่ไม่ตีความเนื้อหา .