#1 20.11.2018 22:38:45

Pacman
Gast

Scrot weigert sich auf einen externen Datenträger zu speichern

Hallo zusammen,

ich habe folgendes kleines Problem:
Das Kommandozeilenprogramm Scrot verhält sich bei mir ganz normal, sofern es manuell aufgerufen wird.
Sobald ich es aber in ein Shell-Script einbinde läuft muss differenziert werden:
Das Skript soll einen Pfad vom Nutzer einlesen und diese Variable mit einer vordefinierten Variable für den Namen des Bildes zusammensetzen.
Dieser Ausgabepfad wird dann wiederum als Variable dem Skriptinternen Aufruf von Scrot hinzugefügt.
So weit alles gut.
Liegt der Pfad auf der fest verbauten Festplatte wird das Bild wie gewünscht gespeichert.
Liegt der Pfad auf einem gemounteten externen Medium erhält man folgende Fehlermeldung:

giblib error: Saving to file .... failed

An den Berechtigungen kann es nicht liegen. Sie sind für beide Verzeichnisse ganz gleich gesetzt.
Auch das Dateisystem spielt keinerlei Rolle.
Getestet habe ich mit ext4 und vfat.
Was läuft falsch?
Übersehe ich etwas?
Vielleicht kann mir hier jemand einen Tipp geben.

Gruß
Pacman

#2 20.11.2018 22:49:07

niemand
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Ohne das Script zu kennen, wird man vermutlich kaum sagen können, was da falsch sein mag.

Offline

#3 21.11.2018 01:53:36

TBone
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Wie wird es denn ausgeführt? Wie wurde das externe Medium gemountet? (Ich kann zB etwas mit FUSE mounten. Der Mountende Nutzer hat Zugriff, root nicht.)
Um das Problem einzugrenzen (ob es an scrot liegt), funktioniert das, in diesem Skript?

echo 2 > /ext/mntpnt/datei

Offline

#4 21.11.2018 10:08:45

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Hi,

hier ist erst mal ein Minimalbeispiel.
Das Verhalten ist auch bei diesem genau das selbe.

#! /bin/bash

pfad=NULL
datum=$(date +%d-%m-%Y+%H:%M:%S)
echo "Geben Sie bitte den Pfadnamen an:"
read pfad

file="${pfad}/${datum}.png"
echo $file > $pfad/x.txt

scrot -d 3 -c -s $file

exit

Das Medium hat ein vfat Dateisystem und ist per Befehl gemountet:

mount -t vfat -o rw,umask=077,uid=xyz,gid=xyz,utf8,shortname=mixed,codepage=850,errors=continue ...........

Der Befeh lmit der Umleitung funktioniert problemlos.
Ich hab die Umsetzung auch mal ins Beispiel mit reingeschrieben.

Gruß
Pacman

#5 21.11.2018 11:17:57

schard
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Gib bitte mal folgendes an:
* rekursiv alle Datei- / Ordnerberechtigungen (ls -l) zum Zielordner auf dem externen Medium.
* den Namen des Benutzers in dessen Kontext das Skript aufgerufen wird.
* Die Ausgabe von mount bzgl. des entsprechenden Mountpoints.

Offline

#6 21.11.2018 11:38:12

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Das ist es ja:
Der USB-Stick ist in Mount eingehängt und dieses Verzeichnis ist auch als Zielverzeichnis angegeben.
Beim einbinden von vfat haben soweit ich weiß alle Verzeichnisse die selben Berechtigungen weil bei diesem Dateisystem eine differenzierte Rechtevergabe unter Linux nicht möglich ist.
Die Berechtigungen von mount sind folgende: drwx------
Das Skript wird vom selben Nutzer aufgerufen, dem auch das Verzeichnis gehört. Hier kann der Fehler leider nicht liegen. Ich habe auch schon daran gedacht. :-)
Der Befehl mount gibt bei mir speziell für den Datenträger folgendes aus:

/dev/sdb2 on /mnt type vfat (rw,relatime,,uid=1000,gid=1000,fmask=077,dmask=077,codepage=850,iocharset=ascii,shortname=mixed,utf8,errors=continue)

#7 21.11.2018 12:39:00

schard
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Pacman schrieb:

Die Berechtigungen von mount sind folgende: drwx------

Und da ist das Problem. Ergo darf nur der Besitzer (root) nach /mnt wechseln und in etwaige Unterordner schreiben.
Bei mir sieht das so aus:

$ ls -ld /mnt/
drwxr-xr-x 3 root root 4096 31. Jul 2017  /mnt/

Beitrag geändert von schard (21.11.2018 12:39:19)

Offline

#8 21.11.2018 12:49:00

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Leider nein.
/mnt gehört, wie ich schon geschrieben habe, mir.
Außerdem passiert der Fehler auch wenn ich das Skript als Root ausführe.

#9 21.11.2018 13:14:49

schard
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Wie sieht denn der gesamte Dateipfad in einem konkreten Fehlerfall aus?
Wenn dieser Leerzeichen enthalten sollte, könnte ein

scrot -d 3 -c -s "$file"

statt

scrot -d 3 -c -s $file

helfen.

Beitrag geändert von schard (21.11.2018 13:16:30)

