Ich beabsichtige, vollständige und inkrementelle Sicherungen meiner btrfs-Subvolumes an einen Bandarchivierungsdienst zu übertragen. Der Dienst macht FTP- und SSH-Endpunkte verfügbar. Wenn ich beliebige Befehle auf dem SSH-Endpunkt ausführen dürfe, würde ich Folgendes tun, um eine Teilsicherung durchzuführen:
btrfs send -p $LAST_SUBVOLUME $NEXT_SUBVOLUME | compress | encrypt |
ssh -p $PORT $USER@$ENDPOINT "cat > $SUBVOLUME.$YYYYMMDD.btrfs.bz2.gpg"
Das darf ich aber nicht:
$ ssh -p $PORT $USER@$ENDPOINT
Last login: Mon Jan 3 01:23:45 2067 from 123.456.789.123
This account is restricted by rssh.
Allowed commands: scp sftp rsync
If you believe this is in error, please contact your system administrator.
Connection to some.remote.endpoint closed.
Stattdessen wollte ich das SCP-Protokoll für die Übertragung verwenden. Meine scp
Binärdatei weigert sich jedoch, eine Named Pipe zu übertragen:
$ scp -P $PORT <(btrfs send -p $LAST_SUBVOLUME $NEXT_SUBVOLUME | compress | encrypt) \
$USER@$ENDPOINT:$SUBVOLUME.$YYYYMMDD.btrfs.bz2.gpg
/dev/fd/63: not a regular file
Die Ironie ist, dass man anscheinend BEARBEITEN (03.06.2017): Dies war eine falsche Beobachtung. Wie Kenster feststellt, können mit dem SCP-Protokoll keine Dateien unbekannter Größe gesendet werden.scp
einmal das Richtige getan hat . Ich nehme an, nicht jeder hat gedacht, dass das Übertragen von Named Pipes vernünftig / nützlich sein könnte.
UPDATE (2017-06-04): Ich habe auch versucht, die Daten mit dem SFTP-Protokoll zu übertragen. Offensichtlich erlaubt das FTP-Protokoll das Senden von Dateien unbekannter Größe, was durch die Unterstützung von Piping-Daten in den Binärdateien ftp
( Link ) und ncftpput
( Link , Abschnitt Beschreibung, letzter Absatz) belegt wird. Ich fand keine solche Unterstützung in den SFTP-Clients, die ich ausprobiert habe ( sftp
, lftp
). Dies könnte ein Hinweis darauf sein, dass SFTP (im Gegensatz zu FTP) das Senden von Dateien unbekannter Größe nicht unterstützt (anders als ich dachte, ist SFTP nicht nur über SSH mit FTP verbunden) es ist ein anderes Protokoll).
UPDATE (2017-06-05): Gemäß dem Internet-Entwurf ( Link ) des SFTP-Protokolls, Version 3 , muss jedes Paket auf Anwendungsebene die Nutzdatenlänge vor der Nutzdaten angeben ( Link , Abschnitt 3). SFTP unterstützt jedoch Suchvorgänge in der geschriebenen Datei ( Link , Abschnitt 6.4) mit expliziter Unterstützung für Schreibvorgänge über das aktuelle Dateiende hinaus. Daher sollte es möglich sein, einen kleinen Puffer auf der Clientseite zu verwenden und eine Datei unbekannter Größe in kleinen, bekannt großen Blöcken zu senden:
#!/bin/bash
# <Exchange SSH_FXP_INIT requests.>
# <Send an SSH_FXP_OPEN request.>
CHUNK_SIZE=32768
OFFSET=0
IFS=''; while read -r -N $CHUNK_SIZE CHUNK; do
ACTUAL_SIZE=`cat <<<"$CHUNK" | head -c -1 | wc -c`
# <Send an SSH_FXP_WRITE request with payload $CHUNK of size
# $ACTUAL_SIZE at offset $OFFSET.>
OFFSET=$(($OFFSET+$ACTUAL_SIZE))
done < <(command)
# <Send an SSH_FXP_CLOSE request.>
Es wäre jedoch sehr schmerzhaft, die Kommunikation manuell über die Shell durchzuführen. Ich suche einen SFTP-Client, der diese Art von Funktionalität verfügbar macht.
scp
früher Rohre gehandhabt wurden. Der Fehlerbericht, den Sie verknüpfen, zeigt, dass er auf unbestimmte Zeit an Pipes hängt. jetzt warnt es dich stattdessen. Das klingt nach einer besseren Fehlerberichterstattung, nicht nach einer Änderung des zugrunde liegenden Verhaltens.