ทำให้สคริปต์ทุบตีปฏิบัติการได้โดยทางโปรแกรม


12

ฉันต้องสร้างสคริปต์ทุบตีเพื่อสร้างและติดตั้งไดรฟ์ ดังนั้นสองคำสั่งง่ายๆ ทั้ง "งาน" เมื่อป้อนที่บรรทัดคำสั่ง

สคริปต์ถูกสร้างและดำเนินการทุกครั้งที่ผู้ใช้ทั่วไปลงชื่อเข้าใช้ดังนั้นฉันต้องการวิธีในการทำให้สคริปต์นี้ทำงานได้ในเวลานั้น จนถึงตอนนี้ฉันไม่สามารถทำงานได้ ตัวอย่างเช่นส่วนแรกmkdir /vvv/ggggไม่ได้ดำเนินการเพราะสคริปต์ไม่สามารถดำเนินการได้ (ฉันเดา)

หวังว่ามันจะสมเหตุสมผล เป็นไปได้ไหม ความคิดใด ๆ เกี่ยวกับวิธีการทำงานนี้จะได้รับการชื่นชม

อัปเดต :

ขอบคุณสำหรับคำตอบของคุณ ฉันน่าจะเพิ่มข้อมูลเพิ่มเติมนอกเหนือจากที่ฉันเพิ่งรู้จักกับ Linux

ฉันกำลังใช้แอปพลิเคชันเดสก์ทอปเสมือนโอเพ่นซอร์สที่เรียกว่า Ulteo แอปนี้ทำงานบน Ubuntu และมีการสนับสนุนน้อยมาก - นั่นเป็นสาเหตุที่ฉันมาที่นี่ โดยพื้นฐานแล้วฉันกำลังเรียนรู้ด้วยไฟ

ดังนั้นจึงมีแอปพลิเคชันที่มีฟังก์ชั่นการจัดการสคริปต์เข้าสู่ระบบที่ฉันสามารถผูกสคริปต์กับผู้ใช้ สคริปต์ windows ที่เรียบง่ายพร้อมการใช้เน็ตทำงานได้ดี อย่างไรก็ตามเมื่อฉันพยายามใช้สคริปต์ทุบตี Linux ไม่มีอะไรเกิดขึ้น

ฉันคิดว่าเพราะฉันจำเป็นต้องดำเนินการchmod +xกับสคริปต์ก่อนที่จะทำให้สคริปต์ที่ปฏิบัติการนี่คือเหตุผลที่มันล้มเหลว โดยวิธีการที่ Ulteo ทำงานในคุก chroot ฉันสร้างสคริปต์บันทึกแล้วไม่พบสคริปต์ ฉันค้นหาทั้งในและนอกคุก chroot

ฉันชอบวิธีการโดย dan08 เพื่อให้มีการอ้างอิงสคริปต์เริ่มต้นสคริปต์อื่นที่ฉันสามารถค้นหาและทำให้ปฏิบัติการด้วยตนเอง ฉันจะเจอปัญหาเดียวกันหรือไม่?

ข้อมูลเพิ่มเติมนี้ชี้แจงสถานการณ์หรือไม่? ขอบคุณล่วงหน้า.

แนบรูปถ่าย

! [คอนโซลการจัดการ scipt เข้าสู่ระบบ] [1]

! [windows สคริปต์ที่ทำงาน] [2]

! [สคริปต์ linux ง่าย ๆ ที่ใช้งานไม่ได้] [3]

ขออภัยฉันยังไม่สามารถโพสต์ภาพได้


คุณจะเขียนงาน cron เพื่อรันสคริปต์ทุกครั้งที่ผู้ใช้ลงชื่อเข้าใช้หรือไม่ คำแนะนำนี้จะช่วยคุณในการทำให้สามารถเรียกใช้งานได้เช่นกัน
Bulbasaur ปราศจากการนอนหลับ

1
"สคริปต์ถูกสร้างและดำเนินการทุกครั้งที่ผู้ใช้บันทึกปกติ" ทำไม ฉันจะแก้ไขปัญหานี้เพราะฟังดูไม่เป็นเหตุเป็นผล ฉันจะให้สคริปต์ผู้ใช้เป็นพารามิเตอร์และปล่อยให้สคริปต์ไม่ถูกแตะต้องหลังจากสร้างขึ้น
Rinzwind

