ein Bash-Skript programmgesteuert ausführbar machen


11

Ich muss ein Bash-Skript erstellen, um ein Laufwerk zu erstellen und bereitzustellen. Also zwei einfache Befehle. Beide "funktionieren", wenn sie über die Befehlszeile eingegeben werden.

Das Skript wird jedes Mal erstellt und ausgeführt, wenn sich ein normaler Benutzer anmeldet. Daher benötige ich eine Methode, um dieses Skript zu diesem Zeitpunkt ausführbar zu machen. Bisher kann ich das nicht zum Laufen bringen. Zum Beispiel wird der erste Teil mkdir /vvv/ggggnicht fortgesetzt, da das Skript nicht ausführbar ist (ich vermute).

Hoffe das macht Sinn. Ist das möglich? Alle Gedanken darüber, wie diese Arbeit gemacht werden soll, werden geschätzt.

Update :

Vielen Dank für Ihre Antworten. Ich sollte wahrscheinlich einige zusätzliche Informationen hinzufügen, außer dass ich neu in Linux bin.

Ich verwende eine virtuelle Open Source-Desktopanwendung namens Ulteo. Diese App läuft auf Ubuntu und hat sehr wenig Unterstützung - deshalb bin ich hier. Grundsätzlich lerne ich durch Feuer.

Die Anwendung verfügt also über eine Anmeldeskriptverwaltungsfunktion, mit der ich ein Skript an einen Benutzer binden kann. Ein einfaches Windows-Skript mit Netznutzung funktioniert einwandfrei. Wenn ich jedoch versuche, ein Linux-Bash-Skript anzuwenden, passiert nichts.

Ich denke, weil ich zuerst ein chmod +xgegen das Skript ausführen muss , um das Skript ausführbar zu machen, schlägt es deshalb fehl. Ulteo rennt übrigens in einem Chroot-Gefängnis. Ich habe ein Skript erstellt, es gespeichert und konnte das Skript nicht finden. Ich suchte sowohl innerhalb als auch außerhalb des Chroot-Gefängnisses.

Ich mag den Ansatz von dan08, dass das anfängliche Skript auf ein anderes Skript verweist, das ich finden und manuell ausführbar machen kann. Würde ich auf das gleiche Problem stoßen?

Klären diese zusätzlichen Informationen die Situation? Danke im Voraus.

Fotos beigefügt.

! [Login-Scipt-Verwaltungskonsole] [1]

! [Windows-Skripte, die funktionieren] [2]

! [einfaches Linux-Skript, das nicht funktioniert] [3]

Entschuldigung, ich kann noch keine Bilder posten


Schreiben Sie einen Cron-Job, um das Skript jedes Mal auszuführen, wenn ein Benutzer angemeldet ist? Dieses Handbuch soll Ihnen dabei helfen, sie auch ausführbar zu machen .
Schlaf entzogen Bulbasaur

1
"Das Skript wird jedes Mal erstellt und ausgeführt, wenn sich ein normaler Benutzer anmeldet" Warum? Ich würde das beheben, da es für mich unlogisch klingt. Ich würde das Skript dem Benutzer als Parameter zuführen und das Skript nach dem Erstellen unberührt lassen.
Rinzwind

1
Es gibt eine seltsame Mischung von Zeitformen in der Frage, die mich verwirrt darüber lässt, was aktuell passiert und was Sie damit tun möchten. Es wäre hilfreich, wenn Sie die aktuelle Situation etwas genauer beschreiben könnten.
Oli

Bitte bearbeiten Sie Ihre Frage und zeigen Sie uns das Skript. Zeigen Sie uns auch die Ausgabe von ls -l scriptname. Sie sollten auch klären, wie genau das Skript erstellt wird und warum Sie es nicht nur einmal erstellen und in Ruhe lassen. Schließlich sollte Ihr normaler Benutzer keinen Schreibzugriff haben /varund daher dort keine Verzeichnisse erstellen können.
Terdon

1
Veröffentlichen Sie die Bildlinks in den Kommentaren. Wir werden sie über (vorgeschlagene) Änderungen importieren.
Muru

Antworten:


18

Es gibt zwei Dinge, die Sie tun müssen:

  1. Verweisen Sie auf den Skriptinterpreter am Anfang des Skripts:

    #!/bin/bash
  2. Legen Sie die Berechtigungen fest, um es ausführbar zu machen:

    chmod +x myscript.sh

2

Anstatt Ihr Skript ausführbar zu machen, können Sie einen anderen Ansatz wählen und die Art und Weise ändern, wie Sie das Skript aufrufen.

script.sh reicht aus, um ein ausführbares Skript auszuführen.

jedoch

Es ist möglich, ein nicht ausführbares Skript auszuführen, wenn Sie das Programm angeben, zu dem es ausgeführt werden soll.

Also /bin/bash script.shoder bash script.shoder python script.pywerden alle nicht ausführbare Skripte ausführen.

