Chạy một phần của tập lệnh bash với tư cách người dùng khác


33

Có cách nào để làm cho một phần của tập lệnh chạy như một người dùng khác (không phải root) không? Nếu nó giúp, phần được chạy như một người dùng khác xảy ra ở cuối tập lệnh

Chỉnh sửa:
HĐH -> Ubuntu 9.04


Câu trả lời:


42

Sử dụng lệnh sudo trong kịch bản.

Trong các hình thức:

sudo -u username command

lệnh sudo chạy lệnh như tên người dùng .

Nếu tập lệnh đang được chạy với quyền root, tôi không nghĩ nó sẽ nhắc nhập mật khẩu. Nếu không, bài viết này thảo luận về cách sử dụng sudo với mật khẩu trong một dòng lệnh? và bài viết này thảo luận về cách sử dụng sudo mà không cần mật khẩu?


5
Điều này là tốt và dễ dàng, nhưng có cách nào để làm điều này cho một nhóm các lệnh thay vì từng lệnh một không?
Andrew

viết một tập lệnh bash, làm cho nó có thể thực thi được chmod +x script.shvà sau đó chỉ làsudo -u username script.sh
NiCU

@Andrew Tôi đã tự hỏi điều này và những điều sau đây đã làm việc cho tôi: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell

Đồng thời bao gồm itùy chọn nếu bạn muốn có được môi trường của người dùng
neoDev

6

Câu trả lời này là tốt, nhưng lời khuyên về serverfault hơi nguy hiểm - sẽ cho phép bất cứ ai chạy bất cứ thứ gì bằng root! Vì vậy, tôi đang đăng ở đây vì tôi không thể định dạng bình luận.

Tôi khuyên bạn nên sử dụng visudo để cung cấp các quyền bạn cần chính xác nhất có thể. Nhập visudovà thêm một dòng như:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Nếu bạn cần chạy điều tương tự trên nhiều máy chủ, bạn có thể mở nó bằng:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Nhưng tôi sẽ ** không * sử dụng:

username ALL=(ALL) NOPASSWD: ALL

hoặc tên người dùng tên máy chủ = TẤT CẢ

Các trang người đàn ông sudoer có rất nhiều chi tiết đẫm máu


Nó sẽ làm việc cho một lệnh chỉ có sẵn cho một người dùng cụ thể?
Manish Mathai

Bạn có thể chỉ định rằng chỉ những người dùng cụ thể mới có thể chạy lệnh (trong các ví dụ ở trên, thay thế usernamebằng tên người dùng sẽ có thể chạy lệnh). Nếu tệp thực thi bạn muốn chạy chỉ được thực thi bởi một người dùng cụ thể, điều đó cũng tốt - chỉ cần chuyển tên người dùng đó trong sudo -u username commandlinedòng của tập lệnh.
James Polley

@ Biến mất. Vâng. Tệp sudoers nói gì là "Cho phép tên người dùng này trên máy chủ này chạy lệnh1 mà không phải cung cấp mật khẩu.
DaveParillo

6

# Tôi = thích:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./chạy

1: root
2: nobody
3: root

10
Bạn có thể thêm một số văn bản giải thích?
Kazark

4

Đối với sonarqube:

sudo -u sonar /usr/bin/sonar start

nơi sonarlà tên của người dùng sử dụng để chạy các lệnh/usr/bin/sonar start


2

không chắc lắm về điều đó, nhưng nếu bạn muốn CHỈ phần cuối của tập lệnh đó sẽ chạy như một người dùng khác, bạn có thể thêm su someusertrước khi kết thúc tập lệnh.

Tui bỏ lỡ điều gì vậy?

Hy vọng rằng sẽ giúp,

Trân trọng


1
Tôi nghĩ rằng đây là câu trả lời thích hợp nhất, có tất cả các câu trả lời khác gợi ý sudo, thường không được cài đặt theo mặc định trên một số cài đặt linux tối thiểu.
Tim

1

Bằng cách này, kết thúc của một tập lệnh sẽ được thực thi bởi người dùng khác (root). Xin lưu ý $[LINENO+2]exit $?gọi. Chúng được yêu cầu để kết thúc tập lệnh chỉ thực hiện một lần và giữ nguyên mã thoát của sudocuộc gọi.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
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.