Câu trả lời:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Không giống như tạo tệp thông thường, dễ bị tấn công bởi một tệp hiện có hoặc một liên kết tượng trưng, việc tạo một ống tên thông qua mkfifo
hoặc chức năng cơ bản tạo ra một tệp mới ở vị trí đã chỉ định hoặc thất bại. Một cái gì đó giống như : >foo
là không an toàn bởi vì nếu kẻ tấn công có thể dự đoán đầu ra mktemp
thì kẻ tấn công có thể tự tạo tệp đích. Nhưng mkfifo foo
sẽ thất bại trong một kịch bản như vậy.
Nếu bạn cần tính di động POSIX đầy đủ, mkfifo -m 600 /tmp/myfifo
an toàn chống lại việc chiếm quyền điều khiển nhưng dễ bị từ chối dịch vụ; không có quyền truy cập vào trình tạo tên tệp ngẫu nhiên mạnh, bạn sẽ cần quản lý các lần thử lại.
Nếu bạn không quan tâm đến các vấn đề bảo mật tinh vi xung quanh các tệp tạm thời, bạn có thể thực hiện theo một quy tắc đơn giản: tạo một thư mục riêng và giữ mọi thứ trong đó.
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
? Bẫy có thể tự mở rộng biến?
$tempdir
tại thời điểm trap
lệnh được ước tính, không phải tại thời điểm bẫy được kích hoạt. Trong trường hợp này, nó không tạo ra bất kỳ sự khác biệt nào, ngoại trừ việc mã của bạn bị hỏng khủng khiếp nếu giá trị tempdir
chứa một trích dẫn, trong khi mã của tôi luôn hoạt động.
$tempdir
đã được tuyên bố tại địa phương và nó phải được xác định trên toàn cầu để bẫy có quyền truy cập vào nó. Làm cho ý nghĩa ngay bây giờ ...
$tempdir
giá trị cũng không thay đổi, điều này có thể chấp nhận cho tất cả các mục đích. Chỉ cần cẩn thận không sử dụng cùng tên để tạo nhiều tệp / thư mục tạm thời ...
Một cách khác an toàn hơn là sử dụng mktemp
để tạo một thư mục một cách an toàn, sau đó đặt đường ống có tên của bạn vào trong thư mục đó, thực hiện rm -R $dir
để loại bỏ nó cuối cùng.
mktemp
thư mục, vì đó thực sự là câu trả lời duy nhất được chấp nhận, Chỉ trong trường hợp bạn không để ý, @Gilles đã đăng câu trả lời này một cách sâu sắc.
Sử dụng tùy chọn "chạy khô":
mkfifo $(mktemp -ut pipe.XXX)
-u
tùy chọn "không được khuyến khích".
-t
, nhưng miễn là nó hoạt động đáng tin cậy, tôi sẽ sử dụng nó.
-t
nản lòng?
mkstemp()
hàm ( linux.die.net/man/3/mkstemp ). Công -t
tắc không được khuyến khích, đó là -p
, xấu của tôi.
Bạn có thể sử dụng mktemp
để tạo một tệp tạm thời, sau đó xóa nó và tạo một ống có tên cùng tên.
Ví dụ:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
trước khi mkfifo
tránh vấn đề 'không an toàn' liên quan đến việc thực hiện TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
thực sự an toàn, không giống như việc tạo tập tin thông thường từ trình bao. Nếu không, việc tạo một tệp sau đó xóa nó sẽ không giúp ích gì cả (thực tế nó sẽ tạo điều kiện thuận lợi cho công việc của kẻ tấn công bằng cách không yêu cầu anh ta đoán tên tệp). Vì vậy, câu trả lời của dogbane hoạt động, nhưng việc tạo tập tin trung gian là một sự phức tạp vô dụng.
mktemp
trang nào được gọi là -u
tùy chọn 'không an toàn' không?
mktemp -d
bạn vẫn có một số điểm cho đầu vào của bạn. Cảm ơn tất cả sự giúp đỡ của bạn, tôi thực sự đánh giá cao nó!
mktemp -u
không an toàn khi tạo một tệp thông thường, bởi vì nó cung cấp sự bảo vệ chống lại sự từ chối dịch vụ (nếu tên mà nó tạo ra đủ khó đoán) nhưng không ngăn kẻ tấn công tạo tệp dưới mũi chương trình. Tạo một fifo thay vì một tệp thông thường là trường hợp sử dụng hiếm hoi mà trang man không giải quyết.
Sử dụng mkfifo
hoặc mknod
trong Unix, trong đó hai quy trình riêng biệt có thể truy cập vào đường ống theo tên - một quy trình có thể mở nó dưới dạng trình đọc và quy trình còn lại là nhà văn.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
Ống có tên có thể bị xóa giống như bất kỳ tập tin nào:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe có thể được sử dụng một tệp thông thường để chỉ đọc một lần.
mkfifo
. Nó không giải quyết câu hỏi của tôi về các đường ống được đặt tên tạm thời , hơn là mkdir
giải quyết việc tạo các thư mục tạm thời.
mktemp
giải quyết một cách an toàn để tạo ra một đường ống có tên?
mktemp
chính kết quả (dĩ nhiên bằng cách xóa tệp tạm thời trước rồi chạy mkfifo
trên cùng). mktemp
cũng có thể được sử dụng để tạo một thư mục tạm thời, thử với -t -d
chuyển đổi.