Chạy một kịch bản shell như một người dùng khác


42

Cách tốt để chạy tập lệnh shell là một người dùng khác. Tôi đang sử dụng Debian etch và tôi biết người dùng nào tôi muốn mạo danh.

Nếu tôi đang làm bằng tay, tôi sẽ làm:

su postgres
./backup_db.sh /tmp/test
exit

Vì tôi muốn tự động hóa quy trình, tôi cần một cách để chạy backup_db.sh dưới dạng postgres (kế thừa môi trường, v.v.)

Cảm ơn!

Câu trả lời:


67

Để chạy tập lệnh của bạn dưới dạng một người dùng khác dưới dạng một lệnh, hãy chạy:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Tôi khuyên bạn luôn luôn sử dụng các đường dẫn đầy đủ trong các tập lệnh như thế này - bạn không thể luôn đảm bảo rằng bạn sẽ ở đúng thư mục khi bạn su (có thể ai đó đã thay đổi homedir trên bạn, ai biết được). Tôi cũng luôn sử dụng đường dẫn đầy đủ đến su (/ bin / su) vì tôi bị hoang tưởng. Có thể ai đó có thể chỉnh sửa đường dẫn của bạn và khiến bạn sử dụng phiên bản su bị xâm phạm.


Nó sẽ luôn yêu cầu tôi gõ mật khẩu? Làm thế nào có thể làm tròn nó?
zjffdu

2
Nó sẽ luôn yêu cầu bạn nhập mật khẩu nếu bạn đang chạy lệnh với tư cách là người dùng không root. Nếu bạn muốn tránh mật khẩu, bạn có thể cấu hình sudo để cho phép điều đó. TUY NHIÊN - cấu hình sudo để cho phép người dùng chạy su cho phép họ trở thành bất kỳ người dùng nào. Tôi sẽ đề nghị tạo một tập lệnh cho lệnh của bạn, đặt quyền của tập lệnh thành 700 và được sở hữu bởi root, sau đó định cấu hình sudo để cho phép người dùng chạy tập lệnh đơn lẻ đó.
baum hàm

Tôi tin rằng - trong khi câu trả lời này có thể hoạt động cho OP - nó không hoàn toàn chính xác. Theo hiểu biết của tôi, sử dụng cả hai -(hoặc --login) cùng với --command, -cviệc không thực sự bắt đầu một phiên đăng nhập, bởi vì -cluôn buộc một vỏ không đăng nhập.
JeanMertz

1
Lưu ý: đối với tính di động, - postgresssẽ xuất hiện ở cuối lệnh. Từ trang người đàn ông:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
jonny


9

Để tự động hóa việc này theo lịch trình, bạn có thể đặt nó vào crontab của người dùng. Các công việc định kỳ sẽ không có được môi trường đầy đủ, nhưng tốt hơn hết là đặt tất cả các biến env bạn cần trong chính kịch bản.

Để chỉnh sửa crontab của người dùng:

sudo crontab -u postgres -e

Bạn có thể vui lòng giải thích thêm?
saravanakumar

3

Đây phải là một thông tin đọc - setuid trên shell script

Nếu bạn chạy su với - usernamechuỗi đối số "", nó sẽ tạo một vỏ đăng nhập để người dùng cung cấp môi trường giống như người dùng. Thông thường, được sử dụng để nhanh chóng thực thi tập lệnh của bạn với môi trường gia đình của bạn từ một lần đăng nhập khác.


Điều này có thể hữu ích, nếu bạn cần thực hiện một loạt các hành động. Nhưng hãy nhớ rằng hầu hết các tài khoản dịch vụ hệ thống không nên có đường dẫn và vỏ hợp lệ.
Dan Carley

2

Hãy thử trang web su:

su -c script_run_as_postgres.sh - postgres

Nói chung, bạn có thể sử dụng sudo để cho phép bạn chạy comman đó dưới dạng postgres mà không cần mật khẩu. Mặc dù vậy, nó cần một số thiết lập trong / etc / sudoers của bạn.


2

Phương pháp "su -c ..." được đăng bởi những người khác là một phương pháp tốt. Để tự động hóa, bạn có thể thêm tập lệnh vào crontab của người dùng mà bạn cần để thực thi.


1

Nếu người dùng đã có một mục nhập vào sudo và bạn không biết mật khẩu của siêu nhân thì bạn có thể thử như sau: Cái này khởi động lại các postgres được khởi tạo tại /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"

-1

Bạn cũng có thể dùng:

sudo -u postgres script_run_as_postgres.sh

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.