การแทนคำสั่ง POSIX / กระบวนการ
_log()( x=0
while [ -e "${TMPDIR:=/tmp}/$$.$((x+=1))" ]
do continue; done &&
mkfifo -- "$TMPDIR/$$.$x" &&
printf %s\\n "$TMPDIR/$$.$x" || exit
exec >&- >/dev/null
{ rm -- "$TMPDIR/$$.$x"
logger --priority user."$1" --tag "${0##*/}"
} <"$TMPDIR/$$.$x" &
) <&- </dev/null
คุณควรใช้สิ่งต่อไปนี้:
exec >"$(_log notice)" 2>"$(_log error)"
นี่คือเวอร์ชันที่ใช้ประโยชน์จากmktemp
คำสั่ง:
_log()( p=
mkfifo "${p:=$(mktemp -u)}" &&
printf %s "$p" &&
exec <&- >&- <>/dev/null >&0 &&
{ rm "$p"
logger --priority user."$1" --tag "${0##*/}"
} <"$p" &
)
... ซึ่งทำได้เหมือนกันยกเว้นว่าจะอนุญาตให้mktemp
เลือกชื่อไฟล์สำหรับคุณ งานนี้เพราะเปลี่ยนตัวกระบวนการโดยไม่มีหมายถึงมนต์ขลังและทำงานในลักษณะที่คล้ายกันมากที่จะแทนคำสั่ง แทนการแทนที่การขยายตัวที่มีค่าของการดำเนินการคำสั่งที่อยู่ภายในเป็นคำสั่งเปลี่ยนตัวไม่เปลี่ยนตัวกระบวนการแทนที่ด้วยชื่อของการเชื่อมโยงระบบแฟ้มที่เอาท์พุทที่สามารถพบได้
ในขณะที่ POSIX เชลล์ไม่ได้ให้การพิสูจน์โดยตรงกับสิ่งนั้นการเลียนแบบมันทำได้ง่ายมาก สิ่งที่คุณต้องทำคือสร้างไฟล์พิมพ์ชื่อของมันออกมาจากมาตรฐานของการทดแทนคำสั่งและในพื้นหลังของการรันคำสั่งของคุณซึ่งจะส่งออกไปยังไฟล์นั้น ตอนนี้คุณสามารถเปลี่ยนเส้นทางไปเป็นค่าของการขยายตัวได้ - เหมือนกับที่คุณทำกับการทดแทนกระบวนการ ดังนั้น POSIX เชลล์จึงมีเครื่องมือทั้งหมดที่คุณต้องการแน่นอน - สิ่งที่จำเป็นต้องมีก็คือให้คุณใช้มันในแบบที่เหมาะกับคุณ
ทั้งสองเวอร์ชันข้างต้นให้แน่ใจว่าพวกเขาทำลายการเชื่อมโยงระบบไฟล์ไปยังไปป์ที่พวกเขาสร้าง / ใช้ก่อนที่จะใช้พวกเขา ซึ่งหมายความว่าไม่จำเป็นต้องมีการล้างข้อมูลหลังจากข้อเท็จจริงและที่สำคัญกว่านั้นสตรีมของพวกเขาจะใช้ได้เฉพาะกับกระบวนการที่เปิดใช้งานครั้งแรกเท่านั้น - และดังนั้นจึงไม่สามารถใช้ลิงก์ระบบไฟล์ของพวกเขาเป็นวิธีในการสอดแนม / จี้กิจกรรมการบันทึกของคุณ การทิ้งลิงค์ fs ไว้ในระบบไฟล์เป็นช่องโหว่ความปลอดภัย
อีกวิธีคือการพันผ้า มันสามารถทำได้จากภายในสคริปต์
x=${x##*[!0-9]*}
_log(){
logger --priority user."$1" --tag "${0##*/}"
} 2>/dev/null >&2
cd ../"$PPID.$x" 2>/dev/null &&
trap 'rm -rf -- "${TMPDIR:-/tmp}/$PPID.$x"' 0 ||
{ until cd -- "${TMPDIR:=/tmp}/$$.$x"
do mkdir -- "$TMPDIR/$$.$((x+=1))"
done &&
x=$x "$0" "$@" | _log notice
exit
} 2>&1 | _log error
โดยทั่วไปจะอนุญาตให้สคริปต์ของคุณเรียกตัวเองหากยังไม่ได้รับไดเรกทอรีการทำงานใน temp เพื่อบูต