Mein Vorschlag wäre also, die Art und Weise, wie das Skript aufgerufen wird, zu bearbeiten und die Binärdatei anzugeben, mit der es ausgeführt wird.


Auf meiner Seite mache ich sie normalerweise entschuldbar, denn wenn Sie das nicht tun, können Sie die Datei nicht von selbst neu starten. Zum Beispiel os.execv(__file__, sys.argv)würde Python nicht funktionieren, und es gibt sicher mehr solche Situationen. Wenn Sicherheit ein Ziel ist, verwenden Sie es einfach von root / sudo aus, damit Benutzer Binärdateien ausführen können. Wenn das Ziel die Sicherheit ist, möchten Sie nicht, dass sie Skripte ausführen können, da Sie dem System sowieso Schaden zufügen können ... ausführbar oder nicht. Ich verstehe also nicht, warum es wichtig ist, sie nicht ausführbar zu machen.
m3nda

0

Erstellen Sie ein Programm in C, C ++ oder Python usw. und verwenden Sie den Systembefehl, um das Bash-Skript auszuführen.

Zum Beispiel würde ein C-Programm folgendermaßen aussehen:

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

Um das Programm beim Start auszuführen, fügen Sie es der Liste der Startprogramme hinzu. Öffnen Sie die Startanwendungen in Ihrem Dash und fügen Sie die kompilierte ausführbare Datei zur Liste hinzu, indem Sie auf die Schaltfläche Hinzufügen klicken.


2
-1: Dies ist keine wirkliche Antwort. Warum sollte Python besser sein als ein Shell-Skript? Geschweige denn C! In jedem Fall zeigen Sie nicht, wie dieses Programm aussehen würde, und Sie erklären nicht, wie Sie ein Programm zur Liste der Startprogramme hinzufügen.
Terdon

Die Antwort auf Ihre erste Frage kann gegeben werden, indem erklärt wird, wie sich eine Programmiersprache von einer Skriptsprache unterscheidet, da ich im Übrigen meine Antwort bearbeitet habe
akxer

Danke für die Bearbeitung, -1 entfernt. Die Verwendung eines C-Programms zum Starten eines Shell-Skripts unter Linux ist jedoch völlig unnötig und verursacht unnötigen Overhead. Warum nicht einfach das Skript selbst zu den Startanwendungen hinzufügen? Oder wenn Sie C wirklich verwenden möchten, warum implementieren Sie es nicht direkt? Das Erstellen eines Wrappers in C, der ein Shell-Skript unter Linux aufruft, ist überhaupt nicht sinnvoll, es sei denn, Sie müssen das Skript mit gesetztem SUID-Bit ausführen. Selbst in diesem Fall gibt es normalerweise einfachere Lösungen.
Terdon

1
-1: Dies würde immer noch fehlschlagen, wenn das Skript keine Ausführungsberechtigungen hätte. Du müsstest anrufen bash path/yourbashscript.sh.
Muru

1
Was die Frage aufwirft, warum nicht bash path/yourbashscript.shdirekt ausgeführt werden, anstatt dieses C-Programm zu kompilieren und auszuführen ?
Muru

0

Sie können Ihr Bash-Skript ausführbar machen, indem Sie Folgendes in der Befehlszeile ausführen.

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

Wenn Sie es dann beim Start ausführen, können Sie es zu Ihrer Liste der Startprogramme hinzufügen, wie @akabhirav sagte.


Es scheint mir, dass die Frage (etwas) zeigt, dass er mit chmod vertraut ist. Er fragt jedoch nach einer Methode, um sie aus dem Skript heraus ausführbar zu machen (damit er dies nicht manuell tun muss). Obwohl ich die Methode immer noch in Frage stelle: Die Neuerstellung eines Skripts im laufenden Betrieb ist nicht der richtige Weg, dies zu tun.
Rinzwind

0

SHC ist ein generischer Shell-Skript-Compiler. Es benötigt ein Skript, das in der Befehlszeile angegeben ist und C-Quellcode erzeugt. Der generierte Quellcode wird dann kompiliert und verknüpft, um eine gestrippte Binärdatei zu erzeugen.

Die kompilierte Binärdatei hängt weiterhin von der in der ersten Zeile des Shell-Codes angegebenen Shell ab (der Shebang: #!/bin/shoder so), sodass SHC keine vollständig unabhängigen Binärdateien erstellt.

SHC selbst ist kein Compiler wie cc. Codiert und verschlüsselt vielmehr ein Shell-Skript und generiert C-Quellcode mit der zusätzlichen Ablauffunktion. Anschließend wird der System-Compiler verwendet, um eine abgespeckte Binärdatei zu kompilieren, die sich genau wie das ursprüngliche Skript verhält. Bei der Ausführung entschlüsselt die kompilierte Binärdatei den Code und führt ihn mit der -cOption der Shell aus .


Was bringt das, wenn die ausführbare Datei noch die ursprüngliche Shell-Umgebung benötigt? Wie ist das besser als nur ein #!und hinzuzufügen chmod +x?
Xiota
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.