#endif#i_libssh2 编译">
赞
踩
一、下载源代码:
github:https://github.com/libssh2/libssh2
二、编译安装:
1.安装依赖库(选一个即可)
2.安装libssh2,生成静态库和动态库
三、例程
- #include "libssh2.h"
-
- #ifdef HAVE_WINSOCK2_H
- # include <winsock2.h>
- #endif
- #ifdef HAVE_SYS_SOCKET_H
- # include <sys/socket.h>
- #endif
- #ifdef HAVE_NETINET_IN_H
- # include <netinet/in.h>
- #endif
- # ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- #ifdef HAVE_ARPA_INET_H
- # include <arpa/inet.h>
- #endif
- #ifdef HAVE_SYS_TIME_H
- # include <sys/time.h>
- #endif
-
- #include <sys/types.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <stdio.h>
- #include <ctype.h>
-
-
- int main()
- {
- unsigned long hostaddr;
- int sock, i, auth_pw = 1;
- struct sockaddr_in sin;
- const char *fingerprint;
- LIBSSH2_SESSION *session;
- LIBSSH2_CHANNEL *channel;
- const char *username = "用户名";
- const char *password = "密码";
- int rc;
-
- /init_slot()
- #ifdef WIN32
- WSADATA wsadata;
- int err;
-
- err = WSAStartup(MAKEWORD(2, 0), &wsadata);
- if(err != 0) {
- fprintf(stderr, "WSAStartup failed with error: %d\n", err);
- return 1;
- }
- #endif
-
-
- rc = libssh2_init(0);
- if(rc != 0) {
- fprintf(stderr, "libssh2 initialization failed (%d)\n", rc);
- return 1;
- }
-
- hostaddr = inet_addr("IP地址");
- sin.sin_family = AF_INET;
- sin.sin_port = htons(22);
- sin.sin_addr.s_addr = hostaddr;
- /* Ultra basic "connect to port 22 on localhost"
- * Your code is responsible for creating the socket establishing the
- * connection
- */
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if(sock == -1)
- {
- qDebug() << "failed to create socket!";
- return -1;
- }
-
- if(::connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) {
- fprintf(stderr, "failed to connect!\n");
- return -1;
- }
-
- fprintf(stderr, "sock connected!\n");
-
- /* Create a session instance
- */
- session = libssh2_session_init();
- if(!session)
- return -1;
-
- fprintf(stderr, "session inited!\n");
-
- /* ... start it up. This will trade welcome banners, exchange keys,
- * and setup crypto, compression, and MAC layers
- */
- rc = libssh2_session_handshake(session, sock);
- if(rc != 0) {
- qDebug() << rc;
- fprintf(stderr, " %d\n", rc);
- return -1;
- }
-
- fprintf(stderr, "session handshake!\n");
-
- /* At this point we havn't yet authenticated. The first thing to do
- * is check the hostkey's fingerprint against our known hosts Your app
- * may have it hard coded, may go to a file, may present it to the
- * user, that's your call
- */
- fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
- fprintf(stderr, "Fingerprint: ");
- for(i = 0; i < 20; i++) {
- fprintf(stderr, "%02X ", (unsigned char)fingerprint[i]);
- }
- fprintf(stderr, "\n");
-
-
- /* We could authenticate via password */
- if(libssh2_userauth_password(session, username, password)) {
- fprintf(stderr, "Authentication by password failed.\n");
- goto shutdown;
- }
-
- qDebug() << "Authentication by password successful";
- /
- /
-
- /* Request a file via SCP */
-
- const char* loclfile = "源文件";
- const char *scppath = "目标文件";
- FILE *local = fopen(loclfile, "rb");
- if(!local)
- {
- qDebug() << "Can't open local file: " << loclfile;
- return -1;
- }
-
- struct stat fileinfo;
- stat(loclfile, &fileinfo);
-
-
- channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777, (unsigned long)fileinfo.st_size);
- if(!channel)
- {
- char *errmsg;
- int errlen;
- int err = libssh2_session_last_error(session, &errmsg, &errlen, 0);
-
- qDebug() << "Create channel failed. " << err;
- goto shutdown;
- }
-
- qDebug() << "SCP session waiting to send file";
-
- do
- {
- char mem[1024];
- size_t nread = fread(mem, 1, sizeof(mem), local);
- if(nread <= 0) /* end of file */
- {
- break;
- }
-
- char *ptr = mem;
- do
- {
- /* write the same data over and over, until error or completion */
- int rc = libssh2_channel_write(channel, ptr, nread);
- if(rc < 0) // error
- {
- qDebug() << "ERROR " << rc;
- break;
- }
- else /* rc indicates how many bytes were written this time */
- {
- ptr += rc;
- nread -= rc;
- }
- } while(nread);
-
- } while(1);
-
- libssh2_channel_free(channel);
- channel = NULL;
-
- shutdown:
-
- libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing");
- libssh2_session_free(session);
-
- #ifdef WIN32
- closesocket(sock);
- #else
- close(sock);
- #endif
- fprintf(stderr, "all done\n");
-
- libssh2_exit();
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。