头文件: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