• 14947阅读
  • 13回复

[讨论]QSsh的SSH命令部分使用,Qt的ssh连接库 [复制链接]

上一主题 下一主题
离线渡世白玉
 

只看楼主 倒序阅读 楼主  发表于: 2013-12-01

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:没有逻辑,写的很差、、、、大牛们轻喷、、、


求支持:http://www.dushibaiyu.com/2013/11/qssh的ssh命令部分使用,qt的ssh连接库.html
离线hanson

只看该作者 1楼 发表于: 2014-09-29
我从github下载了src,编译出来两个dll文件,怎么用到我的工程里?
离线hanson

只看该作者 2楼 发表于: 2014-09-29
新手,不大会配置。。。
离线stlcours

只看该作者 3楼 发表于: 2014-09-29
ssh是包括sftp的,你的也包括了吗?
另外,网上还有一个人写了一个东西:
https://github.com/lvklabs/QSsh
你可以看看,没准对你也有帮助~
离线渡世白玉

只看该作者 4楼 发表于: 2014-10-10
回 stlcours 的帖子
stlcours:ssh是包括sftp的,你的也包括了吗?
另外,网上还有一个人写了一个东西:
https://github.com/lvklabs/QSsh
你可以看看,没准对你也有帮助~ (2014-09-29 18:11) 

这个就是从哪个分支出来的、、
只是我帮他把代码更新了下、、
话说又该更新了、、
离线stlcours

只看该作者 5楼 发表于: 2014-10-10
回 渡世白玉 的帖子
渡世白玉:这个就是从哪个分支出来的、、
只是我帮他把代码更新了下、、
话说又该更新了、、 (2014-10-10 10:08) 

版主你够牛,居然自己从底层写sftp,那得多少个class才能完成任务啊。你有QQ吗?希望能与你交流一下,谢谢。
离线渡世白玉

只看该作者 6楼 发表于: 2014-10-10
回 stlcours 的帖子
stlcours:版主你够牛,居然自己从底层写sftp,那得多少个class才能完成任务啊。你有QQ吗?希望能与你交流一下,谢谢。 (2014-10-10 18:19) 

版主是菜鸟的、、
第一句话就注明出处了:QSsh是从Qt-Creator里面提取的ssh协议的连接和shell命令执行
是QTC里的。我只是分离然后整理了下、、、
离线a1378644764

只看该作者 7楼 发表于: 2016-08-26
版主,最近也在用Qssh做sftp,现在遇到个问题,就是不能在调用了sftpChannel中listDirectory函数之后马上再调用listDirectory,这可能是什么原因造成的啊,其他下载、上传什么的都可以连续执行
离线hehui

只看该作者 8楼 发表于: 2016-08-27
  
离线panxuyang

只看该作者 9楼 发表于: 2018-01-05
菜鸟一枚,我一运行你给的程序。为什么会出现这个?   怎么用QSSH啊?
离线ccchen

