Gelöst! Problem beim Skript ausführen mit ExecStartPost

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von breakthewall » 27.03.2018 13:06:59

Leider? Zum Glück steht der Output diverser Befehle nicht in den System-Logs.

Einfach in eine Datei umleiten:

Code: Alles auswählen

sudo npm outdated -g > DATEI
Wobei es ziemlich egal ist, ob man den Output nun in ein Array, eine Datei, oder in eine Variable umleitet. Eben je nachdem wie das weiterverarbeiten willst.

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 13:16:51

Hey Danke für die Antwort,
das gleiche habe ich auch gerade schon getestet, bin durch Zufall auf Weiterleitungen im UBUNTU Wiki gestoßen :D

Wäre auf jeden Fall eine Option, die Datei kann ich ja mit dem Skript auf der ersten Seite etwas angepasst auch verarbeiten und Telegram übermitteln.

Noch besser wäre diesem Curl Befehl irgendwie mitzuteilen das er die Ausgabe direkt sendet. Habe was von Pipe gelesen |
wo ein Befehl die Ausgabe direkt an den nächsten weitergibt das könnte ja fast das sein was ich benötige. Habe aber noch nicht wirklich kapiert wie das funktionieren soll das er im Feld
text="Hello World"
statt dessen das Ergebnis einfügt. Wenn es so überhaupt geht :roll:

Code: Alles auswählen

sudo npm outdated -g | curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d chat_id=<CHAT_ID> -d text="Hello World"

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von scientific » 27.03.2018 13:40:44

Probiers mal damit:

Code: Alles auswählen

curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d chat_id=<CHAT_ID> -d text="$(sudo npm outdated -g)"
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 13:46:31

Hammer, das funktioniert besten Dank!!! :hail: :hail: :hail: das eröffnet ganz neue Möglichkeiten :D

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von scientific » 27.03.2018 13:53:25

Du wirst vielfach auf Backticks

Code: Alles auswählen

echo `/bin/ls`
stoßen. Backticks führen den darin eingeschlossenen Befehl in einer Subshell aus. Damit sind aber keine Verschachtelungen möglich.
$(/bin/ls) mach das gleiche. Es führt den eingeschlossenen Befehl in einer Subshell aus. Jedoch sind Verschachtelungen möglich:

Code: Alles auswählen

echo $(cat $(find /home/scientific/ -type f)) 
Die Beispiele sind natürlich sinnfrei... aber zeigen, was mit Subshells mit $() geht.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von NAB » 27.03.2018 16:52:33

Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 08:13:30
Also der Dateiname von der erzeugten Datei sieht so aus und enthält keine Leerzeichen:
Ja, stimmt. Aber die alte logwatch-Zeile, die du entfernt hast, die hat Leerzeichen erzeugt. Aber gut, die alten Dateien scheinen weg zu sein :D
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 08:13:30
Wie meinst du das genau, also wenn ich als User Pi einen Befehl eingebe mit sudo xxxxx geht es ohne Pw.
Ja, genau das meinte ich.
hmm ... dann könnten wir es ja doch noch mal mit einfachen Benutzerrechten versuchen.
Dazu müsstest du erst mal ein:
User=pi
in die Systemd-Unit schreiben. Und zweitens müssen zwei Zeilen geändert werden:

Code: Alles auswählen

/usr/bin/sudo /usr/sbin/logwatch --output file --filename $filename
Da kommt ein sudo davor, denn pi darf logwatch nicht ausführen. Und:

Code: Alles auswählen

