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


245

Tôi muốn chạy một tập lệnh từ shell ubfox chính với tư cách là một người dùng khác không có mật khẩu.

Tôi có đầy đủ đặc quyền sudo, vì vậy tôi đã thử điều này:

sudo su -c "Your command right here" -s /bin/sh otheruser

Sau đó, tôi phải nhập mật khẩu của mình, nhưng tôi không chắc tập lệnh đó có thực sự chạy dưới người dùng đó hay không.

Làm thế nào tôi có thể xác nhận rằng tập lệnh đang thực sự chạy dưới người dùng đó bây giờ?

Câu trả lời:


354

Bạn có thể làm điều đó với suhoặc sudo, không cần cả hai.

sudo -H -u otheruser bash -c 'echo "I am $USER, with uid $UID"' 

Các phần có liên quan của man sudo:

-H   The -H (HOME) option requests that the security policy set
     the HOME environment variable to the home directory of the
     target user (root by default) as specified by the password
     database.  Depending on the policy, this may be the default
     behavior.
-u user     The -u (user) option causes sudo to run the specified
      command as a user other than root.  To specify a uid
      instead of a user name, use #uid.  When running commands as
      a uid, many shells require that the '#' be escaped with a
      backslash ('\').  Security policies may restrict uids to
      those listed in the password database.  The sudoers policy
      allows uids that are not in the password database as long
      as the targetpw option is not set.  Other security policies
      may not support this.

suchỉ có thể chuyển đổi người dùng mà không cung cấp mật khẩu nếu bạn đã root. Xem câu trả lời của Caleb

Bạn có thể sửa đổi /etc/pam.d/sutập tin để cho phép sumà không cần mật khẩu. Xem câu trả lời này .

Nếu bạn sửa đổi tập tin auth của bạn để sau, bất kỳ người dùng là một phần của nhóm somegroupcó thể suđến otherusermà không cần mật khẩu.

auth       sufficient pam_rootok.so
auth       [success=ignore default=1] pam_succeed_if.so user = otheruser
auth       sufficient   pam_succeed_if.so use_uid user ingroup somegroup

Sau đó kiểm tra từ thiết bị đầu cuối

rubo77@local$ su otheruser -c 'echo "hello from $USER"'
hello from otheruser

4
Bạn có thể vui lòng thêm làm thế nào để làm điều đó với chỉ suquá?
rubo77

2
Điều này hỏi tôi mật khẩu :-(
IanVaughan 20/07/2015

1
@IanVaughan, Với cấu hình mặc định (của sudo), bạn sẽ được yêu cầu nhập mật khẩu trừ khi bạn chạy nó dưới quyền root. Bạn có thể định cấu hình sudo để "cho phép người dùng A chạy cmd C với tư cách người dùng B mà không yêu cầu mật khẩu". Xem trợ giúp.ubfox.com/community/Sudoers
geirha

1
Tôi được nhắc nhập mật khẩu khi chạy nó với quyền root. Bất kỳ đề xuất?
Nate

1
@NamGVU hãy ghi nhớ rằng vấn đề đặt hàng. Nếu sudoers của bạn có một quy tắc tiếp tục đặt các quyền khác cho người dùng của bạn hoặc một nhóm bạn là thành viên, điều đó sẽ ghi đè lên quy tắc NOPASSWD của bạn.
geirha

100

Nếu bạn muốn sử dụng su thay vì sudo, tôi tin rằng bạn có thể sử dụng một cái gì đó như thế này:

su - <username> -c "<commands>"
  • - sẽ mô phỏng thông tin đăng nhập của người dùng được chỉ định
  • -c nói với nó rằng bạn muốn chạy một lệnh

ps. Thật không may, tôi không thể cài đặt ruby ​​bằng rvm với phương pháp này, nhưng điều đó có lẽ không liên quan.


5
Tôi cần phải thêm sudovào đầu nếu không nó yêu cầu tôi nhập mật khẩu.
IanVaughan 20/07/2015

2
Điều này chắc chắn không hoạt động mà không có sudo. với sudo, nó hoạt động, ví dụ: sudo su - www-data -c "touch /tmp/test"đã tạo thành công một tệp dưới dạng dữ liệu www
rubo77

Để sử dụng "su" bạn cần mật khẩu root, điểm "sudo" là để tránh điều đó. Nếu bạn có mật khẩu root bằng cách sử dụng "su" như trên thì sẽ hoạt động tốt.
Samuel Åslund

6

Các câu trả lời ở trên thực sự hữu ích với tôi nhưng để trả lời câu hỏi thực tế ...

Làm cách nào tôi có thể xác nhận rằng tập lệnh đang thực sự chạy dưới người dùng đó bây giờ? -

Sử dụng:

ps -ef | grep <command-name>

Đầu ra phải bao gồm tập lệnh của bạn và người dùng thực tế thực thi nó. Mọi người trên các hệ thống giống như BSD, ví dụ MAC có thể tìm thấy thông tin tương tự với:

ps aux | grep <command-name>

Người dùng Linux có thể sử dụng ps aux.
Dean Howell

@DeanHowell; Đúng, nhưng người dùng MAC không thể sử dụng "ps -ef" và "ps aux" là các tùy chọn BSD, chỉ khả dụng dưới dạng tính năng tương thích trong khi "ps -ef" là các tùy chọn Unix / POSIX được tiêu chuẩn hóa.
Samuel Åslund

2

Tôi đã từng gặp vấn đề tương tự. Chỉ cần gõ lệnh screen -dmS testscreennày sẽ tạo ra một màn hình tách rời trên tài khoản người dùng không phải sudo của bạn và sau đó bạn có thể đăng nhập nó và kiểm tra xem màn hình này có ở đó không screen -ls.

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.