Script-Reichweite im System

Jetzt klappt der Shutdown ohne PWD.
Die Lösung war, dass in der sudoers keine Schalter beim Befehl stehen dürfen:

Bash:
%users          ALL = (ALL) NOPASSWD: /sbin/shutdown

Teste noch schnell das PerlScript und dann wäre Baustelle Nr. 1 erledigt.
 
Hallo oneOeight

Kommando zurück. Du hast recht!
Das Problem war ein ganz anderes.
Ich habe All Users freigeschaltet für den PWD-freien Sudo-Befehl.
Ich war aber als Admin drin!

Somit sieht jetzt meine sudoers im betreffenden Bereich so aus:

Bash:
# root and users in group wheel can run anything on any machine as any user
root            ALL = (ALL) ALL
%admin          ALL = (ALL) ALL
%admin          ALL = (ALL) NOPASSWD: /sbin/shutdown -h now
%users          ALL = (ALL) NOPASSWD: /sbin/shutdown -h now

Somit hat es jetzt funktioniert!
 
  • Gefällt mir
Reaktionen: KOJOTE
Für alle, die die USV automatisch herunterfahren möchten

Getestet auf iMac (iMac (24-inch, M1, 2021)) mit einer Eaton Ellipse ECO 800 USV und Perl-Programm mit bbedit.
Die USV muss mit einem USB-B auf USB-C Kabel mit dem iMac verbunden sein - sonst geht es nicht. Bei mir in einer normalen USB-C Buchse (nicht Thunderbolt)

Hier ist das Perl-Script

Perl:
#!/usr/bin/perl

# jump mark REPEATER
REPEATER:

# powerline status indicator variable
$line_status_indicator = 0;

# terminal request for being on line-grid and store info in variable
print `pmset -g batt | grep 'charging present'`;
$raw_value_line_grid = `pmset -g batt | grep 'charging present'`;


# terminal request for being on battery-grid and store info in variable
print `pmset -g batt | grep 'discharging'`;
$raw_value_battery_grid = `pmset -g batt | grep 'discharging'`;

# variable content check in line-grid case
if ($raw_value_line_grid =~ m/charging present/)
   { print "UPS Upgrade: Ihr iMac arbeitet aktuell mit Netzspannung";
     print "\n";
     $line_status_indicator = 1; }
 
   else
   { print "UPS Upgrade: Ihr iMac arbeitet aktuell ohne Netzspannung";
     print "\n"; }

# variable content check in battery-grid case
if ($raw_value_battery_grid =~ m/discharging/)
   { print "UPS Upgrade: Ihr iMac arbeitet aktuell mit Batteriespannung";
     print "\n";
     $line_status_indicator = 2; }
 
   else
   { print "UPS Upgrade: Ihr iMac arbeitet aktuell ohne Batteriespannung";
     print "\n"; }

# variable content check for line_status_indicator
if ($line_status_indicator == 2)
   { print "UPS Upgrade: Aufgrund des Notstrombetriebes wird sich Ihr iMac automatisch ausschalten";
     print "\n";
     print "UPS Upgrade: Abschaltung erfolgt in 5 Minuten, wenn bis dahin das Netz nicht zurückgekehrt ist!";
     print "\n";
     goto WAITER; }
 
   else
   { goto WAITER; }




WAITER:

# info that waiting time starts
print "UPS Upgrade: 5 Minuten Wartezeit beginnt!";
print "\n";

# configure the waiting time here
sleep (10);

# info that waiting time is over
print "UPS Upgrade: 5 Minuten Wartezeit sind vorbei!";
print "\n";

# test after waiting time

# terminal request for being on line-grid and store info in variable
print `pmset -g batt | grep 'charging present'`;
$raw_value_line_grid = `pmset -g batt | grep 'charging present'`;

if ($raw_value_line_grid =~ m/charging present/)
   { print "\n";
     $line_status_indicator = 1; }

# variable content check for line_status_indicator
if ($line_status_indicator == 2)
   { print "UPS Upgrade: Der Notstrombetrieb besteht immer noch - Ihr iMac wird jetzt abgeschaltet!";
     print "\n";
     # display time for reading comment - if terminal was open
     sleep (10);
     print "\n";
     print `sudo shutdown -h now`;
     die; }

    else
    { print "UPS Upgrade: Ihr iMac bleibt eingeschaltet!";
      print "\n";
      goto REPEATER; }

Bei dem Remark “# configure the waiting time here“ müsst Ihr die sleep-Zeit auf 300 hoch setzen, damit ihr 5 Minuten Zykluspause erhaltet. Ich habe es für Testzwecke auf 10 Sekunden eingestellt.
Unten habe ich noch ein Screenshot vom Terminal, während das Programm läuft (im regulären Betrieb / Spannung vom Netz).

Für heute mache ich hier Schluss. Muss nach Hause!!!

