主機 A 需在程式中遠程控制備機 B:創建目錄、複製文件。程式運行在 A,操作作用於 B。
利用 Shell 管道將交互命令(登錄、輸入密碼、執行操作)流式傳輸給 `telnet` 客戶端:
(sleep 0.5; echo "user"; sleep 1; echo "pass"; sleep 5; echo "cd /path; mkdir -p dir; cp file dir/"; sleep 2) | telnet 10.10.10.10
void DealRemoteFile(void) {
char cmd[1024];
snprintf(cmd, sizeof(cmd)-1,
"(sleep 0.5; echo zhou; sleep 1; echo zhou; sleep 5; "
"echo \"cd /home/zhou/zhouzx/Test; mkdir -p TestFile; cp TestFile.txt ./TestFile;\"; sleep 2) | telnet 10.10.10.10");
system(cmd); // 同步阻塞執行,無法捕獲輸出
}
缺點:無法獲取遠程命令輸出/錯誤信息,難以判斷執行成敗。
void DealRemoteFile(void) {
char cmd[1024], result[1024];
snprintf(cmd, sizeof(cmd)-1, /* 同樣的命令字符串 */);
FILE *fp = popen(cmd, "r"); // 打開管道,以讀模式獲取標準輸出
if (!fp) return;
while (fgets(result, sizeof(result), fp)) {
// 處理每行輸出,如去除換行符、日誌記錄
result[strcspn(result, "\n")] = '\0';
printf("Remote output: %s\n", result);
}
pclose(fp); // 必須配對關閉,回收子進程資源
}
優勢:可讀取遠程命令的標準輸出/錯誤輸出,實現結果驗證與日誌審計。
| 維度 | system() | popen()/pclose() |
|---|---|---|
| 返回值 | Shell 退出碼 | 文件指鉤,可讀輸出流 |
| 同步性 | 阻塞等待 | 阻塞讀取,流結束自動回收 |
| 適用場景 | 無需反饋的火燭忘操作 | 需捕獲輸出、判斷成敗的場景 |
| 底層機制 | fork + exec + wait | fork + pipe + exec,父進程持有管道端 |