/usr/bin/find /home/pi/logwatch/* -mtime +1 -exec /bin/rm -f {} \;
Hier ist das -f neu. Das verhindert, dass rm nervige Rückfragen stellt, ob es wirklich Dateien löschen soll, die root gehören.

Das klappt nur, wenn das Verzeichnis /home/pi/logwatch auch wirklich "pi" gehört (sonst darf pi die Dateien von root darin nicht löschen).
Du könntest noch ein:

Code: Alles auswählen

/bin/mkdir -p ~/logwatch
oben in die "Vorgaben Skript" schreiben, dann wird das Verzeichnis automatisch erzeugt, wenn es nicht existiert.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 13:16:51
statt dessen das Ergebnis einfügt. Wenn es so überhaupt geht :roll:

Code: Alles auswählen

sudo npm outdated -g | curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d chat_id=<CHAT_ID> -d text="Hello World"
Himmel, ist die man page von curl lang ...
Das scheint tatsächlich auch mit einer Weiterleitung zu klappen, und zwar mit dieser komischen Notation:

Code: Alles auswählen

sudo npm outdated -g | curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d chat_id=<CHAT_ID> -d @-
Das ist aber eine Spezialität von curl. Die Lösung von scientific ist universeller.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 17:29:16

Hey NAB, habe es gerade getestet. Klappt leider nicht. Er sendet mir die Nachricht die ich eingebaut habe aber nicht mehr die Datei.

Edit: sudo bash logwatch.sh funktioniert aus dem Terminal Nachricht und Datei kommen an.

Hier der Log aus dem Terminal vom Service:

Code: Alles auswählen

Mär 27 17:19:06 HomeBridgeServer systemd[1]: Starting logwatch.service...
Mär 27 17:19:06 HomeBridgeServer sudo[18646]:       pi : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/sbin/logwatch --output file --filename /home/pi/logwatch/2018-03-27-logwatch.txt
Mär 27 17:19:06 HomeBridgeServer sudo[18646]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mär 27 17:19:24 HomeBridgeServer sudo[19000]:       pi : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/npm outdated -g
Mär 27 17:19:24 HomeBridgeServer sudo[19000]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mär 27 17:19:36 HomeBridgeServer systemd[1]: Started logwatch.service.
Und so sieht die Service Datei aus:

Code: Alles auswählen

[Unit]
Description=logwatch.service
Wants=network.target

[Service]
User=pi
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/logwatch.sh

[Install]
WantedBy=multi-user.target
Hier das Skript:

Code: Alles auswählen

#!/bin/bash

############### Vorgaben Skript ###############
/bin/mkdir -p ~/logwatch
day=$(date +%Y-%m-%d)
filename=/home/pi/logwatch/$day-logwatch.txt


############### Telegram Config ##############
######## Token und Chat ID ausfüllen #########
token=
chat_id=


############### Logdatei erstellen ###############
/usr/bin/sudo /usr/sbin/logwatch --output file --filename $filename


############### Logdatei versenden ###############
/usr/bin/curl -F chat_id="$chat_id" -F document=@"$filename" https://api.telegram.org/bot$token/sendDocument >/dev/null 2>&1


############### Logdatei löschen die älter als +1 Tage sind ###############
/usr/bin/find /home/pi/logwatch/* -mtime +1 -exec /bin/rm -f {} \;


############### Plugin Update Check ###############
/usr/bin/curl -s -X POST https://api.telegram.org/bot$token/sendMessage -d chat_id="$chat_id" -d text="Verfuegbare Updates: $(sudo npm outdated -g)"

Noch eine Frage zu dem Befehl der das Dokument Versendet, ich würde gerne hier noch eine Beschreibung zu dem Dokument also einen Text in die gleiche Nachricht einfügen. Habe im Netz das hier gefunden und ausprobiert, funktioniert aber nicht die Lösung. Hat da noch einer eine Idee wie man das umbauen müsste?

https://stackoverflow.com/questions/395 ... legram-bot

@scientific
Danke für die Erklärung, was sind Backticks und was meinst du mit verschachtelungen genau. :?

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 17:47:56

-
Zuletzt geändert von Nastra am 27.03.2018 21:45:58, insgesamt 1-mal geändert.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von scientific » 27.03.2018 18:48:00

Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 17:29:16
@scientific
Danke für die Erklärung, was sind Backticks und was meinst du mit verschachtelungen genau. :?
Ich hab dir eh Beispiele aufgeschrieben. Backtick lässt sich googlen.... Aber ich mach es für dich:
Backtick = nach links geneigte einfache Anführungszeichen. Bekommst du mit <Shift>+<´> = <`>

Eine Verschachtelung hab ich dir auch im Beispiel gezeigt.
$() entspricht ``
$($()) ist eine Verschachtelung. Probier das einmal mit ````
Also in einer Subshell führst du eine Subsubshell aus.

Das hat alle Vor- und auch Nachteile einer Subshell. Nachteil z.B. ist, dass eine Variable in der Subshell nicht in der Shell verfügbar ist. Eine Variable in der Subsubshell ist auch nicht in der Subshell und auch nicht in der Shell verfügbar. Umgekehrt aber schon!

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 20:42:10

@scientific

Das ist ja wie bei denn Paketdienste Sub sub sub sub :mrgreen:
Danke für die Erklärung mal schauen ob ich es auch bedienen kann. Werde morgen mal ein, zwei Sachen ausprobieren bzw. rumzuspielen damit.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von NAB » 27.03.2018 21:43:04

Nastra, hast du in deinem vorletzten Posting vielleicht Daten drin, die du nicht veröffentlichen möchtest?
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 17:29:16
Hey NAB, habe es gerade getestet. Klappt leider nicht. Er sendet mir die Nachricht die ich eingebaut habe aber nicht mehr die Datei.
Das klingt, als ob er die Datei einfach nicht lesen kann. "Eigentlich" sollte root Dateien erzeugen, die für jeden lesbar sind, das kann man aber mit der UMASK ändern.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 17:29:16
Edit: sudo bash logwatch.sh funktioniert aus dem Terminal Nachricht und Datei kommen an.
Logisch ... mit "sudo" führst du das Script ja wieder als root aus, und als root ging es schon die ganze Zeit. Die Frage ist, ob es auch ohne sudo funktioniert.

Du müsstest jetzt übrigens den Ordner /root/logwatch erzeugt haben, falls die Zeile mit dem /bin/mkdir schon drin war.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 17:29:16
Das Ordner anlegen geht auch nicht
Ja, hast du den Ordner wieder gelöscht? Falls ja, ist das logisch, wenn du das Script mit sudo startest. Dann läuft das Script als root und aus ~/logwatch wird /root/logwatch. Wenn das Script als "pi" läuft, wird aus ~/logwatch ein /home/pi/logwatch.

Wir versuchen jetzt mal, das Problem mit dem Hammer zu erschlagen:

Code: Alles auswählen

############### Logdatei erstellen ###############
/usr/bin/sudo /usr/sbin/logwatch --output file --filename $filename
/usr/bin/sudo /bin/chown pi:pi $filename
(die letzte Zeile ist neu und ändert den Besitzer der Datei einfach auf "pi". Der Rest bleibt gleich)

Aber wie ich sehe, hast du mit npm gleich die nächste Neuerung eingebaut. Wenn sich das Script weiterhin so schnell ändert, schlage ich vor, wir lassen diese Versuche, es als Benutzer "pi" laufen zu lassen, das ganze sudo wird sonst zu unübersichtlich und schafft eher neue Fehlerquellen als das es vor Fehlern schützt. Ich weiß zum Beispiel nicht mal, ob npm überhaupt als root laufen muss.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.03.2018 17:29:16
Noch eine Frage zu dem Befehl der das Dokument Versendet, ich würde gerne hier noch eine Beschreibung zu dem Dokument also einen Text in die gleiche Nachricht einfügen. Habe im Netz das hier gefunden und ausprobiert, funktioniert aber nicht die Lösung. Hat da noch einer eine Idee wie man das umbauen müsste?
Ja, wie sieht denn das aus, was nicht funktioniert?
Die Telegram API kennt zumindest "caption":
https://core.telegram.org/bots/api#senddocument
Und schau dir mal dieses Script an:
https://github.com/NicolasBernaerts/deb ... ram-notify
im unteren Teil setzt er die ganzen Befehle ab, da scheint es auch mit "caption" zu klappen.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 27.03.2018 22:02:07

Danke für denn Hinweis :wink:
Logisch ... mit "sudo" führst du das Script ja wieder als root aus, und als root ging es schon die ganze Zeit. Die Frage ist, ob es auch ohne sudo funktioniert.
Ging auch nicht gerade probiert.
Du müsstest jetzt übrigens den Ordner /root/logwatch erzeugt haben
Jo da ist er.
wir lassen diese Versuche, es als Benutzer "pi" laufen zu lassen
Denke auch das es so einfacher für mich ist :THX:


Denn Link bei GitHub werde ich mir morgen genauer anschauen. Habe selber auch noch ein zwei Sachen gefunden dazu. Die API hatte ich auch schon gesichtet. Konnte aber nicht viel damit anfangen außer das was du auch sagts das es die Funktion kennt. Ich werde berichten. Danke für die Mühe.
Zuletzt geändert von Nastra am 28.03.2018 10:14:42, insgesamt 2-mal geändert.

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 28.03.2018 09:10:26

Guten Morgen,

@NAB habe es hinbekommen das die Datei und Text zusammen versendet werden :THX: .
Bei Erfolgserlebnissen kann das ja richtig Spass machen :mrgreen:
Musste es nochmal erweitern 8)

Nochmal Danke an alle die geholfen haben :hail:

Hier das Ergebnis:

Code: Alles auswählen

#logwatch.sh
#!/bin/bash

############################## Vorgaben Skript ##############################

day=$(date +%Y-%m-%d)
filename=/home/pi/logwatch/$day-logwatch.txt
/bin/mkdir -p ~/logwatch

############################## Nachrichten Text ##############################
######### Achtung! Keine Leerzeichen verwenden bei Nachrichten Text ##########

#Logdatei versenden
nachricht1=Systemzusammenfassung:

#Update prüfen npm 
nachricht2=Verfügbare-Updates-npm:

#Update prüfen Firmware
nachricht3=Verfügbare-Updates-Firmware:


############################## Telegram Config ###############################
######################## Token und Chat ID ausfüllen #########################

token=
chat_id=



############################# Logdatei erstellen #############################

/usr/sbin/logwatch --output file --filename $filename



############################## Logdatei versenden ############################

/usr/bin/curl -F chat_id="$chat_id" -F document=@"$filename" -F caption="$nachricht1" https://api.telegram.org/bot$token/sendDocument >/dev/null 2>&1



################# Logdatei löschen die älter als +7 Tage sind ################

/usr/bin/find /home/pi/logwatch/* -mtime +7 -exec /bin/rm {} \;



############################## Update prüfen npm #############################

/usr/bin/curl -s -X POST https://api.telegram.org/bot$token/sendMessage -d chat_id="$chat_id" -d text="$nachricht2 
$(sudo npm outdated -g)"



########################### Update prüfen Firmware ###########################

/usr/bin/curl -s -X POST https://api.telegram.org/bot$token/sendMessage -d chat_id="$chat_id" -d text="$nachricht3 
$(sudo JUST_CHECK=1 rpi-update)"


Eine Frage habe ich noch, ist es möglich die normalen Paket Updates/ Aktualisierungen auch abzufragen ohne das diese direkt durchgeführt werden also nur angezeigt werden? Würde das gerne auch noch mit einbauen.

sudo apt-get update
sudo apt-get upgrade

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 28.03.2018 10:15:58

So sieht es in Live in Telegram nach dem ausführen aus:
https://picload.org/view/daiirgrw/ohnetitel.jpg.html

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von NAB » 28.03.2018 15:27:12

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.03.2018 09:10:26
Eine Frage habe ich noch, ist es möglich die normalen Paket Updates/ Aktualisierungen auch abzufragen ohne das diese direkt durchgeführt werden also nur angezeigt werden? Würde das gerne auch noch mit einbauen.

sudo apt-get update
sudo apt-get upgrade
Du verwendest noch apt-get. Seit Stretch wird eigentlich empfohlen, "apt" zu verwenden ... bei deinem Raspberry Pi Debian auch?

apt funktioniert eigentlich genau so:
apt update
apt upgrade

Die letzte Zeile von apt update sagt bei mir gerade:
4 packages can be upgraded. Run 'apt list --upgradable' to see them.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Problem beim Skript ausführen mit ExecStartPost

Beitrag von Nastra » 28.03.2018 16:17:21

Ohhh man, das dass get wegfällt war mir noch nicht bekannt. Wieder was gelernt.
Normalerweise führt bei mir das Tool/ Skript von einem aus dem HK Forum die Updates durch daher habe ich da nie genauer hingesehen wie der Ablauf ist. Hatte es heute morgen getestet manuell, aber da waren keine Updates vorhanden daher habe ich denn Hinweis mit dem apt list --upgradable nicht angezeigt bekommen. Aber genau das ist was ich noch brauchte.

@NAB :hail: DANKE !

Antworten