Vấn đề với việc chạy một kịch bản khi khởi động là root?


2

Câu hỏi chính:

Có cách nào để tôi có thể chạy 'hoàn toàn' một trong các tập lệnh của mình khi máy tính để bàn của Ubuntu xuất hiện bất kể là root, quản trị viên, người dùng máy tính để bàn hoặc người dùng không có quyền đăng nhập?

Kịch bản làm gì?

Kịch bản gắn kết một phân vùng, tìm kiếm một tệp trong phân vùng đó và cuối cùng trên cơ sở tệp đó, một quyết định sao chép phân vùng sang phân vùng khác được đưa ra. Việc sao chép đó được thực hiện thông qua

dd if=/dev/sda2 of=/dev/sda5

Khi nào kịch bản chạy tốt?

Script chạy trơn tru khi tôi chạy nó từ terminal

sudo ./my_copying_script

Lệnh này hỏi tôi mật khẩu của người dùng hiện đang đăng nhập. Tôi nhập mật khẩu và tập lệnh bắt đầu hoạt động.

Khi nào kịch bản KHÔNG chạy tốt?

Tôi muốn chạy kịch bản khi khởi động. Tôi đặt chương trình khởi động bằng cách sử dụng tiện ích Ứng dụng khởi động của Ubuntu. Script chạy khi khởi động nhưng thoát tại lệnh dd giữ lại lỗi sau:

dd: opening '/dev/sda2': Permission denied 

Theo đề nghị của edk , tôi đặt chủ sở hữu my_copying_script làm gốc và đặt SUID. Bây giờ, quyền của my_copying_script là (-rwsr-sr-x). Quan điểm của edk là một khi tôi đặt suid, chương trình khởi động sẽ chạy với sự cho phép của chủ sở hữu. Tôi đã làm điều đó nhưng lỗi từ chối / dev / sda2 đã xuất hiện.

Sau đó tôi đã thêm tiền tố vào dd với sudo như được đề cập dưới đây

 sudo dd if=/dev/sda2 of=/dev/sda5

nhưng điều này trả về lỗi sau:

sudo: no tty present and no askpass program specified

bạn đang sử dụng bản phân phối nào? máy tính để bàn nào? thay vào đó, bạn có thể gắn ổ đĩa khi khởi động hệ thống (ví dụ: từ / etc / fstab) không?
quack quixote

Tôi đang sử dụng Ubuntu 9.10 với Gnome. Có, tôi có thể gắn ổ đĩa bằng / etc / fstab nhưng điều đó sẽ làm cho phân vùng đó có sẵn cho tất cả người dùng mà tôi không muốn. Tôi chỉ muốn root để có quyền truy cập vào phân vùng đó. Bất kỳ suy nghĩ về điều này?
Usman

@Usman gắn kết nó với các quyền phù hợp.
Oliver Friedrich

Nếu tôi gắn kết / mnt sao cho chỉ cấp quyền tất cả các quyền thì chương trình khởi động của tôi không thể truy cập dữ liệu trong / mnt.
Usman

câu hỏi hay hơn nhiều @Usman
quack quixote

Câu trả lời:


2

Usman, tôi nghĩ rằng bạn có ít nhất hai lựa chọn tôi đã đề cập.

Một cách dễ nhất

Tạo tệp nhị phân UID set (sẽ kiểm tra ai đã khởi động nó & cho phép sử dụng nếu chủ sở hữu quy trình mẹ có thể chạy nó) chạy tập lệnh đã chuẩn bị và thoát. Đặt vào khởi động trong trình quản lý máy tính để bàn của bạn, đó là tất cả. Chỉ cần cảnh báo nó không phải là cách tốt nhất và nó cần một chút mã hóa C. Về cơ bản, bạn cần tạo một mã như mẫu này:

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

Hãy nhận biết rằng đây là một hack, không phải giải pháp, thực sự. Và hãy chắc chắn sử dụng quyền root: allow_group và 4750 trên nhị phân nếu bạn không cần nó được điều hành bởi mọi người. Hãy nhớ thêm tất cả người dùng có thể bắt đầu điều này lên allow_group (chọn tên của bạn).

Một cách tốt

Một cách khác, tốt hơn nhiều là tạo ra một loại daemon, sinh ra @ system boot (giả sử, từ init-scripts), nhưng tôi không chắc bạn sẽ phát hiện chính xác như thế nào khi bắt đầu phiên X mới, tôi đã không tham gia chủ đề này, tôi không thể đưa ra bất kỳ lời khuyên rõ ràng ở đây.


Xin lỗi edK nhưng tôi nghĩ tôi không hiểu đề xuất đầu tiên của bạn. Tôi đã thiết lập suid của chương trình của mình bằng lệnh chmod + s. Bây giờ, mã C sẽ làm gì?
Usman

1
Giống như người tôi đã cho. Bạn có thể chơi với ví dụ này và các chế độ 4755 & 6755: codepad.org/zkCULq3q
edk

