Fehler in Bashskript, ich verstehe es nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
exaveal
Beiträge: 3
Registriert: 02.08.2010 18:52:36

Fehler in Bashskript, ich verstehe es nicht

Beitrag von exaveal » 13.10.2010 20:01:12

Hy Leute.
Es geht um ein Skript, welches via scp alle Ordner/Dateien in einem Ordner auf einem im Netzwerk befindlichen Server auf die lokale Festplatte verschieben soll.
Da scp nur kopieren kann, wird ein Ordner/Datei erst kopiert, dann gelöscht und dann geht es mit dem Nächsten weiter.

Code: Alles auswählen

    ssh -p 7014 user@192.168.11.11 ls -1 "/home/user/done/" | while read file
    do
      scp -P 7014 -rp "user@192.168.11.11:/home/user/done/$file" /home/user/
      ssh -p 7014 user@192.168.11.11 rm -r "/home/user/done/$file"
      echo "$file successfully moved"
    done
    echo "-> all files moved"
Das ganze Skript funktioniert auch, allerdings bearbeitet die while Schleife immer nur einen Ordner/Datei. Wenn ich den ssh-loesch befehl rausnehme, läuft die while schleife weiter. Mit, kommt nach der ersten Datei direkt "-> all files moved" obwohl noch welche auf dem Server sind.

Wie kann ich das Problem umgehen und trotzdem bei der While schleife bleiben? For schleifen würden mir andere Probleme bescheren die ich jetzt aber nicht durchkauen möchte.
Wo kann da das Problem sein? Ich bin wirklich am Ende und seh vllt den Wald vor lauter Bäumen nicht mehr 8O

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von hikaru » 13.10.2010 23:14:59

Ich bin in dem Thema nicht ganz Sattelfest, aber wenn ich mich richtig erinnere öffnest du mit dem ssh-Befehl eine neue Shell die nichts von der äußeren Schleife weiß und daher auch keinen neuen Durchlauf starten kann.

Aber mal was anderes:
Warum nimmst du nicht einfach rsync anstelle des Scripts?

jongleur
Beiträge: 1
Registriert: 07.09.2010 14:35:54

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von jongleur » 14.10.2010 00:05:42

Ich bin in dem Thema nicht ganz Sattelfest, aber wenn ich mich richtig erinnere öffnest du mit dem ssh-Befehl eine neue Shell die nichts von der äußeren Schleife weiß und daher auch keinen neuen Durchlauf starten kann.

Code: Alles auswählen

ssh root@server.dom ls | while read file; do echo $file; echo hallo; done
funktioniert. Es wird nur der eine Befehl ausgeführt. Muss also an etwas anderem liegen. Wahrscheinlich am scp.

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von habakug » 14.10.2010 00:31:44

Hallo!

Es ist schon ein etwas seltsames Anliegen. Ich hoffe du mußt nicht bei >jedem< Aufruf von scp/ssh das Passwort eingeben ;-]
Hier mal zur späten Stunde eine Anregung:

Code: Alles auswählen

FILE=tmp.$$$
mkdir -p test/eingang test/ausgang
cd test
touch eingang/kudo1 eingang/kudo2 eingang/kudo3
ls -1 eingang/ >> tmp.$$$
exec 3<&0
exec 0<$FILE
while read kudos
    do
      mv eingang/$kudos ausgang/
      echo "$kudos erfolgreich bewegt"
    done
exec 0<&3
echo "-> alle Dateien bewegt und dabei gelöscht ;-)"
rm tmp.$$$
"scp -r" kopiert übrigens ganze Verzeichnisse, vielleicht nochmal die Manpage lesen.

Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

uname
Beiträge: 12422
Registriert: 03.06.2008 09:33:02

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von uname » 14.10.2010 09:10:31

Generell würde ich nicht per Automatik in Source löschen lassen, es sei denn ich hätte ein gutes Backup.

Zum Thema "rsync". So könnte es gehen. Bitte beachte die Slashes am Ende von Source und Destination. Schleifen sind unnötig und zudem gehen mit "rsync" die Benutzerrechte und Benutzerkennungen nicht verloren, sofern man als "root" arbeitet. Bei "scp" bin ich mir da nicht so sicher.

Code: Alles auswählen

rsync -e "ssh -p 7014 -l user" -av 192.168.11.11:/home/user/done/ /home/user/done/
oder besser

Code: Alles auswählen

rsync -e "ssh -p 7014" -av user@192.168.11.11:/home/user/done/ /home/user/done/
Ach ich suche noch nach einer schöneren Variante. Vielleicht kann man den Port in "rsync" einbauen und dann irgendwie wieder defaultmäßig "ssh" nutzen. Vielleicht hat jemand eine Idee. Da ich normalerweise Port 22 nutze spare ich mir diesen ganze Kram mit "-e ssh ...". Die Default Remote Shell ist wohl "rsh" und damit bei Debian "ssh". Somit ist der Parameter eigentlich vollkommen unnötig.

exaveal
Beiträge: 3
Registriert: 02.08.2010 18:52:36

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von exaveal » 14.10.2010 09:20:47

jongleur hat geschrieben:
Ich bin in dem Thema nicht ganz Sattelfest, aber wenn ich mich richtig erinnere öffnest du mit dem ssh-Befehl eine neue Shell die nichts von der äußeren Schleife weiß und daher auch keinen neuen Durchlauf starten kann.

Code: Alles auswählen

