QSsh之SshConnection类

SshConnection

#include"sshconnection.h"       所在的头文件

类:SshConnectionParameters:

连接需要的信息类。包含需要连接的主机和验证信息。

enum AuthenticationType 验证方式

{AuthenticationByPassword, 密码验证

AuthenticationByKey}; key文件验证

公有函数:

SshConnectionParameters() 构造函数。

属性:

QString host; 主机,主机名或者主机地址

QString userName; 用户名

QString password; 密码

QString privateKeyFile; 密匙文件。(文件地址)

int timeout; // In seconds. 连接等待时间,超过时间就自动返回连接超时,单位秒(s)

AuthenticationType authenticationType; 验证方式

quint16 port;

SshConnectionOptions options; 连接设置

SshConnectionOption枚举

enum SshConnectionOption {

SshIgnoreDefaultProxy = 0x1,  忽略默认代理?

SshEnableStrictConformanceChecks = 0x2

};

Q_DECLARE_FLAGS(SshConnectionOptions, SshConnectionOption)

 

类:SshConnectionInfo

连接信息类。

公有函数:

SshConnectionInfo() : localPort(0), peerPort(0) {}   构造函数

SshConnectionInfo(const QHostAddress &la, quint16 lp, const QHostAddress &pa, quint16 pp)

: localAddress(la), localPort(lp), peerAddress(pa), peerPort(pp) {} 构造函数

QHostAddress localAddress; 本地IP地址

quint16 localPort; 本地端口

QHostAddress peerAddress; 目标地址

quint16 peerPort; 目标地址

类:SshConnection

连接到服务器的类。下面打开和执行命令,ssh socket通道,sftp面板都需要此类。

enum State{Unconnected,Connecting,Connected}; 连接状态枚举{未连接,连接中,已连接}

公共函数:

explicit SshConnection(const SshConnectionParameters &serverInfo, QObject *parent = 0); 构造函数,参数是连接所需的信息类,和父对象。

void connectToHost(); 连接到服务器(异步)

void disconnectFromHost(); 从服务器断开连接

State state() const; 返回当前连接的状态

SshError errorState() const; 返回当前连接的错误

QString errorString() const; 返回当前连接错误的文本信息

SshConnectionParameters connectionParameters() const;  返回所用的连接信息类

SshConnectionInfo connectionInfo() const;  返回当前的连接信息

~SshConnection(); 析构函数

QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command); 创建一个命令执行过程呢,参数是需要执行的命令。命令执行完即退出,返回参数为SshRemoteProcess(远程进程类)的智能指针。

QSharedPointer<SshRemoteProcess> createRemoteShell(); 创建一个shell,返回的也是shRemoteProcess(远程进程类)的智能指针。这个可以保持状态,多次执行命令。Ssh跳板也是支持的,合理设计实现自动交互。

QSharedPointer<SftpChannel> createSftpChannel();  创建一个sftp面板,返回的是SftpChannel(sftp面板类)的智能指针

QSharedPointer<SshDirectTcpIpTunnel> createTunnel(quint16 remotePort); 创建一个ssh隧道,返回的是SshDirectTcpIpTunnel的智能指针。(这个类可以实现ssh的scoket代理。),参数是本地监听端口。

// -1 if an error occurred, number of channels closed otherwise.

int closeAllChannels(); //关闭所有通道数,正常返回通道数,错误返回-1

int channelCount() const;  通道数

发出的信号;

void connected(); 以连接到服务器

void disconnected(); 已从服务器断开连接

void dataAvailable(const QString &message); (有数据可用?)

void error(QSsh::SshError); 连接错误

 

Ssherro枚举:

enum SshError {

SshNoError, 没有错误

SshSocketError,  scoket错误

SshTimeoutError,  连接超时

SshProtocolError,

SshHostKeyError,  密码错误

SshKeyFileError, key验证错误

SshAuthenticationError,

SshClosedByServerError,

SshInternalError

};

