เมื่อใช้ os.system () มักจำเป็นต้องหลีกเลี่ยงชื่อไฟล์และอาร์กิวเมนต์อื่น ๆ ที่ส่งผ่านเป็นพารามิเตอร์ไปยังคำสั่ง ฉันจะทำเช่นนี้ได้อย่างไร? โดยเฉพาะอย่างยิ่งสิ่งที่สามารถใช้ได้กับหลายระบบปฏิบัติการ / เชลล์ แต่โดยเฉพาะอย่างยิ่งสำหรับ bash
ฉันกำลังทำสิ่งต่อไปนี้ แต่แน่ใจว่าต้องมีฟังก์ชั่นไลบรารีสำหรับสิ่งนี้หรืออย่างน้อยก็เป็นตัวเลือกที่หรูหรา / แข็งแกร่ง / มีประสิทธิภาพมากขึ้น:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
แก้ไข:ฉันยอมรับคำตอบง่ายๆของการใช้เครื่องหมายคำพูดไม่รู้ว่าทำไมฉันถึงไม่คิดอย่างนั้น ฉันเดาว่าเป็นเพราะฉันมาจาก Windows โดยที่ "และ" ทำงานแตกต่างกันเล็กน้อย
เกี่ยวกับความปลอดภัยฉันเข้าใจข้อกังวล แต่ในกรณีนี้ฉันสนใจวิธีแก้ปัญหาที่ง่ายและรวดเร็วซึ่ง os.system () มีให้และแหล่งที่มาของสตริงนั้นไม่ได้สร้างโดยผู้ใช้หรืออย่างน้อยก็ป้อนโดย a ผู้ใช้ที่เชื่อถือได้ (ฉัน)
sh_escape
ฟังก์ชั่นจะหลบหนีออกมาและช่องว่างและเอาปัญหาการรักษาความปลอดภัยโดยเพียงแค่การสร้างไฟล์ที่เรียกว่าสิ่งที่ต้องการ;
foo.txt\;\ rm\ -rf\ /