Nhấp vào 'đây là một nhận xét tuyệt vời' nhầm. : P Được rồi đây là những gì tôi hiểu. Đúng nếu tôi đã sai lầm. Bạn muốn tôi viết chương trình C sẽ setuid (0) và sau đó chạy tập lệnh của tôi thông qua hệ thống ("/ home / namsu / Desktop / my_copying_script") và cuối cùng tôi đặt mã thực thi của mã C này để chạy khi khởi động. Đúng? :)
Usman

Tôi nghĩ rằng nó đã được nêu khá rõ ràng trong câu trả lời của tôi.
edk

1

Đặt quyền chính xác trên đường dẫn ổ đĩa được gắn sau đó và bạn đã hoàn tất.


Xin lỗi nhưng điều đó sẽ không giải quyết được vấn đề.
Usman

sau đó tôi không thể nghĩ gì khác ngoài việc tạo một tập lệnh daemon sẽ theo dõi các quá trình liên quan đến X sinh ra HOẶC bạn có thể muốn sử dụng nhị phân suid sẽ kiểm tra ai là người gọi và sau đó làm điều gì đó bạn muốn, nhưng tôi thực sự không thấy một lý do để làm như vậy, nếu bạn chỉ muốn làm cho ổ đĩa có thể truy cập bằng root. nếu bạn chỉ muốn một tập lệnh được chạy dưới quyền root khi đăng nhập, thì suid-binary là cách dễ nhất (nhưng nguy hiểm!) để làm như vậy. Trên thực tế, đó là nhiều hack hơn là giải pháp thực tế.
edk

0

sudo sẽ chỉ chạy một chương trình với tư cách là một người dùng khác nếu một trong 3 điều kiện này được đáp ứng (liên quan đến mật khẩu):

  1. tùy chọn NOPASSWD được chỉ định
  2. người dùng nhập đúng mật khẩu
  3. người dùng nhập đúng mật khẩu nguồn

Vì các tùy chọn 2 và 3 yêu cầu TTY (sudo sẽ không đọc từ đường ống) nên nó sẽ không chạy nếu không thể tìm thấy. Kiểm tra tập lệnh của bạn nếu tại bất kỳ thời điểm nào bạn đang chạy tập lệnh từ xa bằng ssh, vì có thể nó sẽ không phân bổ TTY cho lệnh từ xa không tương tác.

Trích dẫn từ: Tại đây


Tôi không chạy script của tôi bằng ssh.
Usman

@Usman: ssh không phải là nơi duy nhất mà sudo sẽ phàn nàn về việc chạy không tương tác. nó cũng sẽ phàn nàn khi chạy từ một kịch bản khởi động, vì không có TTY nào được gắn vào quá trình khởi động.
quack quixote

Và việc gắn TTY vào tập lệnh khởi động của tôi là không thể, phải không?
Usman

0

Thêm mục nhập vào / etc / fstab, sử dụng chown và chmod để sửa đổi quyền để chỉ cấp quyền truy cập vào phân vùng được gắn kết.

sudo chown -R root:root /mnt
sudo chmod -R 770 /mnt

Tôi đã gắn kết phân vùng bằng cách thêm mục vào / etc / fstab và đặt quyền của nó như bạn đã chỉ định nhưng điều đó không hoạt động vì bây giờ tập lệnh khởi động của tôi không thể truy cập dữ liệu trong / mnt khi tôi đăng nhập như một người dùng bình thường (không phải root). Người dùng bình thường của tôi không nhận được quyền truy cập vào / mnt, điều này rất tốt đối với tôi nhưng chương trình của tôi phải có quyền truy cập vào / mnt. Tôi vẫn bị mắc kẹt. :(
Usman

Trong bình luận của bạn, bạn nói "Tôi chỉ muốn root có quyền truy cập vào phân vùng đó" Nếu bạn muốn người khác có quyền truy cập chỉ đọc thay thế 770 bằng 774 trong lệnh chmod.
Đánh dấu

0

Một giải pháp khả thi sẽ là thêm người dùng của bạn và lệnh mà anh ta đang cố gắng gọi / etc / sudoers với tham số NOPASSWD. Cắt từ / etc / sudoers:

# Uncomment cho phép các thành viên của nhóm sudo không cần mật khẩu
# (Lưu ý rằng các mục nhập sau ghi đè lên mục này, vì vậy bạn có thể cần phải di chuyển
# nó tiếp tục xuống)
#% sudo ALL = NOPASSWD: TẤT CẢ

Vì vậy, có thể bạn sẽ cần một cái gì đó như:

myuser ALL=NOPASSWD: mount

Tôi không chắc lắm về cú pháp chính xác, bạn nên tìm kiếm nó tốt hơn.

EDIT: Nếu bạn đang cố gắn ổ đĩa mạng, việc thêm bản ghi vào / etc / fstab có thể sẽ không hoạt động, vì các dịch vụ mạng không được tải tại thời điểm fstab được thực thi.

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.