Về cơ bản tôi cần phải làm điều này:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Điều này không hoạt động. Làm cách nào tôi có thể chuyển biến env $ DUMMY cho su? -p không hoạt động với -l.
Về cơ bản tôi cần phải làm điều này:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Điều này không hoạt động. Làm cách nào tôi có thể chuyển biến env $ DUMMY cho su? -p không hoạt động với -l.
Câu trả lời:
Bạn có thể làm điều đó mà không cần gọi shell đăng nhập:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
hoặc là:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
Các -p
tùy chọn của su
lệnh bảo tồn các biến môi trường.
-p
là tùy chọn của su
, không phải sudo
trong trường hợp này
-m
bảo tồn biến, khác có -c
gì khác biệt? Và một trong những bình luận trong câu trả lời này ngày -E
stackoverflow.com/questions/10488758/ trên
Pro tip: Không bao giờ thực sự có một lý do tốt để chạysudo su
. Để chạy một lệnh như một người dùng khác, sử dụng sudo -u username command
. Nếu bạn muốn một vỏ gốc, hãy chạy sudo -i
hoặc sudo -l
. Nếu bạn đã kích hoạt tài khoản root, bạn cũng có thể chạy su
một mình, nhưng sudo su
không hữu ích. Và vâng, tôi biết bạn nhìn thấy nó ở khắp mọi nơi.
Điều đó nói rằng, sudo
có công -E
tắc sẽ bảo vệ môi trường của phiên của người dùng:
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to
preserve the environment.
Vì vậy, trước tiên bạn sẽ cần xuất biến của mình và sau đó chạy sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
Điều bash -c
này là không cần thiết. Tuy nhiên, nếu tôi chạy sudo -Eu bob echo "$DUMMY"
, biến được mở rộng trước khi shell gốc được khởi chạy để nó không chứng minh rằng lệnh thực sự hoạt động:
$ sudo -u bob echo $DUMMY ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY' ## works as expected
D:dummy
env_keep
vào sudoers
. Có lẽ như thế này : Defaults env_keep += "DUMMY"
.
sudo
. Nó cũng cồng kềnh hơn cho một biến duy nhất. Điều đó chỉ hữu ích cho một cái gì đó luôn luôn phải được xuất khẩu.
LD_PRELOAD
và mang LESSCHARDEF
. Tôi không nghĩ sự tiện lợi nên là đối số chiến thắng ở đây ...
-E làm công việc cho tôi. Từ người đàn ông sudo
-
-E
, Cho biết chính sách bảo mật mà người dùng muốn phục vụ trước các biến môi trường hiện có của họ. Chính sách bảo mật có thể trả về lỗi nếu người dùng không có quyền để bảo vệ môi trường.--preserve-env
Điều gì sau đây là một giải pháp không cần một để thay đổi chính sách bảo mật.
Tôi sẽ bỏ qua su
phần này, vì chúng ta có thể sử dụng --user
tùy chọn sudo
.
Chúng tôi muốn chuyển các biến môi trường để command
chạy qua sudo
. Tuy nhiên sudo
sẽ không cho phép các biến môi trường được truyền vào một lệnh (có lý do bảo mật hợp lệ cho việc này, một số biến có thể nguy hiểm). Một shell có thể được sử dụng để đặt các biến môi trường và sudo
có thể chạy shell với tập lệnh được truyền cho nó. Do đó, sudo
để chạy một kịch bản đặt các biến môi trường.
var_a=someThing
var_b=someOtherThing
sudo bash -c "
export var_a=\"${var_a}\"
export var_b=\"${var_b}\"
the_command some_args
"
sudo -iu ec2-user echo $DUMMY
thì sao?