ฉันจะป้องกันโฟลเดอร์ภายใน / tmp ไม่ให้ล้างข้อมูลได้อย่างไร


12

คำถามนี้เกี่ยวกับ Ubuntu 14.10 บนแล็ปท็อปนักพัฒนาของฉัน

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

ตอนนี้/tmp/fooจะถูกลบทุกครั้งที่ฉันรีบูตเครื่อง จนถึงตอนนี้ฉันเพิ่งสร้างโฟลเดอร์ใหม่ด้วยตนเองหลังจากรีบูต ตอนนี้ฉันเรียนรู้ในไดเรคทอรี / tmp เป็นอย่างไรบ้าง? ว่ามีงานทำเช่นนั้น

ฉันได้ดู/etc/init/mounted-tmp.confแต่ bashfu ของฉันและโดยเฉพาะอย่างยิ่ง findfu ของฉันไม่เพียงพอที่จะทำสิ่งที่ฉันต้องการ นี่คือข้อความที่ตัดตอนมาจากไฟล์:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

สิ่งที่ฉันต้องการทำคือเพิ่มเงื่อนไขที่ทำให้ลบทุก ๆ ด้าน/tmp/fooแต่ไม่ใช่/tmp/fooตัวเอง ฉันจะทำอย่างไร


คือ/tmp/fooไดเรกทอรีหรือไฟล์หรือไม่?
terdon

ไดเรกทอรี มีไฟล์อยู่ข้างใน
simbabque

ทำไมไม่เพิ่มmkdir /tmp/fooก่อนend script?
Hagen von Eitzen

เพียงแค่ FYI (คุณอาจทราบอยู่แล้ว): 14.10 ถึง EOL ในเดือนกรกฎาคม 2558 ดังนั้นคุณควรอัปเกรดเป็น Vivid โดยเร็วที่สุด
Léo Lam

คำตอบ:


20

/etc/init/mounted-tmp.confเป็นส่วนหนึ่งของmountallแพ็คเกจดังนั้นการอัปเดตใด ๆ ในแพ็คเกจนั้นและการเปลี่ยนแปลงที่แนะนำจะถูกเปลี่ยนกลับ

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

แต่เป็นไปตามมาตรฐานระบบแฟ้มลำดับชั้น (FHS) ;

เกี่ยวกับ/ tmp :

โปรแกรมต้องไม่ถือว่าไฟล์หรือไดเรกทอรีใด ๆ ใน / tmp ถูกสงวนไว้ระหว่างการเรียกใช้ของโปรแกรม

เกี่ยวกับ/ var / tmp :

ไดเร็กทอรี / var / tmp ถูกทำให้พร้อมใช้งานสำหรับโปรแกรมที่ต้องการไฟล์ชั่วคราวหรือไดเร็กทอรีที่สงวนไว้ระหว่างการรีบูตระบบ ดังนั้นข้อมูลที่เก็บไว้ใน / var / tmp จึงมีความคงทนมากกว่าข้อมูลใน / tmp

ดังนั้นคุณควรเปลี่ยนการเชื่อมโยงสัญลักษณ์ของคุณเพื่อใช้แทน/var/tmp/tmp


3
ตัวอย่างคลาสสิกเมื่อคุณมีค้อนทุกอย่างดูเหมือนเล็บ
WernerCD

@WernerCD คุณช่วยอธิบายความหมายของสิ่งนั้นได้ไหม? คุณกำลังพูดที่/var/tmpไม่ใช่ความคิดที่ดี?
simbabque

6
เมื่อทุกสิ่งที่คุณมีคือค้อน ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.ฉันกำลังบอกว่า OP ใช้ / tmp สำหรับบางสิ่งบางอย่างมันไม่ได้ใช้สำหรับ - ใช้ / tmp เป็นค้อนกับปัญหาของเขาในการรักษา tmp-but-not-ค่อนข้าง -tmp stuff / var / tmp คือ MEANT ที่จะถูกเก็บไว้ระหว่างการรีบูตดังนั้นคำตอบที่ถูกต้อง
WernerCD

8

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

อย่างไรก็ตามสิ่งที่ฉันทำบ่อย ๆ คือสร้างโฟลเดอร์ตัวเองภายใต้ / เลือกที่จะเก็บสิ่งที่ฉันไม่ต้องการกลับบ้าน เป็นสถานที่ที่เหมาะสมที่จะนำสิ่งต่าง ๆ ที่อยู่นอกเหนือการควบคุมของระบบปฏิบัติการหลัก


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

6

ชอบมาก

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

ตัวอย่าง:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

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


มันใช้งานไม่ได้จริง ๆ ในขณะที่คำสั่งทำงานตามที่คาดไว้เมื่อทำงานด้วยตนเองไดเรกทอรีที่ยังคงถูกลบออกหลังจากการแก้ไขfind /etc/init/mounted-tmp.confดูเหมือนว่ามีบางอย่างเกิดขึ้นที่นี่
terdon

wth EHM นั่นควรหมายความว่าบรรทัดที่ 1 เป็นความผิดพลาด อาจจะต้องเป็นญาติ (?)
Rinzwind

@terdon ใช่ดูเหมือนว่าจะต้องสัมพันธ์กับ / tmp /
Rinzwind

ฉันไม่คิดอย่างนั้นฉันได้ลองวิธีเรียงสับเปลี่ยนหลายแบบรวมถึง-path ./fooและแม้กระทั่ง-name '*foo*'และก็ไม่ทำงานเลย (บน Ubuntu Server 14.04) ฉันคิดว่านั่นไม่ใช่ไฟล์ที่ถูกต้องและเรากำลังมองหาที่ผิด สิ่งที่คุณแนะนำควรใช้งานได้ดูเหมือนจะไม่เป็นเช่นนั้น
terdon

0

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

แตะ /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me


มันจะมีประโยชน์อย่างไรถ้าฉันต้องการมีไดเรกทอรีชั่วคราว
simbabque

-1

เรียกใช้สิ่งนี้:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

เพิ่มไปที่/ etc / inittabดูที่นี่: ไฟล์ inittab อยู่ที่ไหน? :

foo:2345:boot:/bin/foodel

สิ่งนั้นจะสร้าง / etc / foo เมื่อบูตหากไม่มีอยู่แล้วจึงล้างมัน

สิ่งนี้จะทำเช่นเดียวกันกับการล็อกอิน bash:

echo "/bin/foodel" >> ~/.bashrc

อูบุนตูรุ่น 14 /etc/inittabไม่ได้ใช้ มีการระบุไว้อย่างชัดเจนและชัดเจนในหน้าคู่มือ
JdeBP

* facepalm * ขออภัย @JdeBP นี่คือสิ่งที่เกิดขึ้นกับฉันหลังจากเล่นปาหี่ลินุกซ์ 4 เวอร์ชันที่แตกต่างกัน เขาสามารถใส่รหัสในที่ที่ระบุไว้askubuntu.com/questions/34308/where-is-inittab-file
Daniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.