wbR80
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Hallo zusammen, ich habe ein Backup-Script gebaut, dass mithilfe einer Systemd-Unit gestartet wird.
Als akustische Kontrolle, ob das Script durchgelaufen ist, habe ich 'beep'-Kommandos eingebaut. Diese 'beep'-Kommandos funktionieren, wenn ich das Script als User von Hand ausführe, wenn das Script aber über die Systemd-Unit gestartet wird, wird 'beep' von root ausgeführt und verweigert daher den Dienst. Ich habe leider nur den PC-Speaker zur Verfügung, 'play' und 'paplay' scheiden somit aus. Gibt es noch einen Trick, wie ich es schaffe, dass am Ende meines Scripts ein akustisches Signal über den PC-Speaker ausgegeben wird?
Das kann doch nicht so schwer sein, ich raff' es einfach nicht... P.S.: Gerne darf auch eine andere Lösung her, ich will lediglich die Möglichkeit haben, Pieptöne aus dem Speaker zu erzeugen, idealerweise unterschiedliche Töne, um Erfolg und Misserfolg zu unterscheiden. Besten Dank im Voraus,
Gruß Chris
|
ChickenLipsRfun2eat
Supporter
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12070
|
Hallo! wbR80 schrieb: …wird 'beep' von root ausgeführt und verweigert daher den Dienst.
Beep funktioniert als root, aber nur als Nutzer, wenn die entsprechende Berechtigung gesetzt wurde, bspw. per UDEV. Falls du das wirklich so rum meinst: Beep funktioniert nicht mit sudo oder gesetzter setuid, es braucht Hardwarezugriff. Ein weiterer Unterschied könnten Umgebungsvariablen sein, wie $PATH. Du könntest journalctl nach Fehlern durchsuchen oder manuell ausprobieren, ob beep als root funktioniert.
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Was ich meine ist folgendes, ich habe ein Script, welches von einem Systemd-Service ausgeführt wird.
Wenn ich in dem Script einen 'beep' benutze, erhalte ich folgende Fehlermeldung: beep: Error: Running as root under sudo, which is not supported for security reasons.
beep: Error: Set up permissions for the pcspkr evdev device file and run as non-root user instead. Beep wird innerhalb des Scripts nicht per sudo aufgerufen, sondern folgendermaßen:
beep -f 1000 -l 100 -D 100 -r 2 Gruß, Chris
|
ChickenLipsRfun2eat
Supporter
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12070
|
Die Meldung ist doch eindeutig. beep: Error: Running as root under sudo. Das wird nicht unterstützt und eine Erklärung was du tun musst, um beep als Nutzer laufen zu lassen steht dabei. Mehr Informationen kann man dir nur geben, wenn du Unit und Script angibst.
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Das mache ich gerne später oder Morgen, bin jetzt nicht mehr im Büro. Ich habe selbstverständlich selbst schon ein bisschen mit meinem begrenzten Wissen rumprobiert. Ich habe versucht den Aufruf von beep im script so zu gestalten, dass das Kommando als User ausgeführt wird: sudo -u USER beep...
su USER -c beep... Das scheiterte dann daran, dass ich das PW des USER nicht eingeben kann während das Script läuft, was ich auch nicht will, das Script soll unattended laufen können. Scheint also nicht der richtige Weg zu sein? Ich bin gerade dabei mich in Linux einzuarbeiten, daher bitte ich um Verzeihung für meine blöden Fragen hier. Mir fehlt noch viel Grundwissen. Gruß, Chris
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7529
|
beep streikt da (leider?) von sich aus und scheint da einen Erziehungsauftrag zu haben: https://github.com/spkr-beep/beep/blob/master/PERMISSIONS.md#general-rules-for-permissions-setup Kannst du nicht viel machen wenn dich die Software sabotiert. Der Fall daß du legitim beep-en willst in einem Script das sowieso komplett per sudo läuft, ist da nicht abgedeckt / wird gar nicht abgefragt. Auch die Permissions des Speaker-Devices werden nicht abgefragt, da hilft die udev-Regel usw. dann leider auch nicht, wenn das bei dir per sudo laufen muss.
Geprüft wird hier jedoch stumpf nach Umgebungsvariablen: https://github.com/spkr-beep/beep/blob/master/beep-main.c#L447-L492 D.h. beep streikt auch wenn ich die selber setze: # beep
*pieps*
# SUDO_COMMAND=waslos beep
beep: Error: Running as root under sudo, which is not supported for security reasons.
beep: Error: Set up permissions for the pcspkr evdev device file and run as non-root user instead. Dementsprechend könnte beep innerhalb sudo funktionieren, wenn du in deinem Script diese Variablen vorher wegpustest. unset SUDO_COMMAND SUDO_USER SUDO_UID SUDO_GID Alternativ auf sudo verzichten... oder was anderes zum Piepsen nehmen.
Edit: Hmmm, wenn du Pech hast sind andere schon auf die Idee gekommen und unset geht für diese Variablen nicht. Scheint hier aber erstmal zu tun. #!/bin/bash
set -x
beep
unset SUDO_COMMAND SUDO_USER SUDO_UID SUDO_GID
beep # sudo ./beep.sh
+ beep
beep: Error: Running as root under sudo, which is not supported for security reasons.
beep: Error: Set up permissions for the pcspkr evdev device file and run as non-root user instead.
+ unset SUDO_COMMAND SUDO_USER SUDO_UID SUDO_GID
+ beep
*pieps*
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Danke für die Mühe, ich werd's mal ausprobieren. Ich muss das script nicht unbedingt als root laufen lassen, es läuft ohne sudo Rechte einwandfrei. Mein Problem ist wohl, dass ich es nicht schaffe, das Script unter dem User auszuführen, mit dem ich mich an der Shell einlogge. Das ganze Konstrukt ist daraus erwachsen, dass ich mehrere USB Sticks habe und auf jeden Stick unterschiedliche smb Freigaben sichern will, sobald der Stick angesteckt wird. Folgendermaßen sieht das aus (Code wird nachgeliefert): Eine udev Regel erkennt den Stick an seiner Seriennummer und weist einen definierten symlink zu. Die systemd unit startet ein Script, welches darauf wartet, dass der definierte symlink auftaucht und daraufhin das Backup script startet. Und in diesem Backup script funktionieren die beeps halt nicht.
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Noch ne Frage, werden die Variablen durch unset nur innerhalb der Umgebung in der mein Script läuft 'weggepustet'? Sprich macht es Sinn die vorher zu sichern und hinterher wiederherzustellen?
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6234
|
Also ich habe schon seit Jahren keine PCs mehr gesehen, die noch einen PC-Speaker haben. Das war dann der Grund, mich zumindest ansatzweise mit Alsa zu beschäftigen- Mein headless-Server sollte damals Fehlermeldungen per Morsezeichen absondern. Ist jetzt nur eine schnelle Idee, aber könnte man nicht per "su" oder "sudo" das Script unter der Flagge des normalen Users laufen lassen? su und sudo sind ja nicht nur dazu da root zu werden.
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28316
|
Hallo,
Mein Problem ist wohl, dass ich es nicht schaffe, das Script unter dem User auszuführen, mit dem ich mich an der Shell einlogge.
Das lässt sich doch ganz einfach über eine User Unit lösen. User Units werden es abgearbeitet, wenn ein / der User sich einloggt. Wenn das Skript beim Systemstart laufen soll: Service Units kennen die User= Direktive. Gruß, noisefloor
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7529
|
Dakuan schrieb: Also ich habe schon seit Jahren keine PCs mehr gesehen, die noch einen PC-Speaker haben.
Ja, wer den nicht um ein paar Cent nachrüstet, der hat einfach keinen mehr. Früher war das bei jedem Gehäuse Standard, heute ist das weiters gar nicht mehr dabei.
Das war dann der Grund, mich zumindest ansatzweise mit Alsa zu beschäftigen
Abseits des Desktops haben die Kisten entweder keine Soundkarte oder keine Lautsprecher dran angeschlossen ☺ Ich brauch den Speaker für ganz banale Sachen. Mein Monitor ist 10 Jahre alt und nicht der schnellste beim Signal finden / umschalten. Da ist Grub oft schneller als der Monitor. Also lasse ich Grub kurz aufpiepsen damit ich die Enter-Taste oder blind einen anderen Menüpunkt auswählen kann. Daß beep mit sudo den Dienst verweigert, wusste ich trotzdem bis heute nicht. Liegt einfach daran daß ich kein sudo verwende... wenn man die Abfrage dann tatsächlich mit einem einfachen unset umgehen kann, dann ist das ganze wahrscheinlich auch ziemlich nutzlos.
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
noisefloor schrieb: Hallo,
Mein Problem ist wohl, dass ich es nicht schaffe, das Script unter dem User auszuführen, mit dem ich mich an der Shell einlogge.
Das lässt sich doch ganz einfach über eine User Unit lösen. User Units werden es abgearbeitet, wenn ein / der User sich einloggt. Wenn das Skript beim Systemstart laufen soll: Service Units kennen die User= Direktive.
Ich hab mich wohl falsch ausgedrückt, ich will nicht, dass das Script läuft wenn sich ein User einloggt.
Es soll unabhängig davon, ob wer angemeldet ist oder nicht laufen. Was ich meinte war: Ich kann es ja mit dem User, mit dem ich mich an der Shell einlogge, starten und dann kommen die beeps wie gewollt.
Wenn ich es nun schaffe, das mein backupscript unter diesem User von der Unit gestartet wird, sollte alles klappen.
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28316
|
Hallo,
Es soll unabhängig davon, ob wer angemeldet ist oder nicht laufen.
Wenn ich es nun schaffe, das mein backupscript unter diesem User von der Unit gestartet wird, sollte alles klappen.
Dann halt als systemweite Unit und in der Unit die User= Direktive setzen. Gruß, noisefloor
|
wbR80
(Themenstarter)
Anmeldungsdatum: 18. Januar 2023
Beiträge: 14
|
Hallo zusammen, ich bin die letzten 2 Wochen leider nicht dazu gekommen hier weiter zu machen, CVE-2023-23397 sei Dank... Jetzt bin ich wieder dran und habe den Vorschlag, die User= Direktive in der Unit zu nutzen umgesetzt.
Was soll ich sagen, das Script kopiert nach wie vor alles, was es soll, aber die beeps kommen nicht.
Zwar erhalte ich die Fehlermeldungen, dass beep nicht als root oder sudo gestartet werden darf, nicht mehr - dafür aber halt auch keine beeps... Ich will einfach nicht akzeptieren, dass das komplette Konstrukt macht was es soll, nur die blöden beeps nicht funktionieren.
Ohne diese beeps wird es halt schwer abzuschätzen, wann das Backup abgeschlossen ist und der Stick wieder abgezogen werden darf.
Wenn sich nochmal jemand mein Konstrukt anschauen könnte wäre ich super dankbar, evtl fällt euch ja auf, was mir durch die Lappen geht. Udev:
| KERNEL=="sd*", ATTRS{serial}=="1234", ACTION=="add", SYMLINK+="usbbackup"
|
Systemd Unit:
1
2
3
4
5
6
7
8
9
10
11
12 | [Unit]
Description=USB monitor
After=network.target
[Service]
User=scriptuser
Type=simple
ExecStart=/bin/bash /usr/local/bin/monitor-usb.sh
Restart=always
[Install]
WantedBy=multi-user.target
|
monitor-usb.sh: (-rwxr-xr-x 1 scriptuser sicherung)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/bash
# Pfad zum zu überwachenden USB-Gerät
usb_device="/dev/usbbackup"
while true; do
if [ -b "$usb_device" ]; then
# USB-Gerät gefunden, starte das gewünschte Skript
/usr/local/bin/start-backup.sh
# Warte, bis das USB-Gerät entfernt wird
while [ -b "$usb_device" ]; do
sleep 1
done
else
# USB-Gerät nicht angeschlossen, 5 Sek. warten und neu versuchen
sleep 5
fi
done
|
start-backup.sh: (-rwxrwxrwx 1 scriptuser sicherung)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 | #!/bin/bash
# Ausgaben umleiten nach /var/log/usbbackup
exec &> /var/log/usbbackup
echo "### $(date '+%Y-%m-%d %H:%M:%S') - USB-Stick 1 wurde angeschlossen." >> /var/log/usbbackup
# Variablen definieren
USER='xxx'
PASS='xxx'
DOMAIN='ad.xxx.de'
SERVER='xxx'
FOLDERS=(SHARE1/Folder1 SHARE1/Folder2 SHARE2/Folder1)
SOURCE='/mnt/backup_source'
DEST='/mnt/usbbackup'
LOGFILE='/var/log/usbbackup'
# Mounten des USB-Sticks
echo "### USB Stick mounten..." >> /var/log/usbbackup
sudo umount -f /mnt/usbbackup >> /var/log/usbbackup
sleep 2
sudo mount /dev/usbbackup /mnt/usbbackup -o rw,umask=0000 >> /var/log/usbbackup
if [ $? -eq 0 ]
then
echo "### ...Mountvorgang USB Stick abgeschlossen" >> /var/log/usbbackup
beep -f 1000 -l 100 -D 100 -r 2
else
echo "### ...Mountvorgang USB Stick fehlgeschlagen" >> /var/log/usbbackup
fi
echo "### Start Backup" >> /var/log/usbbackup
# Schleife
for FOLDER in "${FOLDERS[@]}"
do
# Mount SMB
sudo mount -t cifs //$SERVER.$DOMAIN/$FOLDER $SOURCE -o username=$USER,password=$PASS
sleep 2
#Start Kopie
sudo rsync -av --delete $SOURCE/ $DEST/$FOLDER >> /var/log/usbbackup
if [ $? -eq 0 ]
then
echo "### $FOLDER erfolgreich gesichert ########################" >> /var/log/usbbackup
/usr/local/bin/beep_up.sh
else
echo "################### FEHLER BEIM KOPIEREN VON $FOLDER ########################" >> /var/log/usbbackup
/usr/local/bin/beep_down.sh
fi
#Unmount SMB
sudo umount -f $SOURCE >> /var/log/usbbackup
done
beep -f 1000 -l 100 -D 500 -r 3
#Aufräumen
sudo umount -f /mnt/usbbackup >> /var/log/usbbackup
unset USER
unset PASS
unset DOMAIN
unset SERVER
unset FOLDERS
unset SOURCE
unset DEST
unset LOGFILE
echo "### Ende Backup $(date '+%Y-%m-%d %H:%M:%S') ###########################################" >> /var/log/usbbackup
# Ende
|
Und zur Sicherheit noch die /etc/sudoers:
| # User privilege specification
ALL ALL=(ALL) NOPASSWD: /usr/bin/mount
ALL ALL=(ALL) NOPASSWD: /usr/bin/umount
ALL ALL=(ALL) NOPASSWD: /usr/bin/rsync
|
Besten Dank euch allen für die Unterstützung
Chris
|