plink 、pscp非交互式自动执行相关命令

pscpplink 工具可以用于在Windows上以非交互式的方式进行自动化操作:

  • pscp :用于自动化的传输文件。
  • plink:用于在Windows上远程自动执行Linux命令。

一、plink远程执行Linux命令

1、batch文件中执行Linux 命令

在一些场景下有些 Linux命令操作需要将其放在batch文件中,提供给用户进行一键式自动运行。在batch文件中内容如下:

batch 内容
@echo off
setlocal

set remoteHost=172.16.21.100
set username=Tom
set password=xod123
set linuxCommand="cd /home/Tom/x666 && ls"
set plinkPath="D:/Programs/plink.exe"

%plinkPath% -batch -ssh -l %username% -pw %password% %remoteHost% %linuxCommand%

【注意】:batch脚本中 set命令语法很严格, 变量的等号前后都不能有空格,否则会导致意外的错误,如:
set cmd = "ls" 后面的 %cmd%会无法取值,因为变量后的空格也会被识别为变量的一部分,即%cmd %导致变量无法展开,最终导致脚本无法有效执行。

以上参数说明:

  • 通过 set 设置相关变量的值,以便后续直接使用
  • plink.exe 程序直接通过 ssh 来进行远程执行Linux上的命令行:
    • -batch:可以用来取消出现交互信息,如Access granted. Press Return to begin session.。直接显示远程命令执行的结果。
    • -ssh :使用ssh协议
    • -l:login 表示远程Linux设备的用户名,后接用户名
    • -pw:表示密码信息,后面接用户密码。
    • 最后就是IP地址和需要执行的Linux命令

2、代码中直接远程执行Linux命令行

在Qt 中常见的方式是使用 QProcess 来启动这个进程,去执行远程的命令行

Code
// 调用代码
    QString plinkPath = "D:/Programs/plink.exe";
    QString userName = "Tom";
    QString passWd = "xod123";
    QString host = "172.16.21.100";
    QString cmdRemote = "cd /home/Tom/x666 && ls"; 

    QString cmd = QString("\"%1\" -ssh -l %2 -pw %3 %4 \"%5\"").arg(plinkPath, userName, passWd, host, cmdRemote);

    QString outputMsg;
    bool ret = StartProcess(cmd, outputMsg, "UTF-8");

// 执行函数,参数cmd可以是命令字符串,也可以是以上batch文件的路径
bool StartProcess(const QString& cmd, QString& outputMsg, std::string encode = "UTF-8")
{
    QProcess process;
    process.setProcessChannelMode(QProcess::SeparateChannels);
    process.start(cmd);

    if (!process.waitForFinished(30000))
    {
        outputMsg = "Process timeout.";
        return false;
    }
    
    const QTextCodec* codec = QTextCodec::codecForName(encode.c_str());
    const QString outMsg = codec->toUnicode(process.readAllStandardOutput());
    const QString errMsg = codec->toUnicode(process.readAllStandardError());

    if (errMsg.trimmed().isEmpty())
    {
        outputMsg = outMsg;
        return true;
    }

    outputMsg = errMsg;
    return false;
}

【注意】:
在Linux上执行的命令行,一般是 UTF-8编码,而Windows上一般是gbk编码,所以如果是远程执行Linux上的命令行中有中文字符,需要将其转换成 UTF-8的编码格式才能正常显示,如果执行的 cmd 直接是Windows设备上的命令,则需要设置gbk的编码形式


二、pscp传输文件: pscp.exe [options] [source] [user]@[host]:[destination]

经常用于无需输入密码的自动化执行流程中,执行指令如下:

  • pscp -i [C:\private_key.ppk] [file1.txt] user@remote_host:/home/user/ :使用密匙自动化传输文件。
  • pscp -pw [123456] [file1.txt file2.txt] user@remote_host:/home/user/:使用明文密码的形式进行传输文件,多个文件时,并列在一起

1、以batch脚本的形式进行执行传输

batch
@echo off
setlocal

set pscpPath="D:/pscp.exe"
set password=x012345
set srcFiles="D:/Tmp/file1.txt" "D:/Tmp/Test Files/config.ini" "D:/Tmp/tmp.png"
set userName=ad
set host=172.16.20.196
set destPath="/home/hut/x01"

%pscpPath% -pw %password% %srcFiles% %userName%@%host%:%destPath%

endlocal

在代码中执行的方式与以上的plink一致,将指令先拼接成字符串,传递给 QProgress执行

posted @ 2025-06-27 09:06  Jeffxue  阅读(188)  评论(0)    收藏  举报