Startskript mit sudo in Ubuntu 16.10

9

Ich muss ein Skript und eine Binärdatei /usr/binbeim Start mit sudo / root-Berechtigungen starten . Ich habe viele Anleitungen aus diesem Forum ausprobiert, aber nichts hat funktioniert ( rc.localund systemdStil, Upstart) - vielleicht mache ich etwas falsch. Mein Betriebssystem ist Ubuntu GNOME 16.10.

Das Skript wäre ungefähr so

#!/bin/bash
sudo ./usr/bin/myprogram
sudo bash /home/USER/script.bash

Sowohl das Skript als auch das Programm sind ausführbar. Ich weiß nur nicht, wie ich sie beim Start mit sudo optimal starten kann.

Bitte sei höflich. Ich bin ein neuer Benutzer.

bhunter
quelle
1
Benötigen diese Apps eine grafische Benutzeroberfläche? Versuchen Sie, eigenständige Elemente auszuführen, oder möchten Sie, dass sie bei der Anmeldung in der GUI angezeigt werden? Sie können all das ausführen rc.local(wie unten unter anonym2 erläutert) und benötigen es nicht, sudowenn es sich um eine Befehlszeilen-App handelt. Alles, weil es rc.local bereits als Root ausgeführt wird, aber für GUI-Apps nicht funktioniert.
Sergiy Kolodyazhnyy
Eines ist ein einfaches Skript für die Lüftersteuerung und das andere ist ein VPN-Client mit einer GUI. Das Skript muss nur ausgeführt und in eine Datei geschrieben werden, aber der VPN-Client sollte bis zum Herunterfahren gestartet und ausgeführt werden.
Bhunter
1
Ok, du wirst sie wahrscheinlich teilen wollen. Das Lüftersteuerungsskript kann sich selbst in rc.local befinden. VPN-Client ist schwieriger. Fügen Sie dies Startanwendungen hinzu und stellen Sie den Befehl pkexec voran. Ich bin gerade auf dem Handy und kann daher keine vollständige Antwort posten, werde dies aber tun, sobald ich nach Hause komme.
Sergiy Kolodyazhnyy

Antworten:

12

Für Befehlszeilenanwendungen, für die keine grafische Benutzeroberfläche erforderlich ist, reicht es aus, den Aufruf an sie zu stellen /etc/rc.local, der bereits als root ausgeführt wird und daher nicht benötigt wird sudo. Unten sehen Sie ein eigenes Beispiel, mit /etc/rc.localdem ich zwei Überwachungsskripte starte.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/home/xieerqi/bin/batmon.sh &
/home/xieerqi/bin/sh/temperature.sh  &
 exit 0

Für GUI-Anwendungen müssten Sie einen anderen Ansatz wählen. Sie müssen die Startup Applications-App öffnen und den folgenden Befehl hinzufügen:

bash -c "sleep 10;gksu /usr/bin/my_vpn_program"

Dies gibt der GUI ausreichend Zeit zum Starten, 10 Sekunden, öffnet dann das Passwortdialogfeld und startet Ihren Befehl, wenn Sie das Passwort richtig eingeben. Tatsächlich ist dies ein Mini-Bash-Skript. Sie können pkexecstattdessen verwenden, und einige könnten sogar sagen pkexec, dass anstelle von empfohlen wird gksu.

Wenn Sie nicht jedes Mal ein Kennwort eingeben möchten, können Sie Ihrem Benutzer alternativ erlauben, diesen bestimmten Befehl mit Root-Rechten ohne Authentifizierung auszuführen. Dazu müssen Sie die /etc/sudoersDatei bearbeiten . WARNUNG : Es wird empfohlen, sudo visudodie Datei vom Terminal aus zu bearbeiten. Unten sehen Sie ein Beispiel dafür, wie ich dieselbe Einstellung mit dem pm-suspendBefehl verwende:

# Allow using pm-suspend for my user without password
my_username_here ALL = NOPASSWD: /usr/sbin/pm-suspend

Diese Zeile sollte an das /etc/sudoersDateiende angehängt und gespeichert werden. Beachten Sie, dass Sie immer noch sudooder gksuan den Anfang jedes von Ihnen eingerichteten Befehls anhängen müssen . Daher müssten Sie denselben bashBefehl verwenden, den ich zuvor gezeigt habe.

Sergiy Kolodyazhnyy
quelle
Gute Antwort. Ich kann nicht glauben, dass ich dieses kleine Juwel vorher nicht bemerkt habe.
WinEunuuchs2Unix
1
Beachten Sie, dass gksuin Ubuntu 18 entfernt und /etc/rc.localbei Verwendung von systemd nicht aufgerufen wird, sondern mitsudo systemctl enable rc-local
rubo77
Sie können auch ein Systemd- Startskript
rubo77
2

Die Lösung ist so einfach, dass Sie sie verpasst haben. :) Da rc.local von root ausgeführt wird, sind die Sudos in Ihrer Datei völlig unnötig.

Mit anderen Worten, setzen Sie es wie vorgeschlagen in rc.local ein, aber lassen Sie die sudos in Ihrem Skript weg . Sie sind völlig unnötig, da rc.local bereits als root ausgeführt wird.

Hoffe das hilft!

anonym2
quelle
1
Ich habe irgendwo gelesen, dass der Dienst rc.local unter Ubuntu 16.10 deaktiviert ist. Es gibt jedoch eine Anleitung zum erneuten Aktivieren. Ist es sicher, rc.local zu aktivieren, wenn es aus Sicherheitsgründen oder aus anderen Gründen standardmäßig deaktiviert ist?
Bhunter
0

Verwenden Sie eine crontabOption, um Ihr Skript nach dem Neustart auszuführen.

Sie können dies tun, indem Sie @rebootCode in cron hinzufügen

Öffnen Sie crontab vom Root-Benutzer:

$ sudo crontab -e

Fügen Sie den nächsten Datensatz unten hinzu:

@reboot /usr/bin/myprogram

Das wird machen was du willst.

rubo77
quelle