Tôi có một tập lệnh shell được giữ tại người dùng cục bộ của tôi được gọi ( executeAdM.sh
) và khi tôi thực thi tập lệnh này, tôi sẽ chuyển sang người dùng sudo bằng cách nhận lệnh từ tệp hướng dẫn. Nhưng khi tôi thực thi tập lệnh này, tôi cũng truyền các tham số, đây thực sự là một số đường dẫn thư mục của người dùng sudo. Xem kịch bản dưới đây.
Script cho người dùng cục bộ ( executeADM.sh
):
#!/bin/bash
echo password | sudo -S -l
sudo /usr/bin/su - user <<\EOF
#ls -lrt
pwd
for entry in $(ls -r)
do
if [ "$entry" = "testingADM.sh" ];then
./"$entry" "$1"
fi
done
EOF
Tôi đang thực hiện như trên:
./executeADM.sh "/global/u70/globe/ADM"
Khi đoạn script trên thực thi, nó chuyển thành công sang người dùng khác và với người dùng sudo tôi thực thi một for
vòng lặp tìm kiếm tập lệnh khác được gọi là testingADM.sh
.
Khi tìm thấy tập lệnh, tôi thực thi tập lệnh đó với tham số được truyền từ người dùng cục bộ và testingADM.sh
nên đặt đường dẫn cho tôi
Điều này không hoạt động - nó không đọc tham số được truyền từ người dùng cục bộ.
Tập lệnh người dùng sudo ( testingADM.sh
):
#!/bin/bash
changepath=$1
cd "$changepath"
pwd
Khi tôi mã hóa biến đường dẫn trong tập lệnh, tất cả đều hoạt động tốt. Nhưng tôi không muốn điều đó:
#!/bin/bash
changepath=somepath
cd "$changepath"
pwd
Vấn đề là thay vì đi đến "/global/u70/globe/ADM"
nó đi theo con đường như "/global/u70/globe/"
, Đó là con đường sau khi tôi làm sudo
. Nó chỉ là không vượt qua biến.
Với những gợi ý dưới đây, đây là những gì tôi đã kết thúc với:
#!/bin/bash
echo password | sudo -S -l
sudo /usr/bin/su - user <<EOF
#ls -lrt
#pwd
echo "$1"
./testingADM.sh "$1"
EOF
Các echo
lệnh in không có gì; một không gian trống được hiển thị. Nó hoạt động khi tôi thay đổi \EOF
đến EOF
.
Bất cứ ai có thể giải thích sự khác biệt giữa:
\EOF , "EOF" , 'EOF' , EOF
hoặc làm ba cái đầu tiên có cùng ý nghĩa? Vậy thì sự khác biệt giữa chúng là gì?