วิธีการอย่างถูกต้องหลบหนีเครื่องหมายอัศเจรีย์ในทุบตี?


11

วันนี้ฉันถูกจับ redhanded ในขณะที่พยายามรหัสกอล์ฟกำเนิดรหัสผ่านสำหรับ Twitter

import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

90 ตัวอักษร เนื่องจากเป็นพื้นที่ว่างจำนวนมากฉันจึงตัดสินใจยกระดับและทำให้มันใช้งานได้เช่นกัน

echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

139 ตัวอักษร ดียกเว้นเห็นได้ชัดว่าทุบตีโช้คที่เครื่องหมายอัศเจรีย์

badp@delta:~$ echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
bash: !/usr/bin/python\nimport: event not found

เครื่องหมายอัศเจรีย์น่ารำคาญ "มาหนีกันเถอะ" ฉันคิดว่า! ฉันมีตัวละครตัวหนึ่งเหลือเกิน

echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

เห็นได้ชัด ...

badp@delta:~$ echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
./pg: line 2: syntax error near unexpected token `('
./pg: line 2: `import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))'
badp@delta:~$ cat pg
#\!/usr/bin/python
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

ออกจากการเล่นกอล์ฟรหัส asinine ของฉัน - ฉันไม่สามารถอธิบายได้

ด้วย\!เครื่องหมายอัศเจรีย์ได้หลบหนียกเว้นว่ามันไม่ได้เป็นอย่างนั้นจริง ๆ เพราะ\!ถูกทิ้งให้อยู่ตาม - echoเพื่อรับ

วิธีหนึ่งอาจใช้\x21แทน แต่ฉันไม่มั่นใจว่าเป็นวิธีที่เหมาะสมในการหลีกเลี่ยงเครื่องหมายอัศเจรีย์ในคำสั่ง bash

tl; dr: คุณจะหนีจุดอัศเจรีย์ได้อย่างถูกต้องในคำสั่ง bash อย่างไร


ไม่มีใครจริงใช้!eventไวยากรณ์ในสถานที่แรก? มันทำให้ฉันมีปัญหาเท่านั้น
badp

ฉันใช้มันเกือบทุกวัน (เกือบตลอด 20 ปีที่ผ่านมา) !:0 !$และ!^ประหยัดเวลาและการพิมพ์มาก
Alexx Roche

คำตอบ:


7

ใช้เครื่องหมายคำพูดเดี่ยว:

echo -e '#!/usr/bin/python\nimport string as s,random;print "".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

กฎสำหรับการ!เรียงลำดับของกราฟต์บนกฎการอ้างอิงอื่น ๆ หลังจากนั้น (จาก csh) มันมีประโยชน์มากเมื่อเชลล์ไม่มีการแก้ไขบรรทัดคำสั่ง แต่บางคนยังคงใช้มันตอนนี้

ป.ล. เนื่องจากคุณกำลังเขียนโปรแกรมเพื่อทุบตี:

echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

สิ่งนี้ใช้ได้กับยูริสมากที่สุด:

echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg

(ไม่ใช่ว่าฉันเข้าใจว่าทำไมคุณต้องการสร้างสคริปต์หรือทำไมชื่อสคริปต์ต้องเป็นตัวอักษรสองตัว)


ไม่รู้เรื่อง$''เลย :) PS: มันคือการพยายามและใช้ตัวละครสำรองเหล่านั้น ฉันรู้สึกเสียเมื่อโพสต์ทวีตสั้นกว่า 140 ตัวอักษร
badp

@badp: ลองสร้างรหัสผ่านที่น่าจดจำ (เช่นเดียวpwgenกับpwgen -s.)
Gilles 'หยุดความชั่วร้าย'

อาจใช้ dadadodo สำหรับวลีรหัสผ่านที่น่าจดจำ แต่ไร้สาระแล้ว :)
badp

1

ฉันควร Googled ก่อนถาม

เนื่องจากคุณไม่ได้พึ่งพา bash เพื่อขยายตัวแปร [.. ] คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวแทน สตริงในเครื่องหมายคำพูดเดี่ยวจะไม่ถูกขยายด้วยการทุบตี

บีบแตรในการตอบกลับไปฉันจะหนีเครื่องหมายอัศเจรีย์?


1
ฉันไม่ได้ทำเครื่องหมายคำตอบนี้ว่ายอมรับเพราะมันตอบเฉพาะกรณีนี้เท่านั้น โดยทั่วไปแล้วคุณไม่สามารถหนีไปได้โดยไม่มีการขยาย
badp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.