Problem beim Ausführen eines Skripts beim Start als Root?

Problem beim Ausführen eines Skripts beim Start als Root?

Die Hauptfrage:

Gibt es eine Möglichkeit, eines meiner Skripte „vollständig“ auszuführen, wenn der Ubuntu-Desktop angezeigt wird, unabhängig davon, ob ich als Root, Administrator, Desktop-Benutzer oder als nicht privilegierter Benutzer angemeldet bin?

Was macht das Skript?

Das Skript mountet eine Partition, sucht in dieser Partition nach einer Datei und entscheidet schließlich auf der Grundlage dieser Datei, ob die Partition auf eine andere Partition kopiert werden soll. Das Kopieren erfolgt über

dd if=/dev/sda2 of=/dev/sda5

Wann läuft das Skript einwandfrei?

Das Skript läuft reibungslos, wenn ich es vom Terminal aus ausführe.

sudo ./my_copying_script

Dieser Befehl fragt mich nach dem Passwort des aktuell angemeldeten Benutzers. Ich gebe das Passwort ein und das Skript beginnt zu arbeiten.

Wann läuft das Skript NICHT einwandfrei?

Ich möchte das Skript beim Start ausführen. Ich habe es als Startprogramm eingerichtet, indem ichStartup-AnwendungenDienstprogramm von Ubuntu. Das Skript wurde beim Start ausgeführt, aber beim dd-Befehl beendet und gab folgenden Fehler zurück:

dd: opening '/dev/sda2': Permission denied 

AnedkIch habe vorgeschlagen, den Besitzer von my_copying_script als root festzulegen und die SUID festzulegen. Jetzt lauten die Berechtigungen von my_copying_script (-rwsr-sr-x).edkDer Standpunkt von war, dass das Startprogramm mit den Berechtigungen seines Besitzers ausgeführt wird, sobald ich die Suid festgelegt habe. Ich habe das getan, aber der gleiche /dev/sda2-Berechtigungsverweigerungsfehler trat auf.

Ich habe dann dem dd das Präfix sudo vorangestellt, wie unten beschrieben

 sudo dd if=/dev/sda2 of=/dev/sda5

aber dies hat folgenden Fehler zurückgegeben:

sudo: no tty present and no askpass program specified

Antwort1

Usman, ich denke, Sie haben mindestens zwei Optionen, die ich bereits erwähnt habe.

Ein einfacher Weg

Erstellen Sie eine Binärdatei mit festgelegter UID, die (überprüft, wer sie gestartet hat, und die Verwendung zulässt, wenn der Eigentümer des übergeordneten Prozesses sie ausführen kann), das vorbereitete Skript ausführt und beendet. Fügen Sie es in den Start Ihres Desktop-Managers ein, das ist alles. Seien Sie jedoch gewarnt, dass dies nicht der beste Weg ist und ein wenig C-Codierung erfordert. Im Grunde müssen Sie einen Code wie dieses Beispiel erstellen:

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

Beachten Sie, dass dies ein Hack und keine wirkliche Lösung ist. Und verwenden Sie unbedingt root:allowed_group und 4750 Rechte aufbinärwenn es nicht von jedem ausgeführt werden muss. Denken Sie daran, alle Benutzer, die dies starten dürfen, zur allowed_group (wählen Sie Ihren Namen) hinzuzufügen.

Ein guter Weg

Ein anderer, viel besserer Weg ist, eine Art Daemon zu erstellen, der beim Systemstart gestartet wird (z. B. von Init-Skripten), aber ich bin mir nicht sicher, wie genau Sie feststellen werden, wann eine neue X-Sitzung gestartet wird. Ich war noch nicht in diesem Thema, ich kann keineklarRatschläge hier.

Antwort2

Legen Sie dann die richtigen Berechtigungen für den bereitgestellten Laufwerkspfad fest, und Sie sind fertig.

Antwort3

sudo führt ein Programm nur dann als anderer Benutzer aus, wenn eine dieser 3 Bedingungen erfüllt ist (was Passwörter betrifft):

  1. die Option NOPASSWD ist angegeben
  2. der Benutzer das richtige Zielkennwort eingegeben hat
  3. der Benutzer hat das richtige Quellkennwort eingegeben

Da für die Optionen 2 und 3 ein TTY erforderlich ist (sudo liest nicht aus einer Pipe), wird es nicht ausgeführt, wenn es keins findet. Überprüfen Sie Ihr Skript, wenn Sie zu irgendeinem Zeitpunkt ein Skript remote über SSH ausführen, da es möglich ist, dass es für einen nicht interaktiven Remote-Befehl kein TTY zuweist.

Zitiert aus:Hier

Antwort4

Eine mögliche Lösung besteht darin, Ihren Benutzer und den Befehl, den er aufrufen möchte, mit dem Parameter NOPASSWD zu /etc/sudoers hinzuzufügen. Aus /etc/sudoers ausschneiden:

# Entfernen Sie das Kommentarzeichen, damit Mitglieder der Gruppe „sudo“ kein Passwort benötigen
# (Beachten Sie, dass spätere Einträge diese überschreiben, daher müssen Sie möglicherweise
# es weiter unten)
# %sudo ALLE=NOPASSWD: ALLE

Vielleicht brauchen Sie also etwas wie:

myuser ALL=NOPASSWD: mount

Ich bin mir über die genaue Syntax nicht ganz sicher. Googeln Sie am besten danach.

BEARBEITEN:Wenn Sie versuchen, ein Netzlaufwerk zu mounten, wird das Hinzufügen eines Datensatzes zu /etc/fstab wahrscheinlich nicht funktionieren, da die Netzwerkdienste zum Zeitpunkt der Ausführung von fstab nicht geladen sind.

verwandte Informationen