Comment copier un fichier en C/C++ avec libssh et sftp
Je poste ici car j'ai besoin d'aide avec un peu de code en relation avec libssh.
J'ai lu toute la documentation officielle ici encore, mais je ne comprends pas les choses que je dois faire si quelqu'un peut en lumière moi je serais heureux.
En fait, je veux copier un fichier à partir d'un client à un serveur distant, mais je ne comprends pas comment le faire avec la bibliothèque libssh et la fonction sftp dans libssh.
La situation est la suivante: La session ssh est ouvert et le sftp session est ouverte trop, je peux créer un fichier et écrire à partir du client vers le serveur avec la fonction intégrée de lib ssh.
Je n'ai pas trouver un moyen facile de copier un fichier du client vers le serveur avec une fonction simple comme sftp_transfer(sourceFile(comme c:\my document\bonjour world.txt),fichier distant, remotefile(/home/utilisateur/bonjour world.txt),droit(lecture et écriture)) ?
Avec ce que j'ai compris, à partir du tutoriel, c'est d'abord la création d'un fichier dans l'emplacement distant (serveur) puis c'est l'ouverture de ce fichier avec cette ligne de code :
file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);
Après que le fichier est créé sur le serveur , et ensuite il est écrit dans ce fichier créé avec un tampon:
const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);
nwritten = sftp_write(file, helloworld, length);
Ma question est de savoir maintenant si j'ai un fichier par exemple une .fichier doc et je veux transférer/télécharger ce fichier à partir de c:\mydocument\document.doc à distance le serveur distant /home/user/document.doc comment puis-je faire avec cette méthode ?
Comment puis-je mettre ce fichier dans le sftp_write() fonction de l'envoyer comme la helloworld dans l'exemple de la fonction ?
J'ai peut-être pas assez bon dans la programmation à comprendre, mais j'ai vraiment essayé de comprendre et je suis coincé avec elle.
Merci d'avance pour votre aide
Voir ci-dessous un exemple de code que j'ai utilisé pour le test:
//Set variable for the communication
char buffer[256];
unsigned int nbytes;
//create a file to send by SFTP
int access_type = O_WRONLY | O_CREAT | O_TRUNC;
const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);
//Open a SFTP session
sftp = sftp_new(my_ssh_session);
if (sftp == NULL)
{
fprintf(stderr, "Error allocating SFTP session: %s\n",
ssh_get_error(my_ssh_session));
return SSH_ERROR;
}
//Initialize the SFTP session
rc = sftp_init(sftp);
if (rc != SSH_OK)
{
fprintf(stderr, "Error initializing SFTP session: %s.\n",
sftp_get_error(sftp));
sftp_free(sftp);
return rc;
}
//Open the file into the remote side
file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);
if (file == NULL)
{
fprintf(stderr, "Can't open file for writing: %s\n",ssh_get_error(my_ssh_session));
return SSH_ERROR;
}
//Write the file created with what's into the buffer
nwritten = sftp_write(file, helloworld, length);
if (nwritten != length)
{
fprintf(stderr, "Can't write data to file: %s\n",
ssh_get_error(my_ssh_session));
sftp_close(file);
return SSH_ERROR;
}
`
Vous devez vous connecter pour publier un commentaire.
Ouvrir le fichier de la manière habituelle (à l'aide de C++de fstream ou C stdio.h), lire son contenu dans un tampon, et de transmettre la mémoire tampon de
sftp_write
.Quelque chose comme ceci:
Remarque que c'est un très simple de mise en œuvre. Vous devriez ouvrir le fichier distant en mode ajout, puis d'écrire les données en morceaux au lieu de les envoyer seule énorme tas de données.
std::vector<char>
oustd::unique_ptr<char[]>
pour éviter la fuite de mémoire ici.L'exemple suivant utilise
ifstream
dans une boucle, d'annuler le chargement d'un ensemble de fichiers dans une mémoire (ce que l'on a accepté la réponse n'):J'ai utilisé l'exemple ici.
sftp_read_sync
utilise une boucle infinie pour lire un fichier à partir d'un serveur en/path/to/profile
de chemin d'accès au serveur
/etc/profile
.