只看该作者 10楼 发表于: 2018-06-28
哪里写的不对吗?
        invalidKeyFile.port = 22;
        //invalidKeyFile.timeout = 30;
        invalidKeyFile.authenticationType = SshConnectionParameters::AuthenticationTypePublicKey;
        invalidKeyFile.userName = QLatin1String("root");
        //invalidKeyFile.privateKeyFile = QLatin1String("C:/Users/Administrator/Desktop/huadong-robots.pem");
        invalidKeyFile.privateKeyFile = QLatin1String("-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEAzFR6UNOZWsbamvupyDbF1eclT9N6mhFhojDVMaDai8pQ4A44\nZN9tq5hXqmvxbmCkeT4X8F+vSSR6aH+sO3hDoMjlbg+IGWZ0EC/fsEvXTRzTOOHF\n45c0G+WEJrmaky40jTnneh81whsIBu9d6DRJCDK0wXq+RBQiNOyhdB2G3x9PYNVQ\nwBLm/I2nsq/1cDFbfIz5dGd59+q6mNzBn96BwMUxtOHjRRNohQLfq8BKNxPz96im\nra6gdu1Lo4N+xMoOJJcprtxiKVNEw4Dw4PgW1XId+sYvHov1ukKpGtGCjadZfLyp\nzLQ63Y4OdO9TK059CbIFNtfvXxz7ChbIcTCHtQIDAQABAoIBAQC9U8VmYTpmj3z9\nQBUIbCAR3DSJa8XdPh++Pgs9CfOWtacMhICijxg6eFU6lvxFLw0XPn7F/pMXbdJy\nQ2KeVAgt0hgsS/3qszD10rYsz4k2bXAV87T99huVgaxaiX39xEFzXmTqlkKkkZF1\ng5P61X+aNgmggRANWq57ZYsQYU+YKu3qnnGziQPcwOfvDngYbsDBstp2MLDg2A/t\nV43wXV+o7bwhAxJGNPDhzeaEQ2JpR5cw24j5UD7c0T6wlHctuTu5K8s56sucNBMM\n8eV9xOgf1/DtvqMXajdzrGkdAA+t5BcWxZePf/dJ0/86fmChnzS1en5yjU59lIEu\nPBV4FYShAoGBAOgAPFp0mLpYeiN73Cog8AwbPaTvolZxYFPdW4qgPDBiLuvJuw9L\nsgc0ksCSG2ya1zu+wMS2/5D2dMz0tReORO3t0d/yWLfPHMnIcE2/gxfl7u1Y7BDe\na9PiW6llUGpvIhOdBcTFJixm+TG6cUkaB1e0iYZwW6UR+tleETnZGNK5AoGBAOF3\neHQJkvCqLWgUHQMkoWte4h3qlnDdcaFyh0rwddiWb27yc9TOxFTPuoGyZ85zs/Wf\nWV7o8rSSk6eWubJQujq951HmNS/9rc9HP2NGyAiQu/W8UwwGk0kLvmPBQLVyNTzK\nIZoKLuzgnCr3UYmfa5XOK3WNFuS2ESbOzOLg4I7dAoGBANxSjP5iSEB/kc5s7BLe\nINl+bTZblNF+7jn2t96YeVCBjYnClHDcM/9/v/Y9SuoCynAkoTCvkVj7lMSnh+sM\n4w0JkwyYPASjHfXK8kwDmd1yMUsZ7WW/tKsOBnqCirHpRHVX44iQqcX1LKY7JyaD\nH4H9I7WWspG613ziRn2nXFmRAoGAJvN20cUdp4oe0g43fOWFJYF82uI+Hz2CdfvN\nN7sXANXsZmRocmlOLcC9Xc6udFI00sg2rljcJSn1bExzxESCB8frAJEeuy2+K0MJ\nxmLiB+jJMAja6AbyxvnKaH1oanBSli/tYilENhQPprSXV4k9EuJNS7+WJuj1SZkM\neF2VLdkCgYEAtEBK+N88bTPOqn/+FrOIWVP27m62fHG0WDIJgy5oHx3i/VKzwJDd\nipU8FHZBzQhVj52h4j7trhZ25IxeiPrFrl/BuWTysBImXwiSOlBkt4DVMaZprsAG\nHVn5CTh4v6I+N0LRyWAzAHnAFTxnuO2o2s+il97rYtvsICqYHRH2qSY=\n-----END RSA PRIVATE KEY-----");
        qDebug() << invalidKeyFile.privateKeyFile;
        printf("---%d\n---", access("C:/Users/Administrator/Desktop/huadong-robots.pem", 0));
    }
        if (m_connection) {
            disconnect(m_connection, 0, this, 0);
            delete m_connection;
            }
        m_connection = new SshConnection(invalidKeyFile);
        connect(m_connection, SIGNAL(connected()), SLOT(handleConnected()));
        connect(m_connection, SIGNAL(disconnected()), SLOT(handleDisconnected()));
        connect(m_connection, SIGNAL(dataAvailable(QString)), SLOT(handleDataAvailable(QString)));
        connect(m_connection, SIGNAL(error(QSsh::SshError)), SLOT(handleError(QSsh::SshError)));
        qDebug("Testing: ");
        m_connection->connectToHost();
离线mis.chen

