làm cho một kịch bản bash thực thi theo chương trình


12

Tôi cần tạo một tập lệnh bash để tạo và gắn ổ đĩa. Vì vậy, hai lệnh đơn giản. Cả hai "làm việc" khi được nhập vào dòng lệnh.

Tập lệnh được tạo và thực thi mỗi khi người dùng bình thường đăng nhập, vì vậy tôi cần một phương pháp để thực hiện tập lệnh này tại thời điểm đó. Cho đến nay, tôi không thể làm việc này. Ví dụ, phần đầu tiên mkdir /vvv/ggggkhông tiếp tục vì tập lệnh không thể thực thi được (tôi đoán vậy).

Hy vọng điều này có ý nghĩa. Điều này có thể không? Bất kỳ suy nghĩ về cách làm cho công việc này sẽ được đánh giá cao.

Cập nhật :

Cảm ơn câu trả lời của bạn. Tôi có lẽ nên thêm một số thông tin khác ngoài việc tôi mới biết về Linux.

Tôi đang sử dụng một ứng dụng máy tính để bàn ảo nguồn mở có tên Ulteo. Ứng dụng này chạy trên Ubuntu và có rất ít hỗ trợ - đó là lý do tại sao tôi ở đây. Về cơ bản, tôi đang học bằng lửa.

Vì vậy, có ứng dụng có chức năng quản lý tập lệnh đăng nhập, nơi tôi có thể buộc tập lệnh cho người dùng. Một kịch bản windows đơn giản với việc sử dụng mạng hoạt động hoàn toàn tốt. Tuy nhiên, khi tôi cố gắng áp dụng tập lệnh bash Linux thì không có gì xảy ra.

Tôi nghĩ rằng bởi vì tôi cần phải thực hiện chmod +xchống lại kịch bản trước để làm cho kịch bản có thể thực thi được, đây là lý do tại sao nó thất bại. Nhân tiện, Ulteo chạy trong một nhà tù chroot. Tôi đã tạo một tập lệnh, lưu nó và không thể tìm thấy tập lệnh. Tôi đã tìm kiếm cả trong và ngoài nhà tù chroot.

Tôi thích cách tiếp cận của dan08 để có tập lệnh ban đầu tham chiếu một tập lệnh khác mà tôi có thể tìm và thực hiện thủ công. Tôi sẽ gặp vấn đề tương tự?

Liệu thông tin bổ sung này làm rõ tình hình? Cảm ơn trước.

Ảnh đính kèm.

! [bảng điều khiển quản lý scipt đăng nhập] [1]

! [windows script hoạt động] [2]

! [tập lệnh linux đơn giản không hoạt động] [3]

Xin lỗi tôi không thể đăng hình ảnh nào


Bạn có định viết một công việc định kỳ để chạy tập lệnh mỗi khi người dùng đăng nhập không? Hướng dẫn này sẽ giúp bạn với việc làm cho chúng thực thi quá .
Bóng đèn bị mất ngủ

1
"Kịch bản được tạo và thực thi mỗi khi người dùng bình thường đăng nhập" tại sao? Tôi sẽ sửa nó vì nó nghe có vẻ không hợp lý với tôi. Tôi sẽ cung cấp cho tập lệnh người dùng như một tham số và để nguyên tập lệnh sau khi được tạo.
Rinzwind

1
Có một sự pha trộn kỳ lạ của các câu trong câu hỏi khiến tôi bối rối về những gì hiện đang xảy ra và những gì bạn muốn nó làm. Nó sẽ giúp nếu bạn có thể cụ thể hơn một chút về tình hình hiện tại là gì.
Oli

Vui lòng chỉnh sửa câu hỏi của bạn và cho chúng tôi xem kịch bản. Cũng cho chúng tôi thấy đầu ra của ls -l scriptname. Bạn cũng nên làm rõ chính xác kịch bản được tạo như thế nào và tại sao bạn không chỉ tạo nó một lần và để nó một mình. Cuối cùng, người dùng bình thường của bạn không nên có quyền truy cập ghi /varvà do đó không thể tạo thư mục ở đó.
terdon

1
Đăng các liên kết hình ảnh trong các ý kiến. Chúng tôi sẽ nhập chúng thông qua các chỉnh sửa (được đề xuất).
muru

Câu trả lời:


19

Có hai điều bạn cần làm:

  1. Tham khảo trình thông dịch kịch bản ở đầu tập lệnh:

    #!/bin/bash
  2. Đặt quyền để làm cho nó có thể thực thi được:

    chmod +x myscript.sh

3

Thay vì làm cho tập lệnh của bạn có thể thực thi được, bạn có thể thực hiện một cách tiếp cận khác và thay đổi cách bạn gọi tập lệnh.

script.sh là đủ để chạy một kịch bản thực thi.

Tuy nhiên

Có thể chạy một tập lệnh không thể thực hiện được nếu bạn chỉ định chương trình để chạy nó.

Vì vậy /bin/bash script.sh, bash script.shhoặc python script.pytất cả sẽ chạy các kịch bản không thể thực thi.

Vì vậy, đề nghị của tôi sẽ là chỉnh sửa cách mà tập lệnh được gọi và chỉ định nhị phân được sử dụng để chạy nó.


