Giả sử tôi có một tập lệnh bash hoạt động như một tập tin cấu hình cho một tập lệnh bash khác:
cấu hình
verbose=yes
echo "Malicious code!"
name=test
script.sh:
source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"
Vấn đề là, điều này không an toàn lắm, vì mọi thứ được đặt trong config.sh đều được chạy:
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
Để làm cho nó an toàn hơn, tôi nghĩ rằng tôi đã thực hiện các hoạt động chuyển nhượng và chỉ thực hiện chúng. Tôi sẽ thực hiện bằng cách chuyển source
một "tài liệu ở đây":
script.sh:
source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"
(Vâng, tôi biết regex không mạnh đến thế; nó chỉ là một trình giữ chỗ.) Đáng buồn thay, nguồn dường như không chơi tốt với tài liệu ở đây:
./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''
Rõ ràng là tôi có thể thực hiện bất kỳ số lượng nào để có được dữ liệu cấu hình từ một tệp và dù sao đó cũng có thể an toàn hơn.
Nhưng tôi vẫn còn ngứa với điều này; Tôi muốn tìm hiểu xem những gì tôi đã thử có thể làm việc. Bất kỳ đề xuất?
while IFS== read -r var value; do case $var in |*[!0-9A-Z_a-z]*) complain;; *) eval "config_$var=\$value";; esac; done <config
(cảnh báo: đã nhập vào trình duyệt của tôi, hãy kiểm tra nó! ) Đừng quên không cho phép nhập các biến như PATH
, IFS
tiền tố như config_
một cách tiếp cận an toàn.
/dev/fd/[num]
. Thi đua này là đơn giản : 3<<HEREDOC . /dev/fd/3\n*file contents*\nHEREDOC\n
. Sự thay thế quá trình thường là một đường ống, trong khi heredocs thường là các nút xóa vỏ trước khi xóa chúng - vì vậy chúng chỉ tồn tại dưới dạng mô tả. trong dash
chúng là đường ống. sự khác biệt lớn khác là bạn có thể chỉ định fd [num]
cho heredocs.
<<EOF
) hoạt động như một chuyển hướng đầu vào thông thường (< file
) vàsource < file
không hoạt động -source
cần phải có một đối số tên tệp. Do đó, bạn cần thay thế quá trình (<(command)
), trông giống như một đối số tên tệp.