Nhắc người dùng đăng nhập bằng root khi chạy shell script


17

Vấn đề tôi nhận được là, khi tôi nhập lệnh,

su - root

ở đầu tập tin shell shell của nó, nó sẽ nhắc người dùng nhập mật khẩu và sau đó KHÔNG tiếp tục với phần còn lại của tập lệnh shell. Sau đó tôi phải tự xác định vị trí và chạy tập lệnh shell qua thiết bị đầu cuối. Tôi muốn tập lệnh đảm bảo rằng người dùng đăng nhập bằng root và sau đó tiếp tục với phần còn lại của tập lệnh shell.

Nói cách khác, tôi muốn chạy tập lệnh như bất kỳ người dùng nào nhưng ngay khi tập lệnh bắt đầu thực thi, người dùng phải thay đổi thành root và sau đó tiếp tục với phần còn lại của tập lệnh là root cho đến khi hoàn thành. Điều này có thể được thực hiện?

Câu trả lời:


34

Điều này rất dễ thực hiện:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Khi người dùng hiện tại không root, hãy thực thi lại tập lệnh thông qua sudo.

Lưu ý rằng tôi đang sử dụng sudoở đây thay vì su. Điều này là do nó cho phép bạn bảo tồn các đối số. Nếu bạn sử dụng su, lệnh của bạn sẽ phải xử su -c "$0 $@"lý các đối số của bạn nếu chúng có khoảng trắng hoặc ký tự shell đặc biệt.

Nếu shell của bạn bị bash, bạn có thể tránh cuộc gọi bên ngoài tới whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

Xin lỗi, tôi đã có một lỗi trong phần giải thích để nó có thể bị hiểu sai. Dưới đây là một lời giải thích rõ ràng hơn. Cảm ơn đã giúp đỡ!
Redson

@ user68857 Câu hỏi của bạn đã rõ ràng. Câu trả lời này làm chính xác những gì bạn muốn.
Patrick

tôi tiếp tục nhận được lỗi này: sudo: phải là setuid root
Redson

Tôi muốn chạy tập lệnh như một người dùng thông thường qua thiết bị đầu cuối nhưng tập lệnh sẽ chuyển người dùng sang root cho đến khi kết thúc tập lệnh
Redson

@Nosscire nếu bạn nhận được sudo: must be setuid root, thì điều gì đó đã xảy ra với sudo của bạn. Để sửa nó : chmod u+s $(which sudo). Và vâng, tôi biết rõ những gì bạn đang cố gắng làm, tôi luôn làm điều tương tự trong các kịch bản của mình.
Patrick

7

Bạn cũng có thể kiểm tra UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi

5

Bạn có thể gọi chính kịch bản và kiểm tra:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

Tại điểm bạn muốn đăng nhập, chỉ cần thêm lệnh sau

sudo su

Điều này đang hoạt động hoàn hảo với mã của tôi

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.