comment diriger les données vers la connexion sftp?

9

ftp prend en charge la put "|..." "remote-file.name"commande pour diriger les données vers une connexion ftp. Existe-t-il quelque chose de similaire pour sftp?

Dans sftp, j'obtiens l'erreur suivante:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

comme ci-dessus, le client sftp n'exécute évidemment pas la commande.

je veux utiliser la commande pipe pour rediriger directement le flux de fichiers vers sftp. (car il n'y a pas assez d'espace pour créer un fichier de sauvegarde sur le même disque avant de le télécharger sur le serveur sftp.)

JMW
la source
1
J'ai pensé à utiliser un FIFO pour cela, mais ni SFTP ni SCP ne liront à partir d'un FIFO.
Tom Anderson
1
aussi une bonne idée, c'est la mienne: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Réponses:

4

J'ai eu beaucoup de plaisir à trouver une solution à ce problème. Il nécessite l'outil nc (netcat) sur les deux machines et SSH (SFTP n'est pas nécessaire).

Dans cet exemple, j'appellerai la machine qui a les données qui doivent être sauvegardées sous linux-a, et la machine qui doit recevoir la sauvegarde linux-b.

Sur linux-a, faites écouter netcat sur un port (j'ai pris 2000) et redirigez-le vers un fichier. Cela restera juste là et attendra jusqu'à ce que quelque chose arrive sur ce port.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Sur linux-b, ouvrez un tunnel ssh vers linux-a, j'ai de nouveau utilisé le port 2000. Cela redirigera tout ce que vous lancerez sur le port TCP 2000 sur localhost vers le port TCP 2000 sur linux-a, où netcat écoute.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Créez maintenant l'archive tar, mais envoyez la sortie à stdout (en utilisant -) et dirigez-la vers gzip pour une compression. Dirigez maintenant cela vers un autre netcat qui l'envoie à localhost sur TCP sur le port 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Avaient fini! Sous linux-b, le netcat n'écoute plus et un nouveau fichier est créé. La meilleure partie est que l'archive tar n'a jamais été placée sur le disque dur de linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

Je sais que ce n'est pas exactement ce que vous avez demandé dans la question, mais si vous avez Netcat disponible, c'est une solution viable à votre type de problème.

Edit: j'ai oublié une chose: si vous suivez ces instructions, vous aurez toujours un tunnel SSH flottant sur linux-a. Découvrez quel est l'ID de processus et supprimez-le.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741
Kenny Rasschaert
la source
3
j'aime ça, mais il y a 2 problèmes: les utilisateurs sftponly ne peuvent généralement pas utiliser la redirection de port et les utilisateurs sftponly ne peuvent pas accéder à nc sur le serveur sftp (rappelez-vous qu'ils n'ont pas d'accès ssh)
JMW
1
C'est une critique tout à fait valable.
Kenny Rasschaert
Hors sujet, mais pourquoi y a-t-il une capture d'écran du "The Prestige" intégrée dans ce post?
Rilindo
4

Comme c'est le premier résultat que vous trouvez en cherchant sur cette question et qu'il n'a pas déjà été mentionné, j'ajouterai également la solution que j'ai trouvée ici:

vous pouvez utiliser l'implémentation de boucles sftp pour cela. Comme curl est probablement déjà installé sur de nombreux systèmes, cela pourrait être préféré à la solution utilisant des clients personnalisés.

exemple d'utilisation:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curl utilise votre .ssh/known_hosts fichier pour la vérification des clés. Cela peut échouer si votre client ssh utilise des normes de chiffrement plus récentes non prises en charge par la bibliothèque utilisée dans curl

pour résoudre ce problème, vous pouvez ajouter les autres types de clés au fichier d'hôtes connu à l'aide de la commande suivante:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

ou vous pouvez désactiver la vérification des clés à l'aide du -kdrapeau (je ne le recommanderais pas cependant)

bsod
la source
2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' est une option, si votre utilisateur distant a un shell valide.

voretaq7
la source
5
Ce n'est PAS sftp!
jirib
3
@JiriXichtkniha Non, ce n'est pas le cas, mais SFTP est presque toujours implémenté en tant que sous-système de votre serveur SSH, et c'est l'analogue le plus proche de la fonctionnalité que je vois être demandée à la question (les données de canal via SFTP doivent être gérées par un programme à l'autre extrémité). Parfois, la réponse est "Vous utilisez le mauvais outil - faites à la thisplace." - cela me semble être l'un de ces moments.
voretaq7
2
sftp est protol, et est différent de la simple tuyauterie via ssh, c'est tout! Votre suggestion ne fonctionnerait pas si la partie distante était uniquement SFTP.
jirib
1
je ne suis pas autorisé à me connecter en tant qu'utilisateur ssh
JMW
1
@JMW dans ce cas, pour autant que je sache, vous êtes plutôt bien foutu ici - je n'ai jamais vu une version de sftp qui prend en charge la canalisation vers une commande sur le système distant (probablement parce que cela Sannulerait le bit d'écure en laissant quelqu'un entrer votre situation qui n'a pas de programmes exécutés de toute façon). Je peux me tromper cependant - je connais surtout la fonctionnalité SFTP dans OpenSSH et le serveur SSH propriétaire que Sun avait l'habitude de livrer ...
voretaq7
1

voretaq7 a souligné que le client sftp ne prend pas en charge le transfert de données par pipeline pour les utilisateurs, qui sont autorisés à utiliser sftp uniquement pour se connecter au serveur.

heureusement, il y a libssh2, qui prend en charge sftp. nous avons donc juste besoin de 2 autres clients utilisant libssh2, que j'ai appelés:

  • sftp_stdin_upload (pour télécharger sur un serveur sftp)
  • sftp_stdout_download (à télécharger depuis un serveur sftp)

le code source peut être trouvé sous l'URL suivante: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


comme je ne suis pas très expérimenté dans la programmation de libssh2, je suis content pour tout commentaire sur le code source.

JMW
la source
Ne fonctionne pas pour moi :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): référence non définie au symbole 'EVP_sha1' / usr / lib / libcrypto. so.1.0.0: erreur lors de l'ajout de symboles: DSO manquant dans la ligne de commande collect2: erreur: ld a renvoyé 1 état de sortie
tobixen
Ce code a juste un statut POC. N'hésitez pas à le réparer vous-même. :-)
JMW