Chạy script với quyền root khi đăng nhập (không có người dùng sudoer, phiên shell)


8

Rất thích /etc/profile~/.profilechạy bằng root thay vì người dùng đang đăng nhập. /etc/rc.localchạy sau khi khởi động nhưng tôi cần chạy tập lệnh trước khi đăng nhập. Người dùng không phải là một sudoer.

Cảm ơn!


Có thể có một cách để làm điều này, nhưng nó sẽ không giống như /etc/profilehoặc ~/.profilebởi vì việc chạy mã trong các tập lệnh đó được thực hiện bởi trình bao của người dùng và chịu sự kiểm soát của người dùng, trong khi nếu bạn không muốn người dùng có sức mạnh để chạy các chương trình như rootchính chúng, sau đó điều này sẽ phải được thực hiện bởi một số dịch vụ đang chạy bên ngoài các quy trình của người dùng. ... Nó có thể hữu ích nếu bạn có thể cho chúng tôi biết mục đích của kịch bản bạn muốn chạy.
Eliah Kagan

Tôi cần thực hiện một mount (--bind) cụ thể cho một người dùng cụ thể. Tôi đã thử fstab với tùy chọn chủ sở hữu và người dùng, nhưng nó không hoạt động. /etc/rc.local là một tùy chọn nhưng nó luôn thực hiện việc gắn kết cho dù người dùng có đăng nhập hay không. Tôi hiện đã cấp các đặc quyền sudoer cho 'mount' cho người dùng, nhưng đây là một cách giải quyết và không thích cấp bất kỳ đặc quyền nào cho người dùng chuẩn. Tôi nghĩ rằng tôi sẽ sử dụng RC.local thay thế. Cảm ơn!
Antonio Sánchez

Bạn có thể tạo tập lệnh gốc chỉ bằng mountlệnh cụ thể đó và cung cấp cho người dùng đặc quyền chỉ chạy tập lệnh đó (định cấu hình /etc/sudoers). Một lệnh với các tùy chọn đã cho có thể được đặt trực tiếp vào sudoers.
enzotib

Tôi đã thử theo cách đó. Vấn đề là khi đến lúc chạy 'mount' bên trong tập lệnh, một lần nữa 'sudo' là bắt buộc, bởi vì tập lệnh được chạy bởi 'người dùng' chứ không phải bởi 'root', vì vậy vào cuối ngày 'mount' phải được cấp quá cho 'người dùng' và thay vì chỉ một quy tắc sudoers bây giờ tôi có hai. Đây là kinh nghiệm của tôi, vì vậy xin vui lòng, hãy nhớ rằng tôi không phải là một chuyên gia và có lẽ tôi đã làm điều gì đó sai. Cảm ơn!
Antonio Sánchez

Câu trả lời:


3

Chỉ cần quay lại phương pháp sudoers, tôi nghĩ bạn đã ở gần đó trước khi bạn từ bỏ. Nhìn vào những bình luận mới nhất của bạn, tôi chỉ muốn giải quyết một cái gì đó có thể sẽ sửa chữa mọi thứ cho bạn:

Nếu bạn chạy tập lệnh với quyền root, bạn không cần gọi sudo từ bên trong tập lệnh.

Tôi có một kịch bản như thế này:

#! /bin/bash

echo $USER
whoami

Nếu tôi chạy sudo ./myscripttôi thấy roottrả lại cho cả hai. Phiên mà tập lệnh đang chạy là một vỏ gốc.

Nói tóm lại, điều đó có nghĩa là mọi thứ bạn làm trong tập lệnh của bạn đều đã có quyền root. Bạn không cần phải gọi sudo(không phải là nó sẽ bị tổn thương - rootthường có sudoquyền).

Vì vậy, hãy viết tập lệnh của bạn, chownnó thành rootchmod700(để chỉ root mới có thể chạy, đọc hoặc chỉnh sửa nó) và sau đó chỉ cho phép người dùng của bạn chạy nó thông qua sudoers. Cần làm việc.

Nếu nó không hoạt động, nó có thể là một vấn đề lớn hơn với tập lệnh, không phải khung quyền. Tôi khuyên bạn nên cấp cho người dùng sudoquyền truy cập đầy đủ (thêm vào nhóm quản trị viên là cách dễ nhất) và sau đó chạy tập lệnh của bạn.


2

Bước 1. tạo một tập lệnh với lệnh bind bằng bất kỳ trình soạn thảo nào. Ví dụ:

sudo emacs bind_user_directories.sh

nội dung:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Bước 2. lưu bind_user_directories.sh và làm cho nó có thể thực thi được:

chmod a+x bind_user_directories.sh

Bước 3. liên kết nó đến một vị trí phù hợp như / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Bước 4. tạo tập lệnh khởi động:

sudo emacs /etc/init/bind_user_directories.conf

nội dung:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Nếu điều này làm việc cho bạn, xin vui lòng cho tôi biết. Bạn có thể kiểm tra nhật ký hệ thống cho các tin nhắn sau khi đăng nhập. (Tôi chưa kiểm tra nó và tôi chưa bao giờ thực hiện bất cứ điều gì như thế này trước đây.) Nếu bạn cải thiện giải pháp, vui lòng chia sẻ giải pháp cuối cùng của bạn tại đây. Cảm ơn.


Có nó hoạt động! Nó là một sự thay thế tuyệt vời cho các tập lệnh mdms /etc/mdm/PostLogin/trong thế giới của Ubuntu !!
Adam Ryczkowski

Bạn có giải pháp tương tự nào trong systemd không? ... Cf. Askubfox.com/questions/847930/ Mạnh
Adam Ryczkowski

0

Để chạy scrip as root trước khi đăng nhập

  1. Bạn có thể bắt đầu đoạn mã với Upstart .

  2. Bạn có thể thêm lệnh gọi tập lệnh vào tập lệnh khởi động kdm / gdm / etc hiện có .

Ví dụ: Chủ đề: Câu hỏi thường gặp: Tự động khởi động / Tự động chạy, Chạy định kỳ .


Nhưng điều mà Antonio Sánchez đang tìm kiếm là làm thế nào để tạo một kịch bản chạy như root tại thời điểm một người dùng cụ thể đăng nhập .
Eliah Kagan

Kịch bản phải chạy độc lập phiên là đồ họa hoặc vỏ tiêu chuẩn. Tôi đã cập nhật tiêu đề để nhận xét này. Tôi đã đọc một cái gì đó về Upstart, nhưng nó có vẻ phức tạp đối với nhiệm vụ đơn giản (rõ ràng). Dù sao và cho đến nay Upstart dường như là cách duy nhất để làm điều đó. Nếu bạn biết Upstart, sẽ rất khó để học đủ để hoàn thành công việc này? Cảm ơn!
Antonio Sánchez
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.