Các chức năng sau đây đã được thử nghiệm bằng cách sử dụng GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
. Hệ điều hành là Ubuntu 18. Hàm này có một tham số duy nhất là bộ mô tả tệp mong muốn cho FIFO ẩn danh.
MakeFIFO() {
local "MakeFIFO_upper=$(ulimit -n)"
if [[ $# -ne 1 || ${#1} -gt ${#MakeFIFO_upper} || -n ${1%%[0-9]*} || 10#$1 -le 2
|| 10#$1 -ge MakeFIFO_upper ]] || eval ! exec "$1<> " <(:) 2>"/dev/null"; then
echo "$FUNCNAME: $1: Could not create FIFO" >&2
return "1"
fi
}
Các chức năng sau đây đã được thử nghiệm bằng cách sử dụng GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
. Hệ điều hành là macOS High Sierra. Hàm này bắt đầu bằng cách tạo một FIFO có tên trong một thư mục tạm thời chỉ được biết đến với quá trình tạo ra nó . Tiếp theo, bộ mô tả tập tin được chuyển hướng đến FIFO. Cuối cùng, FIFO được hủy liên kết từ tên tệp bằng cách xóa thư mục tạm thời. Điều này làm cho các ẩn danh FIFO.
MakeFIFO() {
MakeFIFO.SetStatus() {
return "${1:-$?}"
}
MakeFIFO.CleanUp() {
local "MakeFIFO_status=$?"
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
MakeFIFO.SetStatus "$MakeFIFO_status" && true
eval eval "${MakeFIFO_handler:-:}'; true'"
}
local "MakeFIFO_success=false" "MakeFIFO_upper=$(ulimit -n)" "MakeFIFO_file="
MakeFIFO_handler="$(trap -p EXIT)"
MakeFIFO_handler="${MakeFIFO_handler#trap -- }"
MakeFIFO_handler="${MakeFIFO_handler% *}"
trap -- 'MakeFIFO.CleanUp' EXIT
until "$MakeFIFO_success"; do
[[ $# -eq 1 && ${#1} -le ${#MakeFIFO_upper} && -z ${1%%[0-9]*}
&& 10#$1 -gt 2 && 10#$1 -lt MakeFIFO_upper ]] || break
MakeFIFO_directory=$(mktemp -d) 2>"/dev/null" || break
MakeFIFO_file="$MakeFIFO_directory/pipe"
mkfifo -m 600 $MakeFIFO_file 2>"/dev/null" || break
! eval ! exec "$1<> $MakeFIFO_file" 2>"/dev/null" || break
MakeFIFO_success="true"
done
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
eval trap -- "$MakeFIFO_handler" EXIT
unset "MakeFIFO_handler"
"$MakeFIFO_success" || { echo "$FUNCNAME: $1: Could not create FIFO" >&2; return "1"; }
}
Các chức năng trên có thể được kết hợp thành một chức năng duy nhất sẽ hoạt động trên cả hai hệ điều hành. Dưới đây là một ví dụ về chức năng như vậy. Ở đây, một nỗ lực được thực hiện để tạo ra một FIFO thực sự ẩn danh. Nếu không thành công, thì một FIFO có tên được tạo và chuyển đổi thành một FIFO ẩn danh.
MakeFIFO() {
MakeFIFO.SetStatus() {
return "${1:-$?}"
}
MakeFIFO.CleanUp() {
local "MakeFIFO_status=$?"
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
MakeFIFO.SetStatus "$MakeFIFO_status" && true
eval eval "${MakeFIFO_handler:-:}'; true'"
}
local "MakeFIFO_success=false" "MakeFIFO_upper=$(ulimit -n)" "MakeFIFO_file="
MakeFIFO_handler="$(trap -p EXIT)"
MakeFIFO_handler="${MakeFIFO_handler#trap -- }"
MakeFIFO_handler="${MakeFIFO_handler% *}"
trap -- 'MakeFIFO.CleanUp' EXIT
until "$MakeFIFO_success"; do
[[ $# -eq 1 && ${#1} -le ${#MakeFIFO_upper} && -z ${1%%[0-9]*}
&& 10#$1 -gt 2 && 10#$1 -lt MakeFIFO_upper ]] || break
if eval ! exec "$1<> " <(:) 2>"/dev/null"; then
MakeFIFO_directory=$(mktemp -d) 2>"/dev/null" || break
MakeFIFO_file="$MakeFIFO_directory/pipe"
mkfifo -m 600 $MakeFIFO_file 2>"/dev/null" || break
! eval ! exec "$1<> $MakeFIFO_file" 2>"/dev/null" || break
fi
MakeFIFO_success="true"
done
rm -rf "${MakeFIFO_directory:-}"
unset "MakeFIFO_directory"
eval trap -- "$MakeFIFO_handler" EXIT
unset "MakeFIFO_handler"
"$MakeFIFO_success" || { echo "$FUNCNAME: $1: Could not create FIFO" >&2; return "1"; }
}
Dưới đây là một ví dụ về việc tạo một FIFO ẩn danh, sau đó viết một số văn bản cho cùng một FIFO.
fd="6"
MakeFIFO "$fd"
echo "Now is the" >&"$fd"
echo "time for all" >&"$fd"
echo "good men" >&"$fd"
Dưới đây là một ví dụ về việc đọc toàn bộ nội dung của FIFO ẩn danh.
echo "EOF" >&"$fd"
while read -u "$fd" message; do
[[ $message != *EOF ]] || break
echo "$message"
done
Điều này tạo ra đầu ra sau đây.
Now is the
time for all
good men
Lệnh dưới đây sẽ đóng cửa FIFO ẩn danh.
eval exec "$fd>&-"
Tài liệu tham khảo:
Tạo một đường dẫn ẩn danh để sử dụng sau này
Tập tin trong các thư mục có thể ghi công khai là bảo mật Shell nguy hiểm