QT开发中文网

给我封装一个类,名称为CSSHPROCESS,类的作用为实现SSH与远程机器交互,在调用这个类创建实例时会传入三个参数:远程主机的用户名,主机地址,登录密码。创建实例时函数内部会使用QProcess将这几个参数作为QStringList传入连接远程机器的脚本中并运行连接,接下来的操作命令都是在使用ssh和expect与远程主机连接之后进行交互。要操作的的方法函数有: 1.复制文件,传入本地文件路径和远程机器文件路径 2.删除文件,传入参数为要删除的远程文件的路径 3.备份文件,对远程机器文...

头文件:csshprocess.h

#ifndef CSSHPROCESS_H
#define CSSHPROCESS_H

#include <QObject>
#include <QProcess>

class CSSHProcess : public QObject
{
    Q_OBJECT
public:
    explicit CSSHProcess(QString username, QString host, QString password, QObject *parent = nullptr);

    QStringList copyFile(QString localFilePath, QString remoteFilePath); // 复制文件
    QStringList deleteFile(QString remoteFilePath); // 删除文件
    QStringList backupFile(QString filePath, QString backupPath); // 备份文件
    QStringList listDir(QString remoteFilePath); // 打印目录
    QStringList exit(); // 断开连接

signals:

public slots:

private:
    QString m_username;
    QString m_host;
    QString m_password;
    QProcess m_process;
};

#endif // CSSHPROCESS_H

源文件:csshprocess.cpp

#include "csshprocess.h"

CSSHProcess::CSSHProcess(QString username, QString host, QString password, QObject *parent) : QObject(parent),
    m_username(username),
    m_host(host),
    m_password(password)
{
    QStringList args;
    args << "-l" << m_username << m_host;

    m_process.start("ssh", args);
    m_process.waitForStarted();

    m_process.write(m_password.toUtf8() + "\n");
    m_process.waitForBytesWritten();
    m_process.waitForReadyRead();
    m_process.closeWriteChannel();

    m_process.waitForFinished();
}

QStringList CSSHProcess::copyFile(QString localFilePath, QString remoteFilePath)
{
    QStringList result;

    QString command = QString("scp %1 %2@%3:%4").arg(localFilePath).arg(m_username).arg(m_host).arg(remoteFilePath);

    m_process.start(command);
    m_process.waitForStarted();
    m_process.waitForFinished();

    result << m_process.readAllStandardOutput().trimmed();
    result << m_process.readAllStandardError().trimmed();

    return result;
}

QStringList CSSHProcess::deleteFile(QString remoteFilePath)
{
    QStringList result;

    QString command = QString("ssh %1@%2 \"rm -f %3\"").arg(m_username).arg(m_host).arg(remoteFilePath);

    m_process.start(command);
    m_process.waitForStarted();
    m_process.waitForFinished();

    result << m_process.readAllStandardOutput().trimmed();
    result << m_process.readAllStandardError().trimmed();

    return result;
}

QStringList CSSHProcess::backupFile(QString filePath, QString backupPath)
{
    QStringList result;

    QString command = QString("ssh %1@%2 \"cp %3 %4\"").arg(m_username).arg(m_host).arg(filePath).arg(backupPath);

    m_process.start(command);
    m_process.waitForStarted();
    m_process.waitForFinished();

    result << m_process.readAllStandardOutput().trimmed();
    result << m_process.readAllStandardError().trimmed();

    return result;
}

QStringList CSSHProcess::listDir(QString remoteFilePath)
{
    QStringList result;

    QString command = QString("ssh %1@%2 \"ls -l %3\"").arg(m_username).arg(m_host).arg(remoteFilePath);

    m_process.start(command);
    m_process.waitForStarted();
    m_process.waitForFinished();

    result << m_process.readAllStandardOutput().trimmed();
    result << m_process.readAllStandardError().trimmed();

    return result;
}

QStringList CSSHProcess::exit()
{
    QStringList result;

    m_process.start("exit");
    m_process.waitForStarted();
    m_process.waitForFinished();

    result << m_process.readAllStandardOutput().trimmed();
    result << m_process.readAllStandardError().trimmed();

    return result;
}

脚本文件:connect.sh

#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]

spawn ssh $username@$host
expect {
    "(yes/no)?"
    {
        send "yes\n"
        expect "*assword:" { send "$password\n"}
    }
    "*assword:"
    {
        send "$password\n"
    }
}
interact

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://qt.0voice.com/?id=26

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?