只看该作者 11楼 发表于: 2021-09-09
楼主你好,这个支持scp上传文件吗
离线mis.chen

只看该作者 12楼 发表于: 2022-02-09
回 hanson 的帖子
hanson:
我从github下载了src,编译出来两个dll文件,怎么用到我的工程里?

这两个dll是怎么编译出来的?楼主是按这个编译步骤吗:
mkdir $BUILD_DIRECTORY
cd $BUILD_DIRECTORY
qmake $SOURCE_DIRECTORY/qssh.promake (or mingw32-make or nmake depending on your platform)
但是我的为什么我的报错:
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [Makefile.Release:211: ..\..\lib\QSsh.dll] Error 1
mingw32-make[2]: Leaving directory 'C:/Users/hasee/Desktop/Qssh-M/lib/src'
mingw32-make[1]: *** [Makefile:37: release] Error 2
mingw32-make[1]: Leaving directory 'C:/Users/hasee/Desktop/Qssh-M/lib/src'
mingw32-make: *** [Makefile:43: sub-src-make_first] Error 2

是有什么需要修改的地方吗?
希望大神指点一下!

离线mis.chen

只看该作者 13楼 发表于: 2022-02-10
回 mis.chen 的帖子
mis.chen:
这两个dll是怎么编译出来的?楼主是按这个编译步骤吗:
mkdir $BUILD_DIRECTORY
cd $BUILD_DIRECTORY
qmake $SOURCE_DIRECTORY/qssh.promake (or mingw32-make or nmake depending on your platform)
.......

mis.chen:

这两个dll是怎么编译出来的?楼主是按这个编译步骤吗:
mkdir $BUILD_DIRECTORY
cd $BUILD_DIRECTORY
qmake $SOURCE_DIRECTORY/qssh.promake (or mingw32-make or nmake depending on your platform)
.......

hanson:
我从github下载了src,编译出来两个dll文件,怎么用到我的工程里?

这两个dll是怎么编译出来的?楼主是按这个编译步骤吗:
mkdir $BUILD_DIRECTORY
cd $BUILD_DIRECTORY
qmake $SOURCE_DIRECTORY/qssh.promake (or mingw32-make or nmake depending on your platform)

但是我的为什么我的报错:
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [Makefile.Release:211: ..\..\lib\QSsh.dll] Error 1
mingw32-make[2]: Leaving directory 'C:/Users/hasee/Desktop/Qssh-M/lib/src'
mingw32-make[1]: *** [Makefile:37: release] Error 2
mingw32-make[1]: Leaving directory 'C:/Users/hasee/Desktop/Qssh-M/lib/src'
mingw32-make: *** [Makefile:43: sub-src-make_first] Error 2

都是未定义的引用!是什么原因呀?

./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x23e): undefined reference to `__imp__ZNK14QMessageLogger5debugEPKcz'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x295): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x2d5): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x593): undefined reference to `__imp__ZNK10QByteArray3midEii'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x675): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x68d): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x730): undefined reference to `__imp__ZN16QCoreApplication9translateEPKcS1_S1_i'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x75c): undefined reference to `__imp__ZN10QByteArrayC1EPKci'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x975): undefined reference to `__imp__ZNK10QByteArray4leftEi'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x994): undefined reference to `__imp__ZN10QByteArray6appendERKS_'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0x9da): undefined reference to `__imp__ZN10QByteArray6removeEii'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xb06): undefined reference to `__imp__ZNK10QByteArray4leftEi'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xb25): undefined reference to `__imp__ZN10QByteArray6appendERKS_'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xb6b): undefined reference to `__imp__ZN10QByteArray6removeEii'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xc43): undefined reference to `__imp__ZNK14QMessageLogger5debugEPKcz'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xc5d): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
./release\sshincomingpacket.o:sshincomingpacket.cpp:(.text+0xc7d): undefined reference to `__imp__ZN10QArrayData10deallocateEPS_yy'
等等..........................

是有什么需要修改的地方吗?
希望大佬指点一下!

本帖提到的人: @渡世白玉 @hanson
快速回复
限100 字节
 
上一个 下一个