ฉันทราบดีที่สุดว่าควรสร้างไฟล์ชั่วคราวด้วยmktempแต่จะมีชื่อไพพ์ว่าอย่างไร
ฉันชอบสิ่งที่จะเป็นไปตาม POSIX ที่สุดเท่าที่จะทำได้ แต่ Linux เท่านั้นที่ยอมรับได้ หลีกเลี่ยง Bashisms dashเป็นเกณฑ์อย่างหนักของฉันเท่านั้นที่ผมเขียน
ฉันทราบดีที่สุดว่าควรสร้างไฟล์ชั่วคราวด้วยmktempแต่จะมีชื่อไพพ์ว่าอย่างไร
ฉันชอบสิ่งที่จะเป็นไปตาม POSIX ที่สุดเท่าที่จะทำได้ แต่ Linux เท่านั้นที่ยอมรับได้ หลีกเลี่ยง Bashisms dashเป็นเกณฑ์อย่างหนักของฉันเท่านั้นที่ผมเขียน
คำตอบ:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
ซึ่งแตกต่างจากการสร้างไฟล์ปกติซึ่งมีแนวโน้มที่จะถูกแย่งชิงโดยไฟล์ที่มีอยู่หรือลิงก์สัญลักษณ์การสร้างเนมไปป์mkfifoหรือฟังก์ชั่นพื้นฐานจะสร้างไฟล์ใหม่ในตำแหน่งที่ระบุหรือล้มเหลว บางอย่างที่: >fooไม่ปลอดภัยเพราะหากผู้โจมตีสามารถทำนายผลลัพธ์ของmktempการโจมตีผู้โจมตีสามารถสร้างไฟล์เป้าหมายสำหรับตัวเอง แต่mkfifo fooจะล้มเหลวในสถานการณ์ดังกล่าว
หากคุณต้องการการพกพา POSIX แบบเต็มรูปแบบmkfifo -m 600 /tmp/myfifoจะปลอดภัยต่อการหักหลัง แต่มีแนวโน้มที่จะปฏิเสธการให้บริการ หากไม่สามารถเข้าถึงตัวสร้างชื่อไฟล์แบบสุ่มได้คุณจะต้องพยายามลองใหม่
หากคุณไม่สนใจปัญหาความปลอดภัยเล็กน้อยเกี่ยวกับไฟล์ชั่วคราวคุณสามารถทำตามกฎง่าย ๆ : สร้างไดเรกทอรีส่วนตัวและเก็บทุกอย่างไว้ในนั้น
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
trap "rm -rf '$tempdir'" EXIT HUP INT TERMใช่หรือไม่ กับดักสามารถทำมันเป็นของตัวเองขยายตัวแปร?
$tempdirในเวลาที่trapคำสั่งถูกประเมินไม่ใช่เวลาที่กับดักถูกทริกเกอร์ ในกรณีนี้มันไม่ได้สร้างความแตกต่างใด ๆ ยกเว้นว่ารหัสของคุณจะแบ่งออกอย่างน่ากลัวหากมูลค่าของtempdirมีคำพูดเดียวในขณะที่รหัสของฉันทำงานได้เสมอ
$tempdirมีการประกาศในพื้นที่ของฉันและจะต้องมีการกำหนดทั่วโลกเพื่อให้กับดักเข้าถึงได้ เข้าท่าตอนนี้ ...
$tempdir ค่าไม่เปลี่ยนแปลงเช่นกันซึ่งเป็นที่ยอมรับสำหรับวัตถุประสงค์ทั่วไป เพียงระวังอย่าใช้ชื่อเดียวกันในการสร้างไฟล์ชั่วคราวหลายไฟล์ / dirs ...
ทางเลือกที่ปลอดภัยกว่าคือการใช้mktempเพื่อสร้างไดเรกทอรีอย่างปลอดภัยจากนั้นใส่ไพพ์ที่มีชื่อของคุณไว้ในไดเรกทอรีนั้นทำการลบrm -R $dirทิ้งในที่สุด
mktempไดเรกทอรีเนื่องจากเป็นคำตอบเดียวที่ยอมรับได้จริงๆในกรณีที่คุณไม่ได้สังเกตเห็น @Gilles โพสต์คำตอบนี้ในเชิงลึกแล้ว
ใช้ตัวเลือก "dry-run":
mkfifo $(mktemp -ut pipe.XXX)
-uตัวเลือก "ไม่ได้รับการสนับสนุน"
-tแต่ตราบใดที่มันทำงานได้อย่างน่าเชื่อถือฉันจะไปกับมัน
-tท้อที่ไหน?
mkstemp()ฟังก์ชัน ( linux.die.net/man/3/mkstemp ) -tสวิทช์ไม่ได้ท้อแท้มันเป็น-pที่ไม่ดีของฉัน
คุณสามารถใช้mktempเพื่อสร้างไฟล์ชั่วคราวจากนั้นลบมันและสร้างไปป์ที่มีชื่อด้วยชื่อเดียวกัน
ตัวอย่างเช่น:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPEก่อนที่จะmkfifoหลีกเลี่ยงปัญหา 'ไม่ปลอดภัย' ที่เกี่ยวข้องTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPEหรือไม่
mkfifoปลอดภัยจริง ๆ ไม่เหมือนกับการสร้างไฟล์ปกติจากเชลล์ ถ้าไม่ใช่การสร้างไฟล์แล้วการลบไฟล์นั้นจะไม่ช่วยเลย (อันที่จริงแล้วมันจะช่วยอำนวยความสะดวกให้กับงานของผู้โจมตีได้มากโดยไม่ต้องให้เขาเดาชื่อไฟล์) ดังนั้นคำตอบของ dogbane ใช้งานได้ แต่การสร้างไฟล์ระดับกลางเป็นภาวะแทรกซ้อนที่ไร้ประโยชน์
mktempหน้าคนที่เรียกว่า-uตัวเลือก 'ไม่ปลอดภัย'?
mktemp -dคุณยังคงมีบางจุดสำหรับการป้อนข้อมูลของคุณ ขอบคุณสำหรับความช่วยเหลือของคุณฉันขอขอบคุณจริงๆ!
mktemp -uไม่ปลอดภัยเมื่อสร้างไฟล์ปกติเพราะให้การป้องกันการปฏิเสธการบริการ (หากชื่อที่สร้างไว้ไม่แน่นอนพอ) แต่ไม่ป้องกันผู้โจมตีจากการสร้างไฟล์ภายใต้จมูกของโปรแกรม การสร้างฟีฟ่าแทนที่จะเป็นไฟล์ปกติเป็นกรณีการใช้งานที่หายากซึ่งหน้าคนไม่ได้พูดถึง
ใช้mkfifoหรือmknodใน Unix โดยกระบวนการที่แยกกันสองกระบวนการสามารถเข้าถึงไปป์ตามชื่อ - กระบวนการหนึ่งสามารถเปิดเป็นผู้อ่านและอื่น ๆ ในฐานะนักเขียน
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
ไปป์ที่มีชื่อสามารถลบได้เช่นเดียวกับไฟล์ใด ๆ :
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe สามารถใช้ไฟล์ปกติสำหรับการอ่านเพียงครั้งเดียว
mkfifoฉันตระหนักดีเกี่ยวกับท่อชื่อและ มันไม่ได้ตอบคำถามของฉันเกี่ยวกับไพพ์ที่มีชื่อmkdirชั่วคราว
mktempอยู่ในการสร้างไปป์ที่มีชื่ออย่างปลอดภัยได้อย่างไร
mktempผลลัพธ์เอง (ofcourse โดยการลบไฟล์ temp ก่อนแล้วจึงเรียกใช้mkfifoบนเดิม) mktempยังสามารถใช้เพื่อสร้างไดเรกทอรีชั่วคราวลองด้วย-t -dสวิตช์