Morgen können wir uns ja mal anschauen, wie wir dieses Script beim Hochfahren des iMac zum automatischen Laufen bekommen.

Viele liebe Grüsse

MacMurdock
 

Anhänge

  • screenshot_ups_upgrade.png
    screenshot_ups_upgrade.png
    375,6 KB · Aufrufe: 59
Zuletzt bearbeitet:
Das Problem war ein ganz anderes.
Ich habe All Users freigeschaltet für den PWD-freien Sudo-Befehl.
Ich war aber als Admin drin!
Auch nicht, als ich das damals nachgeguckt habe wegen der richtigen Gruppe hat %users auch die admins mit umfasst.
Bei mir ging es so auch mit admin user.
 
Morgen können wir uns ja mal anschauen, wie wir dieses Script beim Hochfahren des iMac zum automatischen Laufen bekommen.
Wieviel CPU Last erzeugt das mit der Dauerschleife?
Eventuell wäre es besser launchd es jede Minute ausführen zu lassen oder X Minuten.
 
Morgen zusammen

Ich habe ein Applescript geschrieben, welches als Starter für mein Terminalprogramm dienen soll:
AppleScript:
tell application "Terminal"
    do script "./Documents/Script/Perl_Stuff/ups_upgrade.pl"
end tell

Beim mitgelieferten Scripteditor (der mit dem Kugelschreiber-Symbol) habe ich das Applescript gespeichert und in diesem Editor kann man es auch gleich ausprobieren/starten.
Das funktioniert schon mal ganz gut. Hierzu zwei Fragen...

Erstens:

Nach dem Applescriptstart wird das Terminal geöffnet, mein ups_upgrade Script gestartet und dann wird das Terminal-Programm unten in der Hauptleiste angezeigt.
Kann man das so einstellen, dass es unten nicht angezeigt wird? Also irgendwie im Hintergrund läuft?

Zweitens:

Wie bekomme ich das Applescript in den Autostart?


Sollte "Erstens" nicht möglich sein, wäre dies kein Beinbruch. Die Autostartfunktion hätte ich aber schon gerne.

Gruss MacMurdock
 
Fertig... (y)

Habe alles hinbekommen. Das Applescript musste erst noch als "App" gespeichert werden, damit es ohne ScriptEditor ausführbar wird.
Dann habe ich über System, Benutzer, Anmeldeobjekte das Applescript "ups_script_starter.app" über das “+“-Zeichen eingefügt.
Alles marschiert. Und da ich das Terminal auf "im Dock behalten" eingestellt habe, fällt gar nicht gross auf, dass da noch ein Progrämmchen läuft.

Und Apple kann sich jetzt von mir aus Zeit lassen, mit der Behebung des OS-Mangels, dass angeschlossene USV's bzw. UPSen den iMac nicht automatisiert
herunterfahren können.

Danke an die vielen Helfenden!

P.S.

Über die Rechenlast mache ich mir hier keine Gedanken. Das System wird ja nur periodisch abgefragt. Die meiste zeit ist das Programm im "sleep"-Modus.
Und von einer wesentlichen CPU-Belastung, wie bei AutoCAD, Solidworks oder gar Videobearbeitung, sind wir hier ja "Lichtjahre" entfernt.
 
Warum hast du keinen launchd Agent erstellt?
https://www.launchd.info/

Wenn du keine Ausgabe des Scripts brauchst kannst du in Applescript eher
do shell script
verwenden.
 
  • Gefällt mir
Reaktionen: MacMurdock
Hi,

launchd.info fand ich jetzt wieder um zu viele Ecken gedacht. Das Script sieht aus wie XML... Naja
AppleScript und PerlScript ist gemischt genug, hehe...

Danke für den Tipp mit dem "do shell skript". Das probier ich gerne aus!
Nochmals Danke / Auch an varuna - für die Terminalbefehle im iMac-Format. Konnte ich die doch somit gleich in Perl einbauen...

Gruss MacMurdock
 
Hi again...

Ich habe ja gesagt, dass ich noch das do shell probieren möchte - was ich getan habe.
Da scheint aber, obwohl ich am Pfad nichts geändert habe, plötzlich ein Pfadproblem zu existieren.

Hat jemand eine Ahnung warum das Script mit "do script" läuft, aber mit "do shell script" nicht?

Anbei Foto zum Betrachten der Fehlermeldung...

Gruss MacMurdock
 

Anhänge

  • script_shellscript_path_problem.png
    script_shellscript_path_problem.png
    471,1 KB · Aufrufe: 61
do shell script läuft unter einem anderen User mit anderen ENV Variablen, da kannst nicht ein relatives ./ nehmen.
Da muss der Pfad schon allgemein sein, wie es für sich für Scripte eh gehört.

Den tell Terminal Block brauchst auch damit nicht.
 
  • Gefällt mir
Reaktionen: MacMurdock
Morgen

