Làm thế nào để chuyển biến môi trường sang sudo su


30

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òn đơn giản sudo -iu ec2-user echo $DUMMYthì sao?
muru

1
Bản sao có thể có của Cách tạo `sudo` bảo toàn $ PATH?
kenorb

Câu trả lời:


39

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 -ptùy chọn của sulệnh bảo tồn các biến môi trường.


3
Tôi nghĩ "-E" bảo tồn các biến môi trường sudo.ws/man/sudo.man.html
Andy

1
@Andy Nhưng nó thường bị cấm bởi cấu hình sudo.
Gilles 'SO- ngừng trở nên xấu xa'

@cuonglm - cảm ơn. Những công việc này. Không nên gọi vỏ đăng nhập.
Umang

1
@kenorb: Không, -plà tùy chọn của su, không phải sudotrong trường hợp này
cuonglm

Có chủ đề khác nói -mbảo tồn biến, khác có -cgì 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
Vishrant

49

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 -ihoặc sudo -l. Nếu bạn đã kích hoạt tài khoản root, bạn cũng có thể chạy sumột mình, nhưng sudo sukhô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, sudocó công -Etắ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 -cnà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

2
Một cách tốt hơn để bảo tồn một biến môi trường là thêm nó env_keepvào sudoers. Có lẽ như thế này : Defaults env_keep += "DUMMY".
lcd047

@ lcd047 nhưng điều đó sẽ bảo vệ môi trường cho tất cả các yêu cầu 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.
terdon

Vâng, đó là một sự đánh đổi, nhưng không phải tất cả các biến môi trường đều có hại như nhau. Có một sự khác biệt đáng kể giữa mang LD_PRELOADvà mang LESSCHARDEF. Tôi không nghĩ sự tiện lợi nên là đối số chiến thắng ở đây ...
lcd047

1
@ lcd047 đề nghị của bạn chắc chắn có giá trị đăng tải như một câu trả lời. Quan điểm của tôi là nó không thực tế để xuất các biến tùy ý. Có, nếu có một biến cụ thể mà bạn luôn muốn xuất, đó là cách để đi nhưng không phải nếu bạn muốn làm điều này một lần và cho một biến được xác định trong cùng một phiên.
terdon

7

-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


Thật không may, nó sẽ chỉ thực hiện công việc nếu quản trị viên của bạn không hạn chế bạn sử dụng -E.
TorstenS

0

Đ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 suphần này, vì chúng ta có thể sử dụng --usertùy chọn sudo.

Chúng tôi muốn chuyển các biến môi trường để commandchạy qua sudo. Tuy nhiên sudosẽ 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à sudocó 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
"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.