Có một câu hỏi tương tự liên quan đến kịch bản 'gói', nơi bạn muốn thay thế cd
bằng một lệnh gọi hàm dựng sẵn cd
.
Tuy nhiên, dưới ánh sáng của shellshock et al và biết rằng bash nhập các hàm từ môi trường, tôi đã thực hiện một vài thử nghiệm và tôi không thể tìm cách gọi nội dung cd
từ tập lệnh của mình một cách an toàn .
Xem xét điều này
cd() { echo "muahaha"; }
export -f cd
Bất kỳ tập lệnh nào được gọi trong môi trường này bằng cách sử dụng cd
sẽ bị hỏng (xem xét ảnh hưởng của một cái gì đó như cd dir && rm -rf .
).
Có các lệnh để kiểm tra loại lệnh (được gọi một cách thuận tiện type
) và các lệnh để thực thi phiên bản dựng sẵn thay vì một chức năng ( builtin
vàcommand
). Nhưng, lo và kìa, chúng cũng có thể được ghi đè bằng các hàm
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Sẽ mang lại những điều sau đây:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Có cách nào để buộc bash sử dụng lệnh dựng sẵn một cách an toàn không, hoặc ít nhất phát hiện ra rằng một lệnh không phải là nội dung, mà không xóa toàn bộ môi trường?
Tôi nhận ra nếu ai đó kiểm soát môi trường của bạn, dù sao bạn cũng có thể bị lừa, nhưng ít nhất là đối với các bí danh, bạn có tùy chọn không gọi bí danh bằng cách chèn một \
trước đó.
env
không được xác định lại là một chức năng. Điều này thật đáng sợ. Trước tiên tôi nghĩ rằng các ký tự đặc biệt sẽ giúp - gọi với đường dẫn đầy đủ bao gồm /
, sử dụng .
để nguồn, v.v. Nhưng chúng cũng có thể được sử dụng cho tên hàm! Bạn có thể xác định lại bất kỳ chức năng nào bạn muốn, nhưng thật khó để quay lại gọi lệnh ban đầu.
#/bin/sh
nếu đây không phải là vỏ tương tác mặc định.
env
lệnh trước đây, như thế này:env -i <SCRIPT.sh>