Chạy lệnh mà không kế thừa môi trường của cha mẹ


14

Có cách nào để chạy lệnh "như thể" trong phiên đăng nhập mới không?

Tôi đã thử rồi env -i. Tuy nhiên, tôi không muốn xử lý các biến ENV khác nhau mà tôi phải đặt hoặc bỏ đặt.

Tôi cũng đã thử bash -c "some command"bash -l -c "some commmand", nhưng tất cả đều sao chép môi trường hiện tại.

Gần nhất tôi đã đến là một giải pháp ghetto: ssh me@localhost "some command"


Sử dụng /bin/bash --loginđể có được hành vi đó. Tôi sử dụng nó ví dụ để có được một cách thích hợp $PATH.
Daniel Beck

Đó là tương đương với /bin/bash --l, mà tôi đã thử. Nó sao chép môi trường ban đầu. Hãy thử nó : export SOME_VAL=something. Sau đó /bin/bash --login. Sau đó env | grep SOME_VAL. Giá trị sẽ ở đó.
dgo.a

Câu trả lời:


12

Đây là một câu trả lời không yêu cầu đặc quyền sudo hoặc mật khẩu của người dùng, nhưng vẫn cung cấp một môi trường như những gì bạn nhận được khi đăng nhập mới.

env -i HOME="$HOME" bash -l -c 'your_command'

Thí dụ:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Phá vỡ điều này để giải thích:

  1. env -i HOME="$HOME": Xóa môi trường. Việc -ithiết lập một môi trường trống rỗng không có biến nào . Điều này có vấn đề bởi vì điều đó có nghĩa là nếu bạn cố gắng chạy một cách ngây thơ bash -lthì nó sẽ không tải, .bash_profilev.v. vì HOMEkhông được đặt. Để giảm thiểu điều này, chúng tôi vượt qua một cách rõ ràng HOME="$HOME", tạo ra một môi trường nơi HOME(và chỉ HOME) được đặt.

  2. bash -l -c ...: Chạy lệnh mong muốn trong shell đăng nhập. Bạn sẽ muốn có một vỏ đăng nhập cho việc này vì chúng ta bắt đầu từ một môi trường sạch sẽ và cần tải lại mọi thứ.

Đáng chú ý:

  • Điều này không yêu cầu đặc quyền sudo ( sudophiên bản nào).
  • Điều này không yêu cầu nhập mật khẩu của người dùng ( suphiên bản nào).
  • Điều này không yêu cầu chạy máy chủ SSH và có khóa không mật khẩu có thể được sử dụng để đăng nhập lại vào máy ( sshphiên bản này).

Cảm ơn, Elliott. Nó trông rất đơn giản và rõ ràng ... bây giờ nó đã được chỉ ra cho tôi.
dgo.a

12
su -l $USER

sudo -u $USER -i

Đối với một cái gì đó thậm chí tích cực hơn hãy thử env -i bash, nhưng điều đó hủy bỏ mọi thứ bao gồm $ HOME và $ TATE.


2
Cảm ơn! Lệnh thứ hai cho tôi chính xác những gì tôi muốn. Tôi đã tìm kiếm hơn 2 giờ và không tìm thấy bất cứ điều gì gần với câu trả lời của bạn. Dựa trên câu trả lời của bạn, tôi đã quay lại man sudovà tìm thấy: "nếu người dùng mục tiêu giống như người dùng đang gọi, thì không cần mật khẩu." (The sudường như luôn luôn yêu cầu một mật khẩu.) Tôi như một kẻ ngốc đã bị bỏ qua một cái gì đó đơn giản như vậy trong đoạn đầu tiên của một mantrang :( Tôi tránh sudo ở nơi đầu tiên bởi vì tôi cho rằng nó luôn luôn hỏi mật khẩu. Cảm ơn một lần nữa!
dgo.a

1
chỉ là một gợi ý cho người khác ... nếu bạn đăng nhập như $USERbạn sẽ cần phải đăng nhập với quyền root và sau đó sudo -u ...là người dùng của bạn. Nếu bạn chỉ làm sudo -unhư người dùng, bạn sẽ kế thừa.
Adam Gent

điều này không hoạt động, rõ ràng, nếu bạn không có sudoquyền truy cập. Có một phương pháp thay thế mà không cần sudo?
dùng5359531

@ user5359531: Có - su -l $USER.
dùng1686

1
yêu cầu mật khẩu; Tôi đã đăng nhập thông qua xác thực khóa ssh, vì vậy tôi thậm chí không biết mật khẩu là gì. Và một dấu nhắc mật khẩu sẽ giết khả năng script. Cho đến nay, nó trông giống như ssh $USER@localhost <command>đang hoạt động tốt hơn
user5359531
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.