ssh root@server.dom ls | while read file; do echo $file; echo hallo; done
funktioniert. Es wird nur der eine Befehl ausgeführt. Muss also an etwas anderem liegen. Wahrscheinlich am scp.
wenn du die datei jetzt löschst nach dem echo $file, geht dann die while shcleife auch weiter? dass ist nämlich der springende Punkt nach meinen Untersuchungen.
habakug hat geschrieben:Hallo!

Es ist schon ein etwas seltsames Anliegen. Ich hoffe du mußt nicht bei >jedem< Aufruf von scp/ssh das Passwort eingeben ;-]
Hier mal zur späten Stunde eine Anregung:

Code: Alles auswählen

FILE=tmp.$$$
mkdir -p test/eingang test/ausgang
cd test
touch eingang/kudo1 eingang/kudo2 eingang/kudo3
ls -1 eingang/ >> tmp.$$$
exec 3<&0
exec 0<$FILE
while read kudos
    do
      mv eingang/$kudos ausgang/
      echo "$kudos erfolgreich bewegt"
    done
exec 0<&3
echo "-> alle Dateien bewegt und dabei gelöscht ;-)"
rm tmp.$$$
"scp -r" kopiert übrigens ganze Verzeichnisse, vielleicht nochmal die Manpage lesen.

Gruß, habakug
die authentifizierung erfolgt über keys, keine sorge ;) und das "scp -r" verwendet liegt nur daran, dass neben den dateien auch die kompletten verzeichnisse mitkopiert werden.
dein skript ist mir auf ersten anblick nicht ganz schlüssig, aber ich schaus mir nach der arbeit mal genauer an.

uname hat geschrieben:Generell würde ich nicht per Automatik in Source löschen lassen, es sei denn ich hätte ein gutes Backup.

Zum Thema "rsync". So könnte es gehen. Bitte beachte die Slashes am Ende von Source und Destination. Schleifen sind unnötig und zudem gehen mit "rsync" die Benutzerrechte und Benutzerkennungen nicht verloren, sofern man als "root" arbeitet. Bei "scp" bin ich mir da nicht so sicher.

Code: Alles auswählen

rsync -e "ssh -p 7014 -l user" -av 192.168.11.11:/home/user/done/ /home/user/done/
oder besser

Code: Alles auswählen

rsync -e "ssh -p 7014" -av user@192.168.11.11:/home/user/done/ /home/user/done/

Ach ich suche noch nach einer schöneren Variante. Vielleicht kann man den Port in "rsync" einbauen und dann irgendwie wieder defaultmäßig "ssh" nutzen. Vielleicht hat jemand eine Idee. Da ich normalerweise Port 22 nutze spare ich mir diesen ganze Kram mit "-e ssh ...".
ich habe ein gutes Backup. Rsync wäre die letzte Option. Einfach aus dem Grund, dass ich gerne mein eigenes Script verwenden will. Aber mal abgesehen von diesem 'billigen' shell skript, ich wills einfach wissen warums nicht geht. ich verstehs einfach nicht, und meiner meinung sollte es da ja nicht all zu viel zu verstehen geben :?

uname
Beiträge: 12422
Registriert: 03.06.2008 09:33:02

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von uname » 14.10.2010 09:47:44

ich habe ein gutes Backup. Rsync wäre die letzte Option.
Schade, eigentlich ist "rsync" die erste Option.
Einfach aus dem Grund, dass ich gerne mein eigenes Script verwenden will.
Sehr löblich, da man damit viel lernt. Folgendes Script hatte ich mal geschrieben: http://wiki.ubuntuusers.de/skripte/Backup_mit_RSYNC
Aber mal abgesehen von diesem 'billigen' shell skript, ich wills einfach wissen warums nicht geht. ich verstehs einfach nicht, und meiner meinung sollte es da ja nicht all zu viel zu verstehen geben
Also gut. Du möchtest einen Ordner rekursiv kopieren. Dieser Ordner hat auf der ersten Ebene Ordner und Dateien. Wenn man normalerweise einen Ordner kopieren will, dann kopiert man gleich den ganzen Ordner am Stück, ohne Schleife.
Du hast einen Ordner mit Unter-/Unter-Ordner und Dateien irgendwo und versuchst den Ordner in der Form zu kopieren, indem du den Inhalt der ersten Ebene innerhalb einer Schleife kopieren willst. Das ist nicht zielführend. Wahrscheinlich haut dir der erste rekursive Löschbefehl mit dem ersten Argument den Boden unter den Füssen weg. Poste mal Fehlermeldungen und normale Ausgaben, dann sollte es klar werden.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Fehler in Bashskript, ich verstehe es nicht

Beitrag von gms » 25.10.2010 13:27:04

versuch mal die "-n" Option beim inneren ssh -Kommando. Das verhindert, daß das innere ssh-Kommando von /dev/stdin liest und dadurch die while-Schleife keine neuen Werte bekommt

edit: Beispiel hinzugefügt:

Code: Alles auswählen

gms@gms ~ $ mkdir test
gms@gms ~ $ touch test/f1
gms@gms ~ $ touch test/f2
gms@gms ~ $ ls -1 test | while read file; do ssh localhost ls -l /home/gms/test/$file; done
-rw-r--r-- 1 gms gms 0 Oct 25 13:28 /home/gms/test/f1
gms@gms ~ $ ls -1 test | while read file; do ssh -n localhost ls -l /home/gms/test/$file; done
-rw-r--r-- 1 gms gms 0 Oct 25 13:28 /home/gms/test/f1
-rw-r--r-- 1 gms gms 0 Oct 25 13:28 /home/gms/test/f2
gms@gms ~ $ 
btw: je nach Anforderung ist "rsync" oder "unison" vermutlich die elegantere,schnellere und sicherere... Lösung

Gruß
gms

Antworten