mktemp(1)
หน้าคนอธิบายได้ค่อนข้างดี:
โดยปกติแล้วเชลล์สคริปต์จำนวนมากใช้ชื่อของโปรแกรมที่มี pid เป็นคำต่อท้ายและใช้เป็นชื่อไฟล์ชั่วคราว รูปแบบการตั้งชื่อแบบนี้สามารถคาดเดาได้และสภาพการแข่งขันที่สร้างขึ้นนั้นง่ายสำหรับผู้โจมตีที่จะชนะ วิธีการที่ปลอดภัยกว่า แต่ยังคงด้อยกว่าคือการสร้างไดเรกทอรีชั่วคราวโดยใช้รูปแบบการตั้งชื่อเดียวกัน ในขณะที่สิ่งนี้อนุญาตให้หนึ่งสามารถรับประกันได้ว่าไฟล์ชั่วคราวจะไม่ล้มล้าง แต่ก็ยังอนุญาตให้ปฏิเสธการโจมตีบริการได้ง่าย ด้วยเหตุผลเหล่านี้จึงแนะนำให้ใช้ mktemp แทน
ในสคริปต์ฉันเรียก mktemp คล้าย ๆ
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
ซึ่งสร้างไดเร็กตอรี่ชั่วคราวที่ฉันสามารถใช้งานได้, และในที่ที่ฉันสามารถตั้งชื่อไฟล์ที่เป็นจริงได้อย่างปลอดภัย
mktemp
ไม่ใช่มาตรฐาน แต่มีอยู่ในหลายแพลตฟอร์ม โดยทั่วไป "X" จะถูกแปลงเป็นแบบสุ่มและอาจจะสุ่มมากขึ้น อย่างไรก็ตามบางระบบ (busybox ash สำหรับหนึ่ง) จำกัด การสุ่มนี้อย่างมีนัยสำคัญมากกว่าระบบอื่น ๆ
อย่างไรก็ตามการสร้างไฟล์ชั่วคราวที่ปลอดภัยนั้นมีความสำคัญมากกว่าแค่การเขียนสคริปต์เชลล์ นั่นเป็นเหตุผลที่หลามมีtempfile , Perl มีFile :: Temp , ruby มีTempfile , ฯลฯ ...