ไฟล์ชั่วคราวที่สร้างด้วย mktemp นานแค่ไหน


20

ฉันสงสัยว่าไฟล์ชั่วคราวที่สร้างด้วย mktemp นานแค่ไหน มันแปลกสำหรับฉันที่จะพึ่งพาไฟล์ที่สามารถหายไปได้ตลอดเวลา ฉันใช้อูบุนตูถ้ามันสำคัญ

คำตอบ:


17

ฮะ? จากman mktemp:

DESCRIPTION
   Create  a  temporary  file  or directory, safely, and
   print its name.  TEMPLATE must  contain  at  least  3
   consecutive  `X's  in last component.  If TEMPLATE is
   not specified, use tmp.XXXXXXXXXX,  and  --tmpdir  is
   implied.   Files  are  created  u+rw, and directories
   u+rwx, minus umask restrictions.

mktempเพียงแค่เพิ่มสตริงแบบสุ่มเพื่อสร้างชื่อไฟล์ที่ไม่ซ้ำกัน ไม่มีใครจะลบออกโดยอัตโนมัติ


เนื่องจากดูเหมือนจะมีข้อโต้แย้งอยู่บ้างขอรายละเอียดเพิ่มเติมบ้าง mktempหน้าคนระบุว่า

ถ้าแม่ไม่ได้ระบุ--tmpdirจะถือว่าถ้า--tmpdirไม่ได้ระบุ/tmpจะถือว่า

ซึ่งหมายความว่าเพียงแค่การทำงานmktempจะสร้างไฟล์ที่เรียกว่าในไดเรกทอรีtmp.RANDOM_STRING / tmp ดังนั้นใช่การรันmktempโดยไม่มีพารามิเตอร์จะสร้างไฟล์ที่จะถูกล้างพร้อมกับทุกอย่างใน/tmpลักษณะที่ขึ้นอยู่กับระบบ สำหรับไฟล์ดังกล่าว$TMPTIMEตัวแปรจะมีความสำคัญตามที่อธิบายไว้ในคำตอบของคริสด้านล่าง สำหรับการกระจายจำนวนมากเริ่มต้นคือการล้าง/tmpทุกบูตเพราะมีการตั้งค่า$TMPTIME 0ในการแจกแจงส่วนใหญ่ (หากไม่ใช่ทั้งหมด) ค่านี้จะถูกตั้งค่าในไฟล์/etc/default/rcS:

$ grep TMPTIME /etc/default/rcS
TMPTIME=0

ตอนนี้ถ้าคุณทำระบุแม่แบบเช่นmktemp fooXXXนั้นไฟล์ที่เรียกว่าfooXXXถูกสร้างขึ้นในไดเรกทอรีปัจจุบันที่XXXจะถูกแทนที่ด้วยสามตัวอักษรแบบสุ่ม ไฟล์นี้จะไม่ถูกลบเว้นแต่คุณเลือกที่จะทำเช่นนั้น เฉพาะไฟล์ในไดเรกทอรีชั่วคราว "ทางการ" เช่น/tmpเคยถูกลบโดยอัตโนมัติโดยระบบไม่มีบิตวิเศษที่คุณสามารถตั้งค่าที่ระบุไฟล์ชั่วคราวไฟล์ภายนอก/tmpและไฟล์ ILK จะไม่ถูกลบโดยอัตโนมัติ

เพื่อตอบคำถามหลักของคุณแน่นอนว่ามันแปลกที่ต้องพึ่งพาไฟล์ที่สามารถหายไปได้นั่นคือสาเหตุที่ผู้คนไม่พึ่งพาไฟล์ tmp พวกเขาสร้างขึ้นเพื่อเก็บข้อมูลชั่วคราวและเราสามารถลืมพวกเขาได้ มีหลายวิธีในการสร้างไฟล์ถาวรที่มีชื่อแบบสุ่ม ตัวอย่างเช่น:

echo "foo" > $RANDOM.txt
echo "foo" > `mktemp fooXXX.txt`
echo "foo" > $$.txt

2
นี่ไม่ตอบคำถามของฉัน มันบอกว่ามันสร้างไฟล์ "ชั่วคราว" และไม่ให้ข้อมูลว่ามันจะอยู่ได้นานแค่ไหน ดังนั้นมันจะคงอยู่ตลอดไป? ไดเร็กทอรี tmp รับข้อมูลจากการบูทระบบหรือไม่?
MYV

@Maksim ดูคำตอบที่ปรับปรุงแล้ว นอกจากนี้คำถามของคุณไม่ได้ถามเมื่อtmpมีการล้างไดเรกทอรี แต่เมื่อไฟล์ที่สร้างด้วยmktempถูกลบ อย่างที่คุณเห็นทั้งสองไม่จำเป็นต้องเกี่ยวข้องกัน :)
terdon

6

โปรดจำไว้ว่าไฟล์ชั่วคราวอาจถูกลบระหว่างการบูตระบบหรือตาม TMPTIME /etc/cron.daily/tmpwatchโปรดดูสิ่งที่คุณมีใน

/var/tmp/ในทางกลับกันภูมิคุ้มกันมักจะtmpwatchเป็น

ไฟล์ชั่วคราวถูกสร้างขึ้นในช่วงเวลาสั้น ๆ (ปกติ) พวกเขามีชื่ออุณหภูมิดังนั้นจึงไม่ใช่เรื่องง่ายที่จะดำเนินการโจมตีเวลาและมักจะถูกลบเมื่อโปรแกรมไม่ต้องการอีกต่อไป โดยปกติสคริปต์ของคุณจะเก็บไฟล์นี้ไว้ในช่วงเวลาสั้น ๆ โดยปกติจะประมวลผลข้อความหรือไฟล์อื่น ๆ และมันจะทำการลบออกทันทีที่ไม่จำเป็น หากสคริปต์ของคุณจะขัดข้องคุณจะต้องทำตามขั้นตอนการดูแลรักษาโฟลเดอร์ / tmp อีกครั้ง (ถ้านั่นคือสิ่งที่คุณตัดสินใจวางไว้)

คุณไม่จำเป็นต้องสร้างไฟล์ชั่วคราว /tmp


เมื่อเห็นว่าmktempสามารถเรียกใช้ในไดเรกทอรีใด ๆ และเพียงสร้างชื่อไฟล์โดยพลการฉันไม่เห็นว่าสิ่งนี้มีส่วนเกี่ยวข้องกับtmpwatchอะไร
terdon

1
โดยค่าเริ่มต้นสร้างไฟล์ในmktemp /tmp/
Chris

เฉพาะในกรณีที่คุณไม่ได้ให้ TEMPLATE ดูคำตอบที่อัปเดตของฉัน
terdon

1

ไฟล์อุณหภูมิไม่หายไปด้วยตนเอง พวกเขาเรียกว่าไฟล์ temp เพียงเพราะในสคริปต์หรือเซสชั่นของคุณหรือที่ใดก็ตามที่คุณทำพวกเขาคุณคาดว่าจะลบพวกเขาเมื่อคุณเสร็จสิ้น หรือปล่อยให้พวกเขานอนตะแคงถ้านั่นคือสิ่งที่คุณ mktemp มีไว้เพื่อให้คุณสามารถสร้างไฟล์ที่มีชื่อบางอย่างที่ไม่เหมือนใครเพื่อไม่ให้เขียนทับไฟล์ที่มีอยู่บางไฟล์


ระบบบางระบบใช้TMPTIMEหรือไม่
เอียงอาย

@demure ใช่ แต่เพื่อล้าง/tmpหรือไดเร็กทอรี tmp อื่นเท่านั้น มันจะไม่เพียงแค่ลบไฟล์ที่สร้างโดยผู้ใช้แบบสุ่ม
terdon

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