注:QSSH是提取自Qt-creator里的一个ssh链接库,用botan库实现的加密,用qt框架的实现的ssh链接库。

这是官方留下的接口,官方的封装模式是(Qt源码中D-P指针的直接版,没用那么多宏实现的):

留出api类逻辑处理和运算单独存在一个private类里,api类里私有对象有一个private类,api里只是为了简洁的接口,隐藏细节的一个中间。话说,这个接口就够我们用的了。

此为我在使用中得到的一些参数和用法,非官方文档,有错误的地方请大家指正,还有的拿不准的就在后面加了个?号。

QSsh地址:http://www.oschina.net/p/qssh

https://github.com/dushibaiyu/QSsh

《QSsh之SshConnection类》有58个想法

  1. 真的很头大,你的这个类,还有这些个例子,封到一起,直接用QT打开是能编译,但是根本不好分开,取有用的到其它项目用。啥pri文件,见都没有见,真是难死人了。要高手才能用你这程序吧。。。。。。

    1. 很清晰了啊、、直接编译成库引用就行、、、我哪儿有原提取的地址、、我还做了整理的了、、再说,我也是菜鸟的、、这个文档写的不好我承认、、很多东西我也是从例子和源码里获取的、、、pri文件和pro文件都有的 啊、、还有qbs文件呢、、只是该更新了,我最近准备抽空更新呢、、这是从Qt-c提取出来的,很多东西还在不断添加呢、、

      1. 大哥,我看不懂,我做个项目,单独把src下的文件提出来放到其它项目中,不做配置,直接引用文件里面的类,就会出错,我又看不懂那些 .pri文件,还有里面的交叉引用,我看又在使用3rdparty,也不知道它内部是怎么引用的,在总体感觉来说,很乱。希望有空你整理一下,把里面的杂东西去掉,能让菜鸟,直接引用lib/ssh里面的类,直接就能用就好了。。。。

        1. 直接用?这个就有点麻烦、、这个需要重新整理pri文件的、、还有这个是GPL或LGPL授权的,直接写进程序的话,请确保你的程序也是开源的,GPL或者LGPL授权的、、、建议还是编译成库然胡引用吧、、、qssh和botan出来这两个库的,qssh以来botan的、、你引用这俩库就行了、、、

        1. botand.dll和QSshd.dll 这俩是debug版本的、、最好再编译一个relese版本的、、直接在pro文件里右键添加库就行了、、或者手动写文件:win32:CONFIG(release, debug|release): LIBS += -L(release路径)else:win32:CONFIG(debug, debug|release): LIBS += -L(debug路径)win32:INCLUDEPATH += (头文件路径)win32:DEPENDPATH += (头文件路径)如果直接和源文件放在一个工程里也可以的、、添加下面的、、注意路径、、include(../../qssh.pri) ## Required for IDE_LIBRARY_PATH and qtLibraryNameLIBS += -L$${QSSH_ROOT}/lib -l$$qtLibraryName(Botan) -l$$qtLibraryName(QSsh)

          1. 哥们,我的目录结果是/-QSsh-master / //是你的类库目录 -examples -lib / -Botan.dll -QSsh.dll -Botan.a -略…… -include -略……-main.h-main.cpp-myobject.pro-略……myobject.pro增加的内容如下:win32:CONFIG(release, debug|release): LIBS += -L$$PWD/QSsh-master/lib/ -llibBotanelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/QSsh-master/lib/ -llibBotandelse:unix: LIBS += -L$$PWD/QSsh-master/lib/ -llibBotanwin32:CONFIG(release, debug|release): LIBS += -L$$PWD/QSsh-master/lib/ -llibQSshelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/QSsh-master/lib/ -llibQSshdelse:unix: LIBS += -L$$PWD/QSsh-master/lib/ -llibQSshINCLUDEPATH += $$PWD/QSsh-master/includeDEPENDPATH += $$PWD/QSsh-master/include编译提示:d:myobjectQSsh-masterincludesshsshconnection.h:42: 错误:QHostAddress: No such file or directory #include 请问为什么会这样呢在examples下面编译出来的exe都不会有上面的此错误……

          2. 噶,这个留言版,会把空格删除掉……项目目录结构是:我的项目的目录下,放的QSsh-master类库,并在我的项目目录的pro文件中添加了include另外,我把.a文件改成了.lib,才能使用右键添加,不然没法使用(windows平台),不知道是否正确

          3. 我使用右键添加库的,选择 添加外部库,添加内部库和系统库都没法添加选择添加外部库后,仅能选择.lib文件,在window平台上编译出来的是.dll和.a文件,我把.a文件改成.lib文件,然后添加成功了,不知道是否正确。

          4. 这样添加是可以的、、但是你要吧.lib还改回.a,你用的mingw,mingw在win平台.a文件就是对应vc的.lib的、、上面你的那个找不到的错误,你需要添加QT += network在你的pro文件里、、、

          5. 感谢哥们耐心解答,终于用上你的库了,泪流满面感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢

          6. 不好意思,问了一个低级的问题编译提示:d:myobjectQSsh-masterincludesshsshconnection.h:42: 错误:QHostAddress: No such file or directory #include 在pro文件中 QT += network 就好了

    1. 这不是问题、、SSH链接也是一个socket链接而已、、Qt的socket本来就不能跨线程读写的、、你需要多线程,其一,你建立多个链接,其二,你其他线程用信号槽来交换数据。

    1. 您是在git里拉取的我的最新的版本吗?那个是不生成botan库的,我把工程结构调整过的,把botan直接编译到qssh.dll中去了,减少发布程序的时候带的动态库太多、、

          1. 哥们,用这个编译好的库,写了个项目,debug版本能够正常运行,但是编译为release版本后就会异常退出。我发现git拉取的最新版本,编译为release版本,也会异常退出

  2. 你好,我在网上看到了你的这个代码。我下载了之后取了你其中的qtsshshell这个例子,然后我想自己改写,想添加一个图像化的窗口用来查看cpu和内存的使用情况。然后我在数据提取方面出现了问题,你写的sshcon函数我怎么都看不明白,尤其是其中的connect,理论上来说这里应该能提取出我命令执行的结果,可是提不出来。。所以就想来问问你,这一块你写的思路以及程序的运行,谢谢~~如果你看到了,可以给我回邮件,874155706@qq.com。非常感谢。

        1. 我使用的时候是主要在win下的,我是开始就用的Qt5、、我发现其提取位置后,我就紧接着更新代码了、、并为代码的结构做了我认为合理的优化了、、、win下不过,你看下错误是什么?

          1. 我装了qt 5.4编译后还是不行,错误:Syntax: SecureUploader local_file username@host:/destination_path我的系统是win7 64位,能否告诉我提取位置呢?

          2. 这是例子错误、、你看生成*Qssh.dll没,这个应该是编译过的了、、他的例子需要你输入参数的、、最新版的Qt-c里的必须要Qt5.3+才能编译过、、我版本库里的,好像需要至少是Qt5、、/src/lib/ssh我记得路径是这个、、你可以自己去看看、、

      1. 公司服务器必须可以连接,我用putty就没有问题!我直接用的例子,只是把用户名密码 服务器地址改了;两种验证都试了!

          1. qtsshshell这个列子,可以编译链接成功,就是未连接状态,哪怕是个正在连接或者连接失败都可以,是个未连接状态,这个就很郁闷了!

          2. 你有没有看看例子的代码?里面的代码你改没?这个历史是我写的不好,用户名密码一类的什么都是写在里面的、、

  3. 兄弟感谢你提取的文件,编译一切ok,想请教一下,sftp channel 传输文件的的进度如何获取,或者常用的实现方法。谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注