A broken Pipe oder `ssh -n`
Hier geht es mir um die Option -n bei der Verwendung von ssh. Ohne die Option -n greift ssh auf Standardeingabe (die Pipe) zu und löscht diese zunächst. Das kann zu erstaunlichen Fehlern führen wenn ein bash-Skript die Pipe verwendet. Hier ein Beispiel aus der Praxis:
while IFS= read -r filename; do
[[ -z "$filename" ]] && continue # Leere Zeilen überspringen
echo "[$TIMESTAMP] Lösche $filename vom Server ..."
ssh "$REMOTE_USER@$REMOTE_HOST" "rm -f '$REMOTE_DIR/$filename'"
done < "$TMP_FILE"
In der while-Schleife wird über die Standardeingabe das Tempfile gelesen. Damit wird der Inhalt der ersten Zeile gelesen, berücksichtigt und so der erste ssh-Befehl ausgeführt. Ohne die Option -n führt das dazu, dass die Standardeingabe von ssh zunächste gelöscht wird. Damit sieht die while-Schleife keine weiteren Einträge aus der Datei mehr und kann sie also nicht mehr abarbeiten. Eine kleine Änderung, nämlich die Option '-n' behebt das Problem und die while-Schleife wird korrekt durchlaufen.
while IFS= read -r filename; do
[[ -z "$filename" ]] && continue # Leere Zeilen überspringen
echo "[$TIMESTAMP] Lösche $filename vom Server ..."
ssh -n "$REMOTE_USER@$REMOTE_HOST" "rm -f '$REMOTE_DIR/$filename'"
done < "$TMP_FILE"