Hallo,
ich habe folgendes Problem:
Ein Skript wird über FHEM mit sudo ausgeführt, nun soll dieses Skript auch wieder beendet werden können. Dies funktioniert nur, wenn man dem User fhem volle Root-Rechte gibt. Jemand eine Idee wie man einen Prozess killen kann, ohne volle Root-Rechte zu vergeben?
Vielleicht mit "sudo kill ..."?
Habe ich schon versucht, ohne Erfolg.
Dann rate ich einmal weiter, ohne dein System zu kennen:
In der sudoers-Datei ist für den User fhem eingetragen, dass er "sudo kill" ohne Passwort verwenden darf?
Wie trage ich das ein?
Mit visudo habe ich schon herumgespielt und mit vollen Rechten hat es funktioniert, nur wie gebe ich lediglich Rechte für den Kill-Prozess?
Ist erstmal schon nicht so gut, dass das Script per sudo gestartet wird. Muss das so sein?
Ohne Root-Rechte kann ich das Skript nicht starten, da die GPIOs angesprochen werden um einen Bewegungsmelder anzusprechen.
Dann füge den User fhem zu der Gruppe für die GPIO Gruppe.
https://wiki.ubuntuusers.de/Benutzer_und_Gruppen/
Ich liebe meine liebste Suchmaschine 8)
Nein im Ernst.
Unter Linux sollte man sich mit Rechten, Gruppen und Nutzern vertraut machen.
Es lässt sich alles auch ohne root-Rechten machen solange die Benutzerrechte stimmen.
Mit root geht es zwar einfacher aber allem jedes zu erlauben ist nicht wirklich Sinn des Nutzerkonzeptes unter Linux.
gpio:x:997:pi,fhem
ist schon in der GPIO-Gruppe drin.
@Puschel: Genau deswegen Frage ich nach, ich möchte nur die nötigen Rechte verwenden aber wie ?
Dazu müssen wir erstmal wissen was genau du machen willst und was gegeben ist.
Wenn du ein Script ausführen willst was einen Befehl aus führt der auf ein Devicefile zu greift, so muss sowohl die Gruppe für das Script als auch die Gruppe des Devicefiles eine Gruppe sein in der der User fhem drin ist.
Es kann auch sein das fhem eine Shell benötigt. Also nicht /bin/false sondern mal /bin/sh probieren.
Infrarot-Bewegungsmelder (PIR) ist an die GPIO des Raspi angeschlossen.
PIR wartet auf Bewegung
PIR erkennt Bewegung
Pi Noir Kamera macht ein Foto
Das Foto wird an eine Mail-Adresse geschickt
Ein Video wird erstellt und auf einem USB-Stick gespeichert
Bewegungsmelder wartet auf Bewegung
Das Skript das ich stoppen möchte ist ein Python-Skript für den PIR.
Und woran genau scheitert es? Am besten mit konkreter Fehlermeldung.
Wenn ich mit visudo dem User fhem Alle Rechte für den Pfad des Skripts gebe, kann ich das Skript über FHEM mit z.B. killall -USR1 skript.py
beenden.
Ich möchte dem User fhem aber keine Root-Rechte geben um das Sjript beenden zu können.
Genau, aber woran hapert es, wenn du dem fhem-User keine root-Rechte gibst?
Wenn ich dem User fhem nicht diese Root-Rechte gebe, kann ich das Skript nicht über fhem beenden oder es gibt eine andere Lösung die ich nicht kenne.
Mit welchen User Rechten läuft den das Skript
Skript an verfen und dann
ps axu
Mit dem ps axu
sieht man dass root das python ausführt.
Htop sagt auch aus dass das Skript von Root kommt.
Dann lass das Script doch vom User fhem starten.
Und wie mache ich das?
Wenn ich das Skript von einem anderen User starte (z.B. User Pi) dann stehte da RuntimeError: No access to /dev/mem. Try running as root!
Ohne das Skript zu kennen kann man hier nichts weiter sagen. Frage wäre wo zu /dev/mem als root.
Das Skript:
#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# skript.py
# Detect movement using a PIR module
#
# Author : Matt Hawkins
# Date : 21/01/2013
# Import required Python libraries
import RPi.GPIO as GPIO
import time
import subprocess
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# Define GPIO to use on Pi
GPIO_PIR = 7
print "PIR Module Test (CTRL-C to exit)"
# Set pin as input
GPIO.setup(GPIO_PIR,GPIO.IN) # Echo
Current_State = 0
Previous_State = 0
try:
print "Waiting for PIR to settle ..."
# Loop until PIR output is 0
while GPIO.input(GPIO_PIR)==1:
Current_State = 0
print " Ready"
# Loop until users quits with CTRL-C
while True :
# Read PIR state
Current_State = GPIO.input(GPIO_PIR)
if Current_State==1 and Previous_State==0:
# PIR is triggered
print " Motion detected!"
subprocess.call(['/home/user1/skript2.sh'])
# Record previous state
Previous_State=1
elif Current_State==0 and Previous_State==1:
# PIR has returned to ready state
print " Ready"
Previous_State=0
# Wait for 10 milliseconds
time.sleep(0.01)
except KeyboardInterrupt:
print " Quit"
# Reset GPIO settings
GPIO.cleanup()
Jetzt ist das Skript drin und keiner antwortet mehr?