Hallo,
ich möchte gerne meine Windows PCs (Win7, Svr2008R2) per Fhem herunterfahren.
Per Shell auf dem PI net rpc SHUTDOWN -C "Bergündung" -f -I 192.168.1.1 -U user%password
kein Problem (Samba muss installiert sein).
myUtils sieht so aus und funktioniert! Hier schreibe ich das PW direkt in die Utils und escape einfach die Raute.
sub
SetWinPcOff($$)
{
my $ip = $_[0];
my $benutzer = $_[1];
system("net rpc SHUTDOWN -C \"Automatischer Shutdown durch RPi bzw FHEM\" -f -I $ip -U ". $benutzer . "MeinPasswortMitauskommentierter\#");
}
Aufruf
{SetWinPcOff("IP","User")}
Ich möchte aber das Passwort mit im Aufruf übergeben. Hier scheitert es jedoch (ich denke die Raute wird hier als Auskommentierung gesehen) ob wohl ich sie auch escape:
Aufruf
{SetWinPcOff("IP","User","MeinPasswortMitauskommentierter\#")}
myUtils dementsprechend:
sub
SetWinPcOff($$$)
{
my $ip = $_[0];
my $benutzer = $_[1];
my $pw = $_[2];
stem("net rpc SHUTDOWN -C \"Automatischer Shutdown durch RPi bzw FHEM\" -f -I $ip -U ". $benutzer . "%" . $pw . "");
}
Wie kann ich ein Passwort im Webfrontend mit escapeter "#" an die myUtilsübergeben?
Gruß
Christian
EDIT: was ich schon probiert habe: # als \[hex] | # als \[oct] zu übergeben...
Hallo,
Das Zeichen # (mit allem was hintendrankommt) wird in der Funktion AnalyzeCommandChain in fhem.pl herausgefiltert. Es wird dabei nicht überprüft ob # innerhalb einer Zeichenkette steht oder als Kommentarzeichen verwendet wird.
So sollte es aber gehen:
{SetWinPcOff("IP","User","MeinPasswortMitauskommentierter".chr(35))}
Grüße,
ChrisD
Sehr gut, Danke ChrisD.
ich habe nun eingebaut dass vorher ein ping auf das Gerät gemacht wird. Antwortes es -> Shutdown, keine Antwort -> Meldung im LOG.
Nun will ich aber noch Fehler / Meldungen beim Systembefehl abfangen. Dieser meldet zb
ZitatCould not connect to server 192.168.2.88
Connection failed: NT_STATUS_HOST_UNREACHABLE
Could not connect to server 192.168.2.88
Connection failed: NT_STATUS_HOST_UNREACHABLE
wenn er sich nicht verbinden kann, oder
ZitatShutdown of remote machine succeeded
bei Erfolg.
ich habe schon versucht das Ergebnis des Befehls in einer Variable einzufangen aber ohne Erfolg. FHEM meldet immer "-1" zurück (denke für Befehl abgesetzt).
myUtils
sub
SetWinPcOff($$$)
{
my $ip = $_[0];
my $benutzer = $_[1];
my $pw = $_[2];
my $erg ;
if (`ping -c 1 -w 2 $ip` =~ m/100%/) {
Log(3,"'$ip nicht pinbar, offline?'");
} else {
$erg = system("net rpc SHUTDOWN -C \"Automatischer Shutdown durch RPi bzw FHEM\" -f -I $ip -U ". $benutzer . "%" . $pw . "");
Log(3,"'$ip' wird heruntergefahren! $erg");
}
}
Wie kann ich also den Erfolg / Miserfolg der Befehls auslesen?
Und noch eine Frage: kann in dieser SUB ein "at" definieren, dynamisch? Also z.B. so das wenn der Befehl erfolgreich ausgeführt wurde soll ca 1 Minute später ein ping auf die IP gemacht werdne um sicherzustellen das der Rechner aus ist und nicht ein Admin zb "shutdown -a" ausgeführt hat.
Hallo,
Mit 'system' kannst du die Meldungen nicht abfragen, mit 'qx' (oder Backticks) dagegen schon:
$erg = qx(net rpc SHUTDOWN -C "Automatischer Shutdown durch RPi bzw FHEM" -f -I $ip -U $benutzer%$pw);
chomp $erg ;
(ungetestet)
Du kannst ein 'at' dynamisch im Code erzeugen:
fhem("define at_XXX at +00:01:00 {PruefenObPCAus()}");
Eventuell kannst du noch vorher prüfen ob das 'at' bereits existiert und es zuerst löschen:
if (defined($defs{"at_XXX"})) {fhem "delete at_XXX"}
Grüße,
ChrisD
Leider bekomm ich den at -Befehl syntax-mäßig nicht hin: >:(
sub
SetWinPcOff($$$)
{
my $ip = $_[0];
my $benutzer = $_[1];
my $pw = $_[2];
my $erg ;
if (`ping -c 1 -w 2 $ip` =~ m/100%/)
{
Log(3,"$ip nicht pinbar, offline?");
}
else
{
$erg = qx(net rpc SHUTDOWN -C \"Automatischer Shutdown durch RPi bzw FHEM\" -f -I $ip -U $benutzer%$pw);
chomp $erg;
Log(3,"'$ip' wird heruntergefahren! $erg");
if($erg = "Shutdown of remote machine succeeded")
{
Log(3,"Lege 'at' an für Wirksamkeitsprüfung");
fhem ("define atTemp at +00:01:00 {if(`ping -c 1 -w 2 $ip` =~ m/100%/){ Log(3,\"hat geklappt\");} else {Log(3,\"Nuescht funktioniert\");}} ");
}
}
}
wenn ich ihn versuche so in fhem einfach mal anzulegen kommt immer
Zitat
Unknown command }, try help.
Unknown command }}, try help.
im log
Zitat
2014.01.11 16:54:29 3: atTemp: Unknown command {if(`ping, try help.
2014.01.11 16:56:48 3: atTemp: Unknown command {if(`ping, try help.
2014.01.11 17:07:09 3: atTemp: Unknown command {if({`ping, try help.
2014.01.11 17:08:23 3: atTemp: Unknown command {if(`ping, try help.
2014.01.11 17:09:34 3: atTemp: Unknown command {if(\`ping, try help.
dieses ping (aus WOL geklaut..)macht denke ich probleme?
Hallo,
Lass die ; mal weg:
fhem ("define atTemp at +00:01:00 {if(`ping -c 1 -w 2 $ip` =~ m/100%/){Log(3,\"hat geklappt\")} else {Log(3,\"Nuescht funktioniert\")}} ");
Grüße,
ChrisD
Das wars.... ;D Hat nun funktioniert:
Zitat2014.01.11 17:22:20 3: '192.168.2.23' wird heruntergefahren!
Shutdown of remote machine succeeded
2014.01.11 17:22:20 3: Lege 'at' an für Wirksamkeitsprüfung
2014.01.11 17:23:22 3: hat geklappt
Ich glaub ich habe noch so meine Problem zu unterscheiden "Perl-Code" <> "FHEM Code/Befehle".... Aber es wird