Về phía tôi, tôi thường làm cho chúng trở nên tuyệt vời, bởi vì nếu bạn không làm điều đó, bạn không thể khởi chạy lại tệp từ chính nó. Ví dụ, python os.execv(__file__, sys.argv)sẽ không hoạt động, và chắc chắn có nhiều tình huống như vậy. Nếu bảo mật là mục tiêu, chỉ cần sử dụng nó từ root / sudo thay vì cho phép người dùng chạy nhị phân. Ngoài ra, nếu mục tiêu là bảo mật, bạn không muốn chúng có thể chạy các tập lệnh, bởi vì dù sao bạn cũng có thể làm hại hệ thống ... có thể thực thi được hay không. Vì vậy, tôi không thấy lý do tại sao quan trọng để tránh làm cho chúng thực thi.
m3nda

0

Tạo một chương trình trong C, C ++ hoặc Python, v.v. và sử dụng lệnh hệ thống để thực thi tập lệnh bash.

Ví dụ, một chương trình C sẽ như thế nào:

#include "stdio.h"
int main(int argc, char const *argv[])
{
    system('chmod +x path/yourbashscript.sh');
    system('path/yourbashscript.sh');
    return 0;
}

Để thực hiện chương trình khi khởi động, hãy thêm nó vào danh sách các chương trình khởi động. Mở Ứng dụng khởi động từ dấu gạch ngang của bạn và thêm tệp thực thi được biên dịch vào danh sách bằng cách nhấp vào nút thêm.


2
-1: Đây không thực sự là một câu trả lời. Tại sao python sẽ tốt hơn một kịch bản shell? Hãy để một mình C! Trong mọi trường hợp, bạn không thực sự hiển thị chương trình này sẽ như thế nào và bạn không giải thích cách thêm chương trình vào danh sách chương trình khởi động.
terdon

Câu trả lời cho câu hỏi đầu tiên của bạn có thể được đưa ra bằng cách giải thích ngôn ngữ lập trình khác với ngôn ngữ kịch bản như thế nào đối với phần còn lại tôi đã chỉnh sửa câu trả lời của mình
akxer

Cảm ơn đã chỉnh sửa, -1 đã xóa. Tuy nhiên, sử dụng chương trình C để khởi chạy tập lệnh shell trên Linux là hoàn toàn không cần thiết và thêm chi phí không cần thiết. Tại sao không chỉ thêm tập lệnh vào ứng dụng khởi động? Hoặc, nếu bạn thực sự muốn sử dụng C tại sao không thực hiện trực tiếp? Tạo một trình bao bọc trong C gọi tập lệnh shell trong Linux hoàn toàn không có ý nghĩa gì trừ khi bạn cần tập lệnh được chạy với tập bit SUID. Ngay cả trong trường hợp đó, thường có những giải pháp đơn giản hơn.
terdon

1
-1: Điều này vẫn sẽ thất bại nếu tập lệnh không có quyền thực thi. Bạn sẽ phải gọi bash path/yourbashscript.sh.
muru

1
Điều này đặt ra câu hỏi, tại sao không chạy bash path/yourbashscript.shtrực tiếp thay vì biên dịch và chạy chương trình C này?
muru

0

Bạn có thể làm cho tập lệnh bash của bạn có thể thực thi được bằng cách chạy đoạn mã sau trong dòng lệnh.

cd ~/path/to/file
chmod +x nameoffile.sh

Sau đó, làm cho nó được thực thi khi khởi động có thể được thực hiện bằng cách thêm nó vào danh sách các chương trình khởi động của bạn như @akabhirav nói.


Dường như với tôi câu hỏi (phần nào) cho thấy anh ta đã quen với cách chmod. Nhưng anh ta đang yêu cầu một phương thức để làm cho nó có thể thực thi được từ bên trong chính tập lệnh (vì vậy anh ta không phải làm điều này bằng tay). Mặc dù tôi vẫn đặt câu hỏi về phương pháp: tạo lại một kịch bản một cách nhanh chóng không phải là cách để làm điều này.
Rinzwind

0

SHC là một trình biên dịch shell shell chung. Nó nhận một tập lệnh, được chỉ định trên dòng lệnh và tạo mã nguồn C. Mã nguồn được tạo sau đó được biên dịch và liên kết để tạo ra một nhị phân bị tước.

Nhị phân được biên dịch sẽ vẫn phụ thuộc vào shell được chỉ định trong dòng đầu tiên của mã shell (shebang: #!/bin/shhoặc như vậy), do đó SHC không tạo ra các nhị phân hoàn toàn độc lập.

Bản thân SHC không phải là trình biên dịch như cc. Thay vào đó mã hóa và mã hóa một tập lệnh shell và tạo mã nguồn C với khả năng hết hạn được thêm vào. Sau đó, nó sử dụng trình biên dịch hệ thống để biên dịch một nhị phân bị tước, hoạt động chính xác như tập lệnh gốc. Sau khi thực hiện, nhị phân được biên dịch sẽ giải mã và thực thi mã với -ctùy chọn của shell .


Điểm của điều này là gì nếu thực thi vẫn yêu cầu môi trường shell ban đầu? Làm thế nào là tốt hơn so với chỉ thêm một #!chmod +x?
xiota
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.