ฉันทราบดีที่สุดว่าควรสร้างไฟล์ชั่วคราวด้วย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
สวิตช์