Ordnerinhalt ohne Bashscript via ftp-Verbindung löschen möglich ?

Begonnen von TomLee, 10 Januar 2022, 14:53:23

Vorheriges Thema - Nächstes Thema

TomLee

Oder vlt. doch ?

So klappts auf jedenfall mal nicht:

Zitat#!/bin/bash

um="umount /mnt/FRITZNAS"
tblog=(perl fhem.pl 7072 "set tb_TelegramBot msg $ret";)

if mount /mnt/FRITZNAS
then
if [ $1 == "print" ]
    then
    ret=$(cp -v /mnt/FRITZNAS/fax.pdf /media/usbstick/blia/bla/Fax/fax_`date +%y%m%d_%H%M`.pdf;)
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    lpr -P HL-2035 /mnt/FRITZNAS/fax.pdf;
    ret=$(rm -v /mnt/FRITZNAS/*; )
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";

    $um;
elif [ $1 == "save" ]
    then
    ret=$(cp -v /mnt/FRITZNAS/fax.pdf /media/usbstick/bli/bla/Fax/fax_`date +%y%m%d_%H%M`.pdf;)
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    ret=$(rm -v /mnt/FRITZNAS/*; )
    perl fhem.pl 7072 "set tb_TelegramBot msg $ret";
    $um;

elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*; )
    $tblog;

"${tblog[ @ ]}"

    $um;
fi

fi

Otto123

#46
nicht probiert:
cmd=(perl fhem.pl 7072 set tb_TelegramBot msg)
...
ret=$(rm -v /mnt/FRITZNAS/*; )
cmd+=($ret)
"${cmd[@]}"

Das funktioniert
cmd=(ls -lha)
ret='/opt/fhem'
cmd+=($ret)
"${cmd[@]}"

Ob das schön ist - wird Werner sagen :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Sicher das man die Quotes weglassen kann in dem Perl-Befehl ?

Wenn ich das mache:

cmd=(perl fhem.pl 7072 set tb_TelegramBot msg)
...
elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*;)
    cmd+=($ret)
    "${cmd[@]}"
    $um;
fi


steht das im Log:
Usage: set <name> <type-dependent-options>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

Unknown command tb_TelegramBot, try help.
Usage: msg [<type>] [<@device>|<e-mail address>] [<priority>] [|<title>|] <message>
Unknown command '/mnt/FRITZNAS/Fax.pdf', try help.
Unknown command wurde, try help.
Unknown command entfernt, try help.


Wenn ich die Quotes wieder reinnehme:

cmd=(perl fhem.pl 7072 "set tb_TelegramBot msg ")
...
elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*;)
    cmd+=(.$ret)
    "${cmd[@]}"
    $um;
fi


Siehts etwas besser aus

TelegramBot_Set: Command msg, no peers and no text/file specified
Unknown command '/mnt/FRITZNAS/Fax.pdf', try help.
Unknown command wurde, try help.
Unknown command entfernt, try help.


Es macht auch keinen Unterschied ob ich ein Semikolon hinter cmd+=($ret) und "${cmd[ @ ]}" mache, nur wegen der Angabe von cmd+=($ret) und "${cmd [@ ]}" kommt es zu Unknown command '/mnt/FRITZNAS/Fax.pdf', try help.
Unknown command wurde, try help.
Unknown command entfernt, try help.


Otto123

war mir klar das es damit Probleme gibt :)
Womit der Aufruf perl fhem.pl nicht klar kommt: Die einzelenen Array Elemente (getrennt am Leerzeichen) werden als einzelne Argumente übergeben. fhem.pl will es aber als ein Argument. Da muss wohl eine andere Idee/Konstrukt her ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ein kleiner Teilerfolg, aber ob mich das der Lösung näher bringt ? Glaubt nicht.

So, mit '"'$ret'"'", wird die Nachricht zumindest gesendet, aber $ret wird nicht evaluiert.
Mit den einfachen/doppelten Quotes hab ich verschiedene Varianten durch, aber entweder wird nicht evaluiert oder es werden nur die Quotes gesendet.

cmd=(perl fhem.pl 7072 "set tb_TelegramBot msg '"'$ret'"'")

...

elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*);
    "${cmd[@]}";
    $um;
fi


Mit einer Funktion hab ichs auch schon probiert:

cmd() { perl fhem.pl 7072 "set tb_TelegramBot msg $ret" }

...

elif [ $1 == "delete" ]
    then
    ret=$(rm -v /mnt/FRITZNAS/*);
    cmd;
    $um;
fi

fi


Da steht im Log dann:
/opt/fhem/tgfax.sh: Zeile 36: Syntax Fehler: Unerwartetes Dateiende.

Wernieman

Obwohl ich jetzt 2 mal gelesen habe, habe ich das aktuelle Problem nicht verstanden.

- Bist Du jetzt auf bash oder perl-Ebene?
- Wann werden welche Variablen nicht gesetzt?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

Am Ende wird das Script in #45 aufgerufen, die letzten Posts sind nur Änderungen darin.

TomLee


Wernieman

Zitattblog="perl fhem.pl 7072 "set tb_TelegramBot msg $ret";"
Kann so nicht funktionieren
1. Die Innenliegenden " hättest Du maskieren müssen. Sonst beendet der 2. " den String, der mit dem ersten " beginnt ...
2. Bash tauscht sofort Variablen aus. Es wird also im String $ret nicht so gespeichert, sondern durch den Inhalt von $ret
Beide Probleme hättest DU lösen können, in dem Du als Außere Stringbegrenzer den ' verwendest. Dann löst bash den String nocht auf sondern speichert in komplett.

Aber noch etwas:
Da Du über die telnet-schnitstelle gehst, warum speicherst Du die Daten durch Aufruf von fhem.pl? Besser währe nc, oder wenn Du SSL-verwendest netcat. Hat weniger "Overhead" als fhem.pl
(Und wenn Du unbedingt fhem.pl verwenden willst, brauchst Du auch kein perl davor zu schreiben, das fhem.pl mit dem berühmten #!perl beginnt ...)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Otto123

Zitat von: TomLee am 22 Januar 2022, 13:54:31
So, mit '"'$ret'"'", wird die Nachricht zumindest gesendet, aber $ret wird nicht evaluiert.
das geht auch mit cmd=(perl fhem.pl 7072 "set SD3 $ret") Aber $ret wird eben zum Zeitpunkt dieses Befehls evaluiert und nicht später wenn Du es gerne willst.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Zitat von: Otto123 am 22 Januar 2022, 14:17:50
Aber $ret wird eben zum Zeitpunkt dieses Befehls evaluiert und nicht später wenn Du es gerne willst.

Da hakt doch was ?

Hier/so klappts doch $ret zu übergeben:
ret=$(rm -v /mnt/FRITZNAS/*; )
perl fhem.pl 7072 "set tb_TelegramBot msg $ret";

Otto123

#56

schau Dir doch an was im Array steht:
echo ${cmd[@]}
Aber schau Dir auch die Anzahl der Elemente an:
cmd=(perl fhem.pl 7072 "set SD3 toggle")
echo "${cmd[@]}"
echo ${#cmd[*]}
und hier
cmd=(perl fhem.pl 7072 set SD3 )
ret='toggle'
cmd+=($ret)
echo "${cmd[@]}"
echo ${#cmd[*]}

Oder schau aufs letzte Element
echo "${cmd[-1]}"Ich habe noch keine Idee wie mans anders hinbekommt.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ja , ich schaus mir jetzt nochmal ganz genau an.

Ich hätt noch was wie es noch ausführlicher geht auszugeben:
cmd=(perl fhem.pl 7072 "set SD3 toggle")
declare -p cmd

Otto123

#58
Jetzt:
cmd=(perl fhem.pl 7072)
cmd2='set SD3'
ret='toggle'
# jetzt wird $ret evaluiert und das FHEM Kommando zusammen gebaut
cmd3="$cmd2 $ret"
# jetzt wird das gesamte Kommando als Array zusammengebaut
cmd+=("$cmd3")
# nur zur Kontrolle einzel Ausgabe: gesamtes Kommando, Anzahl der Elemente und letztes Element im Array,
echo " das Kommando "${cmd[@]}" besteht aus ${#cmd[*]} Elementen. Das letzte Element: "${cmd[-1]}""
# Feuer, Feuer bäh
"${cmd[@]}"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html