Ich hab mir auf meiner Synology eine NFS Freigabe eingerichtet (/mnt/syno/fhembackup); vom RasPi auch erreichbar, und im Zugriff (auch mit meinem FTP Client).
Nur von FHEM komm ich nicht auf das gemountete Verzeichnis,
- weder mit "attr global archivedir /mnt/syno/fhembackup"
- noch mit dem Script von Martin Koch
https://hausautomatisierung-koch.de/2017/02/19/naechtliche-sicherung-fhem-nas/
SYS_Backup:* {
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
next if($file eq "." || $file eq "..");
push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
my $longfile = "./backup/".$file;
my $destination = "/mnt/syno/fhembackup/";
`sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
my $mybackupfile = "/mnt/syno/fhembackup/".$file;
push(@mybackups,$file);
$lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
$lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
$year += 1900;
$mon += 1;
$lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
$lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
$mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
$lastbackupdatedatum = "kein Backup gefunden";
$lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}
Scheitert am Befehlopendir DIR, "/mnt/syno/fhembackup" or die $!;
mit dem FehlerSYS_BackupRun return value: Permission denied at (eval 13039) line 23
Schreibrechte auf syno hab ich vergeben (777).
Die backups landen alle in /opt/fhem/backup
bin einen Schritt weiter, aufgrund der Fehlermeldung sudo: no tty present and no askpass program specified
hab ich in sudoers den Eintrag fhem ALL=(ALL) NOPASSWD: ALL
ergänzt.
Jetzt landen alle neuen backups auf dem NAS und auch die, die vorher in /opt/fhem/backup lagen finden sich auf dem NAS.
Allerdings liefert das o.a. Script SYS_Backup noch weitere Fehler, ich häng mal den ganzen LOG an:
2024.06.12 17:46:54 2: Backup with command: tar czf ./backup/FHEM-20240612_174654.tar.gz "./demolog" "./docs" "./fhem.cfg" "./CHANGED" "./unused" "./cache" "./MAINTAINER.txt" "./certs" "./README_DEMO.txt" "./restoreDir" "./fhem.pl" "./log" "./contrib" "./configDB.pm" "./conf" "./regSave.cfg" "./FHEM" "./alexa-fhem.cfg" "./www" "./lib" "./FHEM-20240610_140603.tar.gz" "./alexa-fhem.cfg.previous" "./GPL_V2.txt" "./fhem.cfg.demo"
2024.06.12 17:46:54 3: backup : Started the backup in the background, watch the log for details
Backup done
2024.06.12 17:47:43 1: ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
next if($file eq "." || $file eq "..");
push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
my $longfile = "./backup/".$file;
my $destination = "/mnt/syno/fhembackup/";
`sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
my $mybackupfile = "/mnt/syno/fhembackup/".$file;
push(@mybackups,$file);
$lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
$lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
$year += 1900;
$mon += 1;
$lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
$lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
$mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
$lastbackupdatedatum = "kein Backup gefunden";
$lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}: Permission denied at (eval 4549) line 23.
2024.06.12 17:47:43 3: SYS_BackupRun return value: Permission denied at (eval 4549) line 23.
Insb. wird das dummy mit Datum und Größe des letzten Backup nicht gefüllt (siehe Anhang).
Ich versuch auch parallel den Autor des Script zu erreichen, wär aber toll, wenn ihr mir hier helfen könntet - so kurz vor dem Ziel ;D
Danke,
Dieter
fhem ALL=(ALL) NOPASSWD: ALL
Ich weiß, das es sich immer toll anhört und (leider) von mehreren Propagiert wird, aber damit hast Du praktisch sämtliche Sicherheitsbemühungen von Linux und FHEM ausgehebelt. Wenn dann bitte auf (wenige) Programme einschränken. Zum Erstmaligen Testen mag es O.K. sein (aber nicht empfehlenswert, weil der Mensch ist fault und dann bleibt es so), aber dann bitte sofort einschränken auf das mindest notwendigste!
o.k. verstehe, was wäre denn hier das nötigste, damit das Script läuft und der Fehler "sudo: no tty present and no askpass program specified" nicht auftritt?
Gruß,
Dieter
Das move (mv) funktioniert noch, aber opendir DIR auf das gemountete NAS Directory ergibt "permission denied" ...
foreach my $file (sort @mybackups) {
my $longfile = "./backup/".$file;
my $destination = "/mnt/syno/fhembackup/";
`sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
?? Deine Ausgabe macht kein Sinn ... kannst Du uns bitte mal das komplette Script geben?
hier nochmal das komplette Script:
SYS_Backup:* {
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
next if($file eq "." || $file eq "..");
push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
my $longfile = "./backup/".$file;
my $destination = "/mnt/syno/fhembackup/";
`sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
my $mybackupfile = "/mnt/syno/fhembackup/".$file;
push(@mybackups,$file);
$lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
$lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
$year += 1900;
$mon += 1;
$lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
$lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
$mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
$lastbackupdatedatum = "kein Backup gefunden";
$lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}
Wie gesagt, ohne "fhem ALL=(ALL) NOPASSWD: ALL" kommt die Meldung "sudo: no tty present and no askpass program specified"
Mit "fhem ALL=(ALL) NOPASSWD: ALL"
- wird das Backup ausgeführt
- zuerst auf /opt/fhem/backup gespeichert
- und dann auf das gemountete NAS umkopiert: "/mnt/syno/fhembackup"
- allerdings erzeugt Zeile 23 des Scripts (opendir DIR, "/mnt/syno/fhembackup" or die $!;) dann den Fehler "permission denied"
by the way: Ganz am Anfang sieht man im Log noch den Fehler
"ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{
hier das ganze FHEM-Log:
2024.06.12 17:46:54 2: Backup with command: tar czf ./backup/FHEM-20240612_174654.tar.gz "./demolog" "./docs" "./fhem.cfg" "./CHANGED" "./unused" "./cache" "./MAINTAINER.txt" "./certs" "./README_DEMO.txt" "./restoreDir" "./fhem.pl" "./log" "./contrib" "./configDB.pm" "./conf" "./regSave.cfg" "./FHEM" "./alexa-fhem.cfg" "./www" "./lib" "./FHEM-20240610_140603.tar.gz" "./alexa-fhem.cfg.previous" "./GPL_V2.txt" "./fhem.cfg.demo"
2024.06.12 17:46:54 3: backup : Started the backup in the background, watch the log for details
Backup done
2024.06.12 17:47:43 1: ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
next if($file eq "." || $file eq "..");
push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
my $longfile = "./backup/".$file;
my $destination = "/mnt/syno/fhembackup/";
`sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
my $mybackupfile = "/mnt/syno/fhembackup/".$file;
push(@mybackups,$file);
$lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
$lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
$year += 1900;
$mon += 1;
$lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
$lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
$mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
$lastbackupdatedatum = "kein Backup gefunden";
$lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}: Permission denied at (eval 4549) line 23.
2024.06.12 17:47:43 3: SYS_BackupRun return value: Permission denied at (eval 4549) line 23.
Ist es wirklich auf Deiner NAS gelandet? Denn ohne den "OpenDir" Befehl kann er nicht mounten
Zitat von: Wernieman am 15 Juni 2024, 17:11:21Ist es wirklich auf Deiner NAS gelandet? Denn ohne den "OpenDir" Befehl kann er nicht mounten
ja, mit der Einstellung "fhem ALL=(ALL) NOPASSWD: ALL"
- wird das Backup ausgeführt
- zuerst auf /opt/fhem/backup gespeichert
- und dann auf das gemountete NAS umkopiert: "/mnt/syno/fhembackup"
- allerdings erzeugt Zeile 23 des Scripts (opendir DIR, "/mnt/syno/fhembackup" or die $!;) dann den Fehler "permission denied"
ohne die "Generalvollmacht" wird nur das backup auf /opt/fhem/backup erzeugt und nichts auf das NAS kopiert:
2024.06.16 09:42:49 3: backup : Started the backup in the background, watch the log for details
Backup done
Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:
#1) Respektieren Sie die Privatsphäre anderer.
#2) Denken Sie nach, bevor Sie tippen.
#3) Mit großer Macht kommt große Verantwortung.
sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
Moin,
ich finde da gibt es zwei Ansätze:
Für sudo nur die Rechte erteilen die benötigt werden. Ich hatte mir das hier (https://heinz-otto.blogspot.com/2017/08/raspberry-ausschalten-mit-fhem.html) mal notiert.
ZitatInhalt der sudoers Datei
Die durch Komma getrennten Werte in der Datei haben folgende Bedeutung und benötigen immer den vollen Pfad!
/usr/sbin -> für alles im Verzeichnis
/usr/sbin/service * -> für alle Parameter
/usr/sbin/service apache2 * -> für alle weiteren Parameter
/usr/sbin/service apache2 reload -> genau nur hierfür
Der Aufruf in FHEM muss dann genau dem Schema entsprechen:
"sudo /usr/sbin/service apache2 reload"
Was ich für besser halte: den mount so machen, dass der user fhem die richtigen Rechte hat. Für nfs habe ich das nicht parat, aber für cifs habe ich das schon gemacht. Link (https://heinz-otto.blogspot.com/2018/02/windows-server-freigabe-auf-dem.html)
Das Prinzip sollte bei nfs ähnlich funktionieren: Den mount so vorbereiten, dass jeder user mounten darf und dann den mount erst im Script ausführen, abschließend umount.
Gruß Otto