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.)
Réponses:
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.
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.
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.
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.
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.
la source
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:
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 curlpour 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:
ou vous pouvez désactiver la vérification des clés à l'aide du
-k
drapeau (je ne le recommanderais pas cependant)la source
output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'
est une option, si votre utilisateur distant a un shell valide.la source
this
place." - cela me semble être l'un de ces moments.S
annulerait 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 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:
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.
la source