Offline

#10 21.11.2018 13:22:11

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Ich hab's gerade versucht.
Das funktioniert auch nicht.
Also der Fehler hält sich wirklich hartnäckig.
Kann es sein das verschiedene Zeichensätze benutzt werden.
Also ascii vs. utf8 oder ähnlich.
Auf dem Gebiet kenne ich mich nicht ganz so gut aus.

#11 21.11.2018 13:28:09

schard
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Du bist sehr zurückhaltend mit konkreten Informationen zu deinem System, was die Hilfe enorm erschwert.

Offline

#12 21.11.2018 13:32:11

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Naja, was brauchst du denn?
Bis jetzt war ich eigentlich der Meinung, ich konnte recht zügig liefern was du brauchst.

#13 21.11.2018 13:35:44

schard
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Ein Beispieldateiname wäre noch toll.
PS: Bei mir geht das übrigens auch nicht:

$ mount | grep /mnt
/dev/sdd1 on /mnt type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
$ ls -ld /mnt/
drwxr-xr-x 2 root root 4096 21. Nov 12:39 /mnt/
$ ls -Rl /mnt/
/mnt/:
insgesamt 0
$ datum=$(date +%d-%m-%Y+%H:%M:%S)
$ pfad=/mnt
$ file="${pfad}/${datum}.png"
$ scrot -d 3 -c -s $file
Taking shot in 3.. 2.. 1.. 0.
giblib error: Saving to file /mnt/21-11-2018+12:40:29.png failed

$ sudo chown schard /mnt/
chown: der Eigentümer von '/mnt/' wird geändert: Die Operation ist nicht erlaubt
$ sudo chown schard /mnt/.
chown: der Eigentümer von '/mnt/.' wird geändert: Die Operation ist nicht erlaubt
$ sudo umount /mnt 
$ sudo mount /dev/sdd1 /mnt -o rw,umask=077,uid=schard,gid=schard,utf8,shortname=mixed,codepage=850,errors=continue
$ scrot -d 3 -c -s $file
Taking shot in 3.. 2.. 1.. 0.
giblib error: Saving to file /mnt/21-11-2018+12:40:29.png failed

$ touch $file
touch: Setzen der Zeiten für '/mnt/21-11-2018+12:40:29.png': Datei oder Verzeichnis nicht gefunden
$ echo foo > $file
bash: /mnt/21-11-2018+12:40:29.png: Das Argument ist ungültig
$ echo foo > "$file"
bash: /mnt/21-11-2018+12:40:29.png: Das Argument ist ungültig
$ ls -ld /mnt
drwx------ 2 schard schard 4096  1. Jan 1970  /mnt
$ ls -Rl /mnt
/mnt:
insgesamt 0

PPS: Scrot mag keine Doppelpunkte im Dateinamen:

/dev/sdd1 on /run/media/schard/WINDATA type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
$ echo foo > $file^C
130 ✗ schard@ThinkCentre ~ $ pfad=/run/media/schard/WINDATA
$ file="${pfad}/${datum}.png"
$ scrot -d 3 -c -s $file
Taking shot in 3.. 2.. 1.. 0.
giblib error: Saving to file /run/media/schard/WINDATA/21-11-2018+12:40:29.png failed

$ cd /run/media/schard/WINDATA/
$ echo foo> bar
$ ls
bar
$ ls -l
insgesamt 4
-rw-r--r-- 1 schard schard 4 21. Nov 12:50 bar
$ cat bar
foo
$ scrot -d 3 -c -s "test.png"
Taking shot in 3.. 2.. 1.. 0.
$ pfad=.
$ file="${pfad}/${datum}.png"
$ scrot -d 3 -c -s $file
Taking shot in 3.. 2.. 1.. 0.
giblib error: Saving to file ./21-11-2018+12:40:29.png failed

$ scrot -d 3 -c -s ./test.png
Taking shot in 3.. 2.. 1.. 0.
$ scrot -d 3 -c -s ./test:bar.png
Taking shot in 3.. 2.. 1.. 0.
giblib error: Saving to file ./test:bar.png failed

Am einfachsten wäre es wohl, scrot in eine temporäre Datei schreiben zu lassen und diese dann zu verschieben.

TMPF="$(mktemp --suffix=.png)"
scrot -d 3 -c -s "${TMPF}"
mv "${TMPF}" "${file}"

Korrektur:
Nicht Scrot mag den Doppelpunkt nicht, sondern FAT. wink

$ echo foo > bar
$ echo foo > bar:f
bash: bar:f: Das Argument ist ungültig
$ ls
bar  test.png

Danke @TBone.

Beitrag geändert von schard (21.11.2018 14:04:37)

Offline

#14 21.11.2018 14:01:56

TBone
Mitglied

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

schard schrieb:

PPS: Scrot mag keine Doppelpunkte im Dateinamen:

Scrot hat damit kein Problem, aber vfat.

Offline

#15 21.11.2018 14:07:31

Pacman
Gast

Re: Scrot weigert sich auf einen externen Datenträger zu speichern

Ich hab es gerade ausprobiert.
Ich glaube das war's.
Ein großes Dankeschön an alle die mir geholfen haben.

Gruß
Pacman

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums