plink.exe 3次
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
int main() {
SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
HANDLE hChildStd_IN_Rd, hChildStd_IN_Wr;
HANDLE hChildStd_OUT_Rd, hChildStd_OUT_Wr;
// 创建标准输出管道(plink -> parent)
CreatePipe(&hChildStd_OUT_Rd, &hChildStd_OUT_Wr, &sa, 0);
SetHandleInformation(hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0);
// 创建标准输入管道(parent -> plink)
CreatePipe(&hChildStd_IN_Rd, &hChildStd_IN_Wr, &sa, 0);
SetHandleInformation(hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0);
STARTUPINFOA si = { 0 };
si.cb = sizeof(STARTUPINFOA);
si.hStdInput = hChildStd_IN_Rd;
si.hStdOutput = hChildStd_OUT_Wr;
si.hStdError = hChildStd_OUT_Wr;
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi = { 0 };
char cmdLine[] = "D:\\plink.exe -ssh root@172.21.36.208 -pw Dis1234568888 -batch";
if (!CreateProcessA(NULL, cmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
printf("CreateProcess failed. Error: %d\n", GetLastError());
return -1;
}
// 等待连接稳定
Sleep(1000);
const char* commands[] = { "ls /tmp", "ls /root", "ls /home" };
const int commandCount = sizeof(commands) / sizeof(commands[0]);
for (int i = 0; i < commandCount; ++i) {
// 写入命令
DWORD written;
WriteFile(hChildStd_IN_Wr, commands[i], (DWORD)strlen(commands[i]), &written, NULL);
WriteFile(hChildStd_IN_Wr, "\n", 1, &written, NULL);
FlushFileBuffers(hChildStd_IN_Wr);
printf("\n===== Result for: %s =====\n", commands[i]);
// 非阻塞读取命令输出
char buffer[4096] = { 0 };
DWORD totalBytesRead = 0;
int waitCount = 0;
while (waitCount++ < 50) { // 最多等 50*100ms = 5 秒
DWORD bytesAvailable = 0;
if (!PeekNamedPipe(hChildStd_OUT_Rd, NULL, 0, NULL, &bytesAvailable, NULL)) {
printf("PeekNamedPipe failed.\n");
break;
}
if (bytesAvailable > 0) {
DWORD bytesRead = 0;
if (ReadFile(hChildStd_OUT_Rd, buffer + totalBytesRead, sizeof(buffer) - totalBytesRead - 1, &bytesRead, NULL)) {
totalBytesRead += bytesRead;
Sleep(100); // 稍等确保命令完整返回
}
}
else {
Sleep(100);
}
}
buffer[totalBytesRead] = '\0';
printf("%s\n", buffer);
}
// 清理
CloseHandle(hChildStd_IN_Wr);
CloseHandle(hChildStd_IN_Rd);
CloseHandle(hChildStd_OUT_Wr);
CloseHandle(hChildStd_OUT_Rd);
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
浙公网安备 33010602011771号