Nach Firmware update Problem mit find Befehl in einem sh script

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

_Henning_

Benutzer
Registriert
17. Feb. 2013
Beiträge
5
Reaktionspunkte
0
Punkte
0
Hallo,

ich benutze ein sh script um Dateien in einem Verzeichniss zu finden. Der Befehl den ich dafür nutze ist find.
Nach dem update der Firmware auf 4.2-3211 erhalte ich jedoch bei Verwendung des Befehls ein "Permission Denied".
Das Script lief vorher ohne Probleme. Eine Analyse von Rechten erbrachte bisher kein Erfolg.
Der relevante Ausschnitt aus dem Script lautet wie folgt:

Rich (BBCode):
#!/bin/sh
FILES=find "/volume1/Log/" -xdev -type f -name "*2013-07*.DB" -print

Der Aufruf des Scripts erfolgt durch:
sh /volume1/Backup/Device_Settings/Synology/Scripts/Analyse_LINK

Ergebniss der Aufrufs:
Rich (BBCode):
DiskStation> sh /volume1/Backup/Device_Settings/Synology/Scripts/Analyse_LINK
/volume1/Backup/Device_Settings/Synology/Scripts/Analyse_LINK: line 24: /volume1/Log/: Permission denied
DiskStation>

Ein manuelles Aufrufen des find Befehls auf der Shell liefert das gewünschte Ergebniss - es werden alle Dateien mit der Endung".DB" gefunden wo ein Teil des Dateinamens aus "2013-07" besteht:
Rich (BBCode):
DiskStation> find "/volume1/Log/" -xdev -type f -name "*2013-07*.DB" -print
/volume1/Log/2013-06-27_2013-07-27.DB
/volume1/Log/2013-07-27_2013-08-26.DB
DiskStation>
 
Der find Befehl sollte in Backticks oder $() eingeschlossen werden
Rich (BBCode):
FILES=$(find "/volume1/Log/" -xdev -type f -name "*2013-07*.DB" -print)
 
Hi Tommi,

danke für die Hilfe! Jetzt funktioniert es wieder!
Kannst du mir den Hintergrund erklären?

Gruß
Henning
 
Nun, ich kann mir nicht vorstellen, dass dieses Script genauso wie geschrieben vor dem Update schon einmal funktioniert hat. Du möchtest die Ausgabe eines Betriebssystembefehls(find) in eine Variable haben. Dazu muss man den Befehl auch incl. allen Parametern ausführen, um die Ausgabe zu bekommen. Genau das machen die Backticks bzw. das $(). In der Ursprungsversion wird nur der Text "find" der Variable FILES zugewiesen und dann versucht, den Parameter /volume1/Logs auszuführen, weil der als nächstes nach dem Leerzeichen steht, aber nicht mehr zur Variablenzuweisung gehört. Das geht natürlich nicht, denn ein Directory kann man nicht ausführen.
 
Das geht natürlich nicht, denn ein Directory kann man nicht ausführen.
wenn man es genau nimmt dann eigentlich schon ;-) Nimm deinem User mal die Ausführrechte von einem Verzeichnis weg und versuch nachher den Inhalt des Verzeichnisses aufzulisten ;-)
 
Warum der Wechsel in ein Verzeichnis "Execute" benötigt, ist wohl eines der am besten gehüteten Unix-Mysterien. Wahrscheinlich war schlicht kein Bit mehr frei.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat