Comment faire tar pour sauvegarder l'archive sur une machine distante en utilisant sftp ou ftp?

10

Je voudrais sauvegarder certaines de mes données très importantes sur une machine distante.
Actuellement, je l'enregistre simplement sur ma machine locale en utilisant cette commande:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*

Je préférerais ne pas utiliser une autre commande pour la transférer vers la machine distante, ce qui signifie que je voudrais simplement que cette commande soit mise à niveau afin de pouvoir transférer les données vers la machine distante.

Ceci est conçu pour être dans un script plus tard qui est supposé s'exécuter seul, ce qui signifie que tout type d'entrée utilisateur requise le gâcherait complètement!

Quelque chose comme

tar -cvjf sftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
tar -cvjf  ftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*

serait parfait! (Pas de tuyaux (etc.), juste une commande!)

BrainStone
la source
Est - il besoin d'être ftp? Vous n'avez pas sshaccès à cette machine?
terdon
Je n'ai pas accès ssh à la machine. C'est juste un serveur de sauvegarde que je loue. Alors oui, ça doit être ftp ou sftp.
BrainStone
@BrainStone SFTP fait partie de SSH
kurtm
Je connais. Mais il est configuré de manière à ce que chaque connexion ssh soit immédiatement fermée. SFTP fonctionne cependant. Je sais que c'est une configuration bizarre mais c'est comme ça.
BrainStone
1
SFTP est disponible lorsque SSH ne l'est pas s'ils utilisent un serveur interne sftp et que votre shell est défini sur / sbin / nologin.
Gregg Leventhal

Réponses:

15

Pour SSH:

tar czf - . | ssh remote "( cd /somewhere ; cat > file.tar.gz )"

Pour SFTP:

outfile=/tmp/test.tar.gz
tar cvf $outfile . && echo "put $outfile" | sftp remote:/tmp/
Connecting to remote...
Changing to: /tmp/
sftp> put /tmp/test.tar.gz
Uploading /tmp/test.tar.gz to /tmp/test.tar.gz
/tmp/test.tar.gz

Un autre SFTP:

outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0
jirib
la source
Alors, comment utiliserais-je cela exactement? Je veux dire comment puis-je définir quels fichiers doivent être dans la balle tar. Et où dois-je mettre le mot de passe? Et comment le configurer pour ne pas avoir à accepter l'empreinte digitale des hôtes?
BrainStone
Veuillez en savoir plus sur ssh, man ssh, man ssh-agent, man ssh_config répond à tous vos doutes. Quels fichiers vous définissez localement avec des arguments tar, puis ils sont dirigés via ssh vers l'hôte distant et la sortie est redirigée vers le fichier.
jirib
Est-il possible de le faire sans pipe?
BrainStone
Cela ne peut pas non plus fonctionner car il doit être sftp ( pas d'accès ssh ) ou ftp
BrainStone
Pour ftp, voir man lftp. Si vous avez besoin de scénarios plus compliqués, utilisez 'sftp -b' et ayez un fichier avec des commandes ou utilisez 'ici des documents' (<< EOF).
jirib
3

Tar ne parle pas ftp ou sftp. Ce n'est pas son travail. Vous ne pouvez pas faire cela avec du goudron seul. Utiliser des outils appropriés pour chaque tâche et les combiner avec le shell est la façon normale de faire les choses sur les systèmes Unix.

La solution la plus évidente consiste à créer l'archive localement, puis à la copier sur la machine distante.

Si vous ne voulez pas créer l'archive localement parce que vous n'avez pas assez de place, vous pouvez créer un canal nommé, faire écrire tar à ce canal et trouver un (s) client ftp qui peut lire à partir des tuyaux. Malheureusement, sftp refuse putune pipe. Certains clients FTP fonctionnent, par exemple lftp:

mkfifo f
tar -cvjf f ~/importantfiles/* &
sleep 2
lftp -f - <<EOF
open user@host
put f Backup.tar.bz2
EOF
wait
rm f

Saisissez votre mot de passe FTP ~/.netrc.

Alternativement, il existe un moyen de faire enregistrer votre commande tar directement sur le serveur distant, mais vous avez besoin d'une configuration préalable. Montez le serveur distant sur SSHFS ou curlftpfs .

mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host
Gilles 'SO- arrête d'être méchant'
la source