1
มีคำถามหลายข้อที่ทำให้ฉันสับสนเกี่ยวกับสิ่งที่เกิดขึ้นในปัจจุบันและสิ่งที่คุณอยากให้ทำ มันจะช่วยถ้าคุณสามารถระบุได้มากกว่านี้เล็กน้อยเกี่ยวกับสถานการณ์ปัจจุบัน
Oli

โปรดแก้ไขคำถามของคุณและแสดงสคริปต์ให้เราทราบ ls -l scriptnameนอกจากนี้ยังแสดงให้เราเห็นการส่งออกของ คุณควรอธิบายให้ชัดเจนว่าสคริปต์ถูกสร้างขึ้นมาอย่างไรและทำไมคุณไม่สร้างเพียงครั้งเดียวและปล่อยให้อยู่คนเดียว ท้ายที่สุดผู้ใช้ปกติของคุณไม่ควรมีสิทธิ์ในการเขียน/varและดังนั้นจึงไม่สามารถสร้างไดเรกทอรีได้
terdon

1
โพสต์ลิงค์ภาพในความคิดเห็น เราจะนำเข้าสิ่งเหล่านี้ผ่านการแก้ไข (แนะนำ)
muru

คำตอบ:


19

มีสองสิ่งที่คุณต้องทำ:

  1. อ้างอิงล่ามสคริปต์ที่จุดเริ่มต้นของสคริปต์:

    #!/bin/bash
  2. ตั้งค่าการอนุญาตเพื่อให้สามารถเรียกใช้งานได้:

    chmod +x myscript.sh

3

แทนที่จะทำให้สคริปต์ของคุณทำงานได้คุณสามารถใช้วิธีการอื่นและเปลี่ยนวิธีที่คุณเรียกใช้สคริปต์

script.sh ก็เพียงพอที่จะเรียกใช้สคริปต์ที่ปฏิบัติการได้

อย่างไรก็ตาม

เป็นไปได้ที่จะเรียกใช้สคริปต์ที่ไม่สามารถใช้งานได้หากคุณระบุโปรแกรมที่จะเรียกใช้

ดังนั้น/bin/bash script.shหรือbash script.shหรือpython script.pyจะทำงานสคริปต์ทั้งหมดที่ไม่สามารถทำงานได้

ดังนั้นข้อเสนอแนะของฉันจะแก้ไขวิธีที่เรียกใช้สคริปต์และระบุไบนารีที่ใช้ในการเรียกใช้


ที่ด้านข้างของฉันฉันมักจะทำให้พวกเขาน่าตื่นเต้นเพราะถ้าคุณไม่ทำอย่างนั้นคุณไม่สามารถเปิดไฟล์ใหม่ได้ ตัวอย่างเช่นไพ ธ อนos.execv(__file__, sys.argv)จะไม่ทำงานและแน่นอนว่ามีสถานการณ์มากกว่านั้น หากการรักษาความปลอดภัยเป็นเป้าหมายเพียงแค่ใช้จาก root / sudo แทนให้ผู้ใช้เรียกใช้ไบนารี นอกจากนี้หากเป้าหมายคือความปลอดภัยคุณไม่ต้องการให้พวกเขาสามารถเรียกใช้สคริปต์ได้เพราะคุณสามารถทำอันตรายต่อระบบได้ ... ปฏิบัติการได้หรือไม่ ดังนั้นฉันไม่เห็นว่าทำไมจึงสำคัญที่จะต้องหลีกเลี่ยงไม่ให้ไฟล์เหล่านี้เรียกทำงานได้
m3nda

0

สร้างโปรแกรมใน C, C ++ หรือ Python เป็นต้นและใช้คำสั่งระบบเพื่อรันสคริปต์ bash

ตัวอย่างเช่นโปรแกรม C จะมีลักษณะดังนี้:

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

ในการรันโปรแกรมเมื่อเริ่มต้นให้เพิ่มไปยังรายการโปรแกรมเริ่มต้น เปิดแอปพลิเคชั่นเริ่มต้นจากเส้นประของคุณและเพิ่มไฟล์ประมวลผลที่คอมไพล์ลงในรายการโดยคลิกปุ่มเพิ่ม


2
-1: นี่ไม่ใช่คำตอบจริงๆ ทำไมหลามถึงดีกว่าเชลล์สคริปต์? นับประสา C! ไม่ว่าในกรณีใดคุณไม่ได้แสดงให้เห็นว่าโปรแกรมนี้มีลักษณะเป็นอย่างไรและคุณไม่ได้อธิบายวิธีเพิ่มโปรแกรมในรายการโปรแกรมเริ่มต้น
terdon

