QSsh的SSH命令部分使用,Qt的ssh连接库

QSsh是从Qt-Creator里面提取的ssh协议的连接和shell命令执行。最近项目需要自己连接ssh服务器,进行shell输出捕获和自动回应。

简单说下我的使用:

单独提取的地址:https://github.com/dushibaiyu/QSsh (更新到最新qt-creator里的。)

首先说下QSsh流程,首先连接:

新建SshConnectionParameters对象,初始化连接信息。这个类很简单,看下就懂了、、

其次就是连接:SshConnection类,新建时必须指定连接信息、、、调用connectToHost()函数去连接,连接成功发送connected()信号。

断开连接是:disconnectFromHost()函数,也会发送信号的、、

真正处理交互的是SshRemoteProcessRunner类和SshRemoteProcess类、、、sftp和ssh隧道的类项目没用到也没怎么看,可以自己研究下、、

先说SshRemoteProcessRunner类,这个类是为执行单挑或者单串命令准备的、、期间交互比较麻烦、、、

SshRemoteProcess类是很强大的类,但是他的构造函数却是私有的、、不能直接定义的、、只有通过SshConnection类的createRemoteProcess(const QByteArray &command)函数或者createRemoteShell()来得到指向他的智能指针。

通过createRemoteProcess(const QByteArray &command)函数生成的和SshRemoteProcessRunner类执行单条命令类似,执行完立刻退出的、、你可以通过信号捕获输出的结果、、、

最强大的是createRemoteShell()得到的SshRemoteProcess对象,其直接就是一个shell、、、类似putty的那样的,功能一点也不如弱的,二级命令,ssh跳板都支持的、、、通过readyReadStandardOutput()信号,得知服务端有输出,通过readAllStandardOutput()得到shell输出的内容、、、SshRemoteProcess是继承QIODevice的,当初找不到怎么向远程shell发送命令,最后居然是通过write(…)函数、、、千万注意,命令后面别忘跟着换行符(博主傻瓜,因为这个细节失误研究了两天)、、、

 

操作sftp的 SftpChannel类和TCP隧道的SshDirectTcpIpTunnel类和SshRemoteProcess一样的,同样不能直接定义的都需要通过SshConnection类的函数来生成,返回只能指针、、而这两个类我在项目中没用到,也就没自己看就研究其他项目中的难点了、、

在QSsh项目的github中里面有Qt-creator官方的例子,和提取作者的一个sftp的例子,我也加了个ssh shell的例子、、如果您在项目中使用了QSsh,欢迎一起探讨、、您可以留言或者给我邮件、、、

Ps:没有逻辑,写的很差、、、、大牛们轻喷、、、

9 thoughts on “QSsh的SSH命令部分使用,Qt的ssh连接库”

  1. 博主,为啥我连接会出现 错误:D:ProjectQTQSsh-masterexamples_bin>shell.exe -h 192.168.1.104 -u geocross -pwd geocross -p 22SSH connection error: SSH Protocol error: Server identification string is invalid (missing carriage return).

      1. G:\Demo\Demo_QSsh\lib\libQSshd.a(d000420.o):-1: error: multiple definition of `QSsh::SshConnection::connected()’

        提示这个是怎么回事啊?可以解决吗?
        我用qt5 的写法:
        void (QSsh::SshConnection::*myConnectedSignal)() = &QSsh::SshConnection::connected;
        void (Widget::*myHandleConnected)() = &Widget::handleConnected;
        connect(m_connection,myConnectedSignal,this,myHandleConnected);

  2. 楼主qt界面和业务逻辑代码有吗?请教一下具体qt中,paramiko模块远程登录ssh如何实现呢?

  3. 这个只能在windows和mac下使用么?为在ubuntu下能编译过去运行的看不懂,ubuntu运行例子怎么用

  4. if (!createAuthenticationKeyFromPKCS8(privKeyFileContents, pubKeyParams, allKeyParams, error1)
    && !createAuthenticationKeyFromOpenSSL(privKeyFileContents, pubKeyParams, allKeyParams,
    error2)) {
    qCDebug(sshLog, “%s: %s\n\t%s\n”, Q_FUNC_INFO, qPrintable(error1), qPrintable(error2));
    throw SshClientException(SshKeyFileError, SSH_TR(“Decoding of private key file failed: ”
    “Format not understood.”));
    }

    这个地方出错,是什么原因啊?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.