AppleScript:
tell application "Terminal"
    do shell script "~ ./Documents/Script/Perl_Stuff/ups_upgrade.pl"
end tell

Ergibt Fehler: „Terminal“ hat einen Fehler erhalten: sh: /Users/xxx: is a directory

Ich bekomme es auch mit dem "Würmchenzeichen" nicht hin. Brauch ich jetzt diese Tilde, oder nicht?
Des weiteren habe ich auch keinen passenden Ersatzt für die application "Terminal" gefunden. den "tell application" kann ich doch nicht einfach weglassen - oder doch?

Nachtrag:

Wenn ich das so mache: do shell script "~/Documents/Script/Perl_Stuff/ups_upgrade.pl"
Dann erscheint auch keine Fehlermeldung mehr. Ich weis aber auch nicht, ob das Programm dann überhaupt läuft. bzw. ich kann keinen Prozess finden.

Ich denke wir lassen dass mit dem "do shell script" und ich verwende weiterhin do script.

Gruss und Danke

MacMurdock
 
Zuletzt bearbeitet:
Brauch ich jetzt diese Tilde, oder nicht?
Nein, das ist Shortcut für das Home und das wäre für jeden Benutzer anders.
(Man schreibt wenn ~/ ohne Leerzeichen.)
Deswegen absolute Pfade.
Und noch mal, den Tell Block brauchst du nicht, es muss nur do shell script im Script stehen.
 
Und hier wie du das über launchd starten würdest:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>Label</key>
		<string>UPS</string>
		<key>Program</key>
		<string>/Users/name/Documents/Script/Perl_Stuff/ups_upgrade.pl</string>
		<key>RunAtLoad</key>
		<true/>
	</dict>
</plist>

Das speicherst du als ups.plist oder wie auch immer und packst es in /Library/LaunchDaemons oder halt in ~/Library/LaunchAgents
 
  • Gefällt mir
Reaktionen: KOJOTE
Wenn ich das so mache: do shell script "~/Documents/Script/Perl_Stuff/ups_upgrade.pl"
Dann erscheint auch keine Fehlermeldung mehr. Ich weis aber auch nicht, ob das Programm dann überhaupt läuft. bzw. ich kann keinen Prozess finden.
Wahrscheinlich musst du es mit & in den Hintergrund schicken damit es weiterläuft.

Aber schau mal Beitrag #56 wie du es über launchd startest.
 
Hi

Vielen lieben Dank oneOeight, aber das übersteigt aktuell meine Kenntnisse und ich muss noch mit anderen Dingen hier weiter fortfahren.
So wie ich das sehe bin ich bereits für die Pfade zu blöde ;)

Im Terminalfenster steht z.B. bei Befehl ls "Documents".
In der Benutzeroberfläche im Finder steht aber "Dokumente" <- auf Deutsch (Ist aber der selbe Ordnerinhalt)
Die Pfade im Finder sehen, wenn ich sie unten einblenden lasse, einfach anders aus. Im Terminal komme ich gar nicht weiter herunter,
wie zu meinem Benutzernamen. Ein weiteres ".." führt zur Meldung "zsh: permission denied: .."

Ich habe also bereits Mühe, den richtigen, echten Pfad von der Festplatte bis in meinen Ordner zu dem entsprechenden Perl Programm zu finden, bzw an zu geben.
Wie gesagt - ich bin neu auf MacOS - das ist mein erster iMac. Und da nutze ich aktuell mehr oder weniger die Gegebenheiten, ohne noch wirklich genau zu verstehen, wie, wo was ist und wie das zusammenspielt.

Gruss MacMurdock
 
Im Terminalfenster steht z.B. bei Befehl ls "Documents".
In der Benutzeroberfläche im Finder steht aber "Dokumente" <- auf Deutsch (Ist aber der selbe Ordnerinhalt)
Das ist halt die Übersetzung im Finder, im Dateisystem heißt es trotzdem Documents.
Im Terminal komme ich gar nicht weiter herunter,
wie zu meinem Benutzernamen. Ein weiteres ".." führt zur Meldung "zsh: permission denied: .."
Du musst dem Terminal schon Festplattenvollzugriff geben unter Datenschutz.

Ich habe also bereits Mühe, den richtigen, echten Pfad von der Festplatte bis in meinen Ordner zu dem entsprechenden Perl Programm zu finden, bzw an zu geben.
Da gibt es eine bequeme Einrichtung, man kann die Datei in das Terminal Fenster ziehen und bekommt dann den Pfad.

Aber ansonsten ist simpel den selbst zu sehen, du schaffst es doch noch /Users/name vor /Documents/... zu setzen.
So schwierig ist das auch nicht.
Oder in Documents mit pwd den Pfad anzeigen lassen, da gibt etliche Möglichkeiten.
 
  • Gefällt mir
Reaktionen: KOJOTE und MacMurdock
Zurück
Oben Unten