คำตอบสำหรับคำถามแรกของคุณสามารถให้ได้โดยอธิบายว่าภาษาการเขียนโปรแกรมนั้นแตกต่างจากภาษาสคริปต์อย่างไรสำหรับส่วนที่เหลือฉันได้แก้ไขคำตอบของฉันแล้ว
akxer

ขอบคุณสำหรับการแก้ไขลบ -1 อย่างไรก็ตามการใช้โปรแกรม C เพื่อเปิดเชลล์สคริปต์บน Linux นั้นไม่จำเป็นอย่างสมบูรณ์และเพิ่มค่าใช้จ่ายที่ไม่จำเป็น ทำไมไม่เพิ่มสคริปต์เองลงในแอปพลิเคชันเริ่มต้น หรือถ้าคุณต้องการใช้ C ทำไมไม่ใช้มันโดยตรง การสร้าง wrapper ใน C ที่เรียก shell script ภายใต้ Linux นั้นไม่จำเป็นเลยเว้นแต่ว่าคุณต้องการสคริปต์ที่จะรันด้วย SUID bit set แม้ในกรณีนั้นมักจะมีวิธีแก้ไขที่ง่ายกว่า
terdon

1
-1: สิ่งนี้จะยังคงล้มเหลวหากสคริปต์ไม่มีสิทธิ์ดำเนินการ bash path/yourbashscript.shคุณจะต้องเรียก
muru

1
สิ่งใดที่ทำให้เกิดคำถามทำไมไม่เรียกใช้bash path/yourbashscript.shโดยตรงแทนที่จะรวบรวมและเรียกใช้โปรแกรม C นี้
muru

0

คุณสามารถทำให้สคริปต์ bash ของคุณทำงานได้โดยเรียกใช้สิ่งต่อไปนี้ในบรรทัดคำสั่ง

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

จากนั้นการทำให้ดำเนินการเมื่อเริ่มต้นสามารถทำได้โดยเพิ่มลงในรายการโปรแกรมเริ่มต้นของคุณตามที่ @akabhirav กล่าว


ดูเหมือนว่าฉัน (ค่อนข้าง) คำถามแสดงให้เห็นว่าเขาคุ้นเคยกับวิธีการ chmod แต่เขากำลังขอวิธีที่จะทำให้สามารถเรียกใช้จากภายในสคริปต์เอง (ดังนั้นเขาจึงไม่ต้องทำด้วยตนเอง) แม้ว่าฉันจะยังคงตั้งคำถามกับวิธีการ: การสร้างสคริปต์ใหม่ในทันทีไม่ใช่วิธีการทำเช่นนี้
Rinzwind

0

SHCเป็นคอมไพเลอร์สคริปต์เชลล์ทั่วไป ใช้สคริปต์ซึ่งระบุไว้ในบรรทัดคำสั่งและสร้างรหัสต้นฉบับ C จากนั้นซอร์สโค้ดที่สร้างขึ้นจะถูกรวบรวมและเชื่อมโยงเพื่อสร้างไบนารีแบบแยกส่วน

ไบนารีที่รวบรวมจะยังคงขึ้นอยู่กับเชลล์ที่ระบุในบรรทัดแรกของรหัสเชลล์ (Shebang: #!/bin/shหรือเช่นนั้น) ดังนั้น SHC จึงไม่สร้างไบนารีอิสระที่สมบูรณ์

SHC ccตัวเองไม่ได้เป็นคอมไพเลอร์เช่น ค่อนข้างเข้ารหัสและเข้ารหัสเชลล์สคริปต์และสร้างซอร์สโค้ด C ด้วยความสามารถในการหมดอายุที่เพิ่มเข้ามา จากนั้นจะใช้คอมไพเลอร์ระบบเพื่อรวบรวมไบนารีที่ปล้นซึ่งทำงานเหมือนกับสคริปต์ต้นฉบับ เมื่อทำการประมวลผลไบนารีที่คอมไพล์แล้วจะถอดรหัสและรันโค้ดด้วย-cตัวเลือกของเชลล์


อะไรคือสิ่งที่จุดนี้หากความสามารถในการปฏิบัติการยังคงต้องการสภาพแวดล้อมของเชลล์ดั้งเดิม? สิ่งนี้ดีกว่าเพียงแค่เพิ่ม#!และchmod +x?
xiota
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.