chạy tập lệnh như người dùng có vỏ nologin


87

Tất cả những gì tôi cần làm là chạy một tập lệnh cụ thể với tư cách là một người dùng cụ thể có trình nologin/falsebao được chỉ định trong /etc/passwd.

Tôi sẽ chạy tập lệnh với quyền root và nó sẽ chạy như một người dùng khác. Đang chạy:

~# su -c "/bin/touch /tmp/test" testuser

sẽ hoạt động, nhưng tôi cần một vỏ hợp lệ cho người kiểm tra. Tôi biết tôi có thể vô hiệu hóa mật khẩu passwd -d testuservà để lại shell /bin/bashtheo cách này sẽ bảo mật một chút nhưng tôi cần phải có nologin/falseshell.

Về cơ bản những gì tôi cần là những gì crontabchúng ta làm khi chúng ta thiết lập các công việc đang chạy như một người dùng cụ thể, bất kể cái này có nologin/falsevỏ.

ps Tôi tìm thấy chủ đề này Thực thi một lệnh như một người dùng nologin , nhưng tôi không biết làm thế nào để concatenatelệnh su -s /bin/sh $usercho tập lệnh tôi cần chạy.

Câu trả lời:


119

Bạn có thể sử dụng công tắc -s để su để chạy một trình bao cụ thể

su -s /bin/bash -c '/path/to/your/script' testuser

(Chuẩn sudobị ở trên nếu testuserlà người dùng không có mật khẩu.)


Nếu su là root:root -rwsr-x---gì?
Patryk

1
Nếu người dùng không có mật khẩu thì sao?
CMCDragonkai

3
@Wesley Phát hiện ra rằng bạn cần phải root để chạy lệnh đó cho người dùng không có mật khẩu.
CMCDragonkai

1
@lain, Nếu người dùng được cho là không có shell, quy trình liên quan đến lệnh không nên là con của quy trình bash. Vì vậy, bạn cũng nên sử dụng exec để thay thế shell bằng script. Và nếu bạn muốn biến kịch bản thành con của init, bạn chỉ cần sử dụng &, làm ví dụsu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor

1
Vì tôi đã dành 20 phút cuối cùng để tìm ra cách đạt được kết quả tương tự bằng cách sử dụng runuser, tôi muốn chỉ ra rằng su -s SHELLtham số đó biểu hiện lệnh runuser khá vô dụng :) Cảm ơn Jan!
jirka

12

Bạn có thể làm điều này với sudo -unếu bạn đã cài đặt nó:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

Làm thế nào để bạn truyền tham số đến sudo -u apache whoami?
CMCDragonkai

@CMCDragonkai Bất kỳ tham số nào sau lệnh sẽ được truyền cùng. Bạn có thể nghĩ về nó như "sudo [-u apache] [whoami <param1> <param2>]".
Handyman5

Tôi nghĩ rằng việc sử dụng sudo -ucó lẽ không phải là một ý tưởng tốt để chạy các lệnh như một người dùng nologin, bởi vì nó phơi bày SUDO_USERtrong môi trường người thực sự gọi lệnh. Có lẽ tôi chỉ đang xem xét nó.
Meow

5

Bằng cách cung cấp tập lệnh làm đối số để thực thi cho / bin / sh:

su -s "/bin/sh /your/script/location" username

2

chỉ nhận ra:

người kiểm tra su -s "/ bin / bash" -c "/ bin / touch / tmp / testuser"

Có lẽ có cách nào tốt hơn?!


0

Trên thực tế, cách tốt nhất để làm điều này là thông qua runuser

xem trang người đàn ông để biết chi tiết

công cụ này được sử dụng để đối phó với tình huống như nhà phát triển đã nói trong bolg của mình

Bất cứ khi nào một dịch vụ đang chạy như root và muốn thay đổi UID bằng cách sử dụng shell thì nên sử dụng runuser.

http://danwalsh.livejournal.com/55588.html

Tôi đã đăng câu trả lời này trong nhiều cung điện, hãy tha thứ cho tôi nếu bạn thấy điều này gây phiền nhiễu


Xin vui lòng không đăng câu trả lời chỉ liên kết để ngăn chặn thối liên kết. Thay vào đó, hãy thêm thông tin phù hợp nhất từ ​​liên kết vào câu trả lời của bạn hoặc thay vào đó, hãy đăng liên kết dưới dạng nhận xét thay vì trả lời. Xem bài viết này của serverfault.com/help/how-to-answer để biết thêm thông tin.
Federico Galli

@FedericoGalli thông tin phù hợp nhất đã được thêm vào, không cần sao chép và dán cách sử dụng, trang man cung cấp đủ thông tin
Z-Y00

-1

Sử dụng sudo -u để chỉ định người dùng. Đồng thời sử dụng cờ -i để đặt các biến môi trường của người dùng đích.

sudo -i -u user command

1
điều này mang lạiThis account is currently not available.
knocte

-3

Sử dụng lệnh su với lệnh shell -s và -c. Như hình dưới đây

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash

2
Đó chính xác là giải pháp từ câu trả lời được đánh giá cao nhất.
Gerald Schneider
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.