Làm cách nào để thực thi tập lệnh bash yêu cầu quyền root?


15

Tôi có dòng script này từ ISP của tôi:

sudo bash
echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Nó hoạt động nếu tôi dán từng dòng vào Terminal. Tôi muốn tạo tệp * .command và chạy nó bằng cách nhấp đúp. Nhưng tất cả tôi nhận được là mật khẩu nhắc và sau đó cửa sổ bash trống. Tệp "tùy chọn" kết quả là trống.

Tôi đã thử điều này:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Tôi có:

/ etc / ppp / tùy chọn: Quyền bị từ chối

Tôi nghĩ rằng tôi cần sử dụng một số lệnh để có được quyền root từ bên trong bash.


Khi bạn tạo tập lệnh của mình, bạn đã thực thi nó bằng cách gõ sudo ./ispscript.command? Ngoài ra, các tập lệnh bash thường có hậu tố .sh: ipscript.sh.
Hồ Aaron

1
FYI Kịch bản này chỉ cần được chạy một lần. Ngoài ra, nếu bạn tiếp tục chạy tập lệnh như hiện tại, thì nó PHỤ LỤC >> vào tệp. Tệp tùy chọn sẽ tiếp tục tăng kích thước khi bạn chạy nó nhiều hơn (tập lệnh). Điều này có thể hoặc không thể gây ra vấn đề với những gì đã từng đọc tệp tùy chọn.
dhempler

@ dennis.hempler, cảm ơn tôi biết điều này. Thật ra tôi sẽ chạy kịch bản này thường xuyên. Bởi vì thiết bị modem USB cần tập tin này để trống để hoạt động đúng. Vì vậy, trước khi cắm modem USB, tôi xóa tệp và trước khi kết nối với internet có dây, tôi viết các tùy chọn đó vào tệp.
Dmitriy

Câu trả lời:


15

Lấy kịch bản mà bạn đã tạo:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Lưu nó trong thư mục nhà của bạn hoặc thư mục 'scripts' trong thư mục chính của bạn, như l2tp.sh. Cho phép nó được thực thi (viết lệnh này trong Terminal):

chmod 700 ~/path/to/l2tp.sh

Để thực thi tệp bằng sudo (quyền root):

Phương pháp # 1. Trong loại thiết bị đầu cuối:

$ sudo ~/path/to/l2tp.sh

Phương pháp # 2. Tạo một tệp run_l2tp.command với nội dung này:

sudo ~/path/to/l2tp.sh

Cho phép nó được thực thi:

chmod u+x run_l2tp.command

Khi bạn bấm đúp vào run_l2tp.command và nhập mật khẩu, tệp l2tp.sh sẽ được thực thi với quyền root.

Một số lưu ý:

  • Trên UNIX như các hệ thống, ~ là viết tắt của "thư mục nhà của tôi".
  • Chmod 700 sẽ làm cho tập tin thực thi chỉ bởi bạn. Để biết thêm thông tin: xem trang Wikipedia này .
  • gõ 'sudo' trước một lệnh sẽ thực thi chương trình bằng quyền root. Hãy cẩn thận khi làm điều này, những điều tồi tệ có thể xảy ra nếu bạn không chắc chắn những gì bạn đang làm.
  • Rõ ràng bạn có thể bỏ qua / path / to nếu bạn đã lưu tập lệnh này trực tiếp trong thư mục chính của bạn.

4

Lưu cái này:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

để máy tính để bàn của bạn trong một tập tin có tên script.sh.

Mở một cửa sổ Terminal và gõ:

sudo bash ~/Desktop/script.sh

Nhập mật khẩu của bạn khi được nhắc và tất cả các lệnh trong tệp sẽ chạy với quyền siêu người dùng.


4

Nếu vì mục đích bảo mật, bạn không muốn bất kỳ người dùng nào trong hệ thống của bạn có thể chạy tập lệnh, nhưng bạn muốn được nhắc nhập mật khẩu quản trị, một giải pháp thay thế sẽ là lưu tập lệnh shell và sau đó sử dụng chương trình Trình chỉnh sửa AppleScript để tạo AppleScript.

AppleScript sẽ là một lớp lót, nói do shell script «your script's name here» with administrator privileges. Lưu tập lệnh đó dưới dạng một Ứng dụng. Sau đó, khi bạn nhấp vào nó, nó sẽ hỏi bạn mật khẩu quản trị viên, sau đó chạy tập lệnh shell với đặc quyền của quản trị viên.

Rõ ràng, thay thế «your script's name here»bằng đường dẫn đến kịch bản của bạn.


2

Vấn đề là khi bạn thực hiện nó từ dòng lệnh, những gì bạn đang làm bắt đầu bashbên dưới sudo, sau đó gửi hai lệnh tiếp theo tới bash, chứ không phải vỏ ban đầu. (dấu hiệu là bạn cần exithai lần)

Khi bạn thực hiện nó trong một tập lệnh, bashlệnh không bao giờ thoát, vì vậy hai lệnh tiếp theo không bao giờ chạy.

Nó không thanh lịch như giải pháp AppleScript, nhưng nếu bạn định làm điều này như một tập lệnh từ dòng lệnh, thì tương đương sẽ là:

#!/bin/sh --
sudo bash -c 'echo "plugin L2TP.ppp">>/etc/ppp/options' 
sudo bash -c 'echo "l2tpnoipsec">>/etc/ppp/options'

Nếu chúng ta không cần chuyển hướng io ( >>bit), chúng ta có thể gọi lệnh trực tiếp sudomà không cần sudo sh -cthủ thuật. (và lưu ý rằng tôi phải trích dẫn đối số để sh -cgiữ cho nó không chạy echo với quyền root, nhưng tệp sẽ nối thêm với tư cách là người dùng ban đầu.)

sẽ hoạt động như một .commandtệp từ Finder, nhưng nó sẽ hiện ra một cửa sổ đầu cuối, hỏi mật khẩu của bạn và nếu được nhập chính xác, sẽ chạy các lệnh. (giả sử gần đây bạn chưa được xác thực cho sudo... nếu bạn có, nó sẽ chạy qua mà không cần nhắc)

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.