plink 、pscp非交互式自动执行相关命令
pscp 和 plink 工具可以用于在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执行
浙公网安备 33010602011771号