Linux下如何用OpenSSL命令批量加密文件?代码异常求助
问题:OpenSSL批量加密命令生成混乱,仅第一条正常
我想在Linux系统中用OpenSSL命令批量加密文件,因为没编程经验,选择直接生成命令而非写加密逻辑。写了一段C++代码读取文件列表生成加密命令,但实际输出混乱,只有第一条命令正常。
我的代码
#include <fstream> #include <string> #include <cstdio> using namespace std; ifstream Data("/home/kali/Desktop/filelist.txt"); // txt文件里是待加密的文件路径 string cmd = "openssl aes-256-cbc -in "; string files; // 存储从filelist.txt读取的文件路径 string outarg = " -out "; string outfile = "/home/kali/Desktop/Testdir/test.enc"; // 加密后的文件都叫test.enc(OpenSSL会自动重命名避免覆盖) string key = " -pass pass:testkey"; int main() { while (getline(Data, files)) // 读取待加密文件列表 { cmd += files += outarg += outfile += key += "\n"; // 拼接所有内容 } printf(cmd.c_str()); // 原本打算换成system()执行命令 }
预期输出
openssl aes-256-cbc -in /home/kali/Desktop/Testdir/Passwords.txt -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey openssl aes-256-cbc -in /home/kali/Desktop/Testdir/Images.zip -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey openssl aes-256-cbc -in /home/kali/Desktop/Testdir/Documents.docx -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey
实际输出(仅第一条正常,其余混乱)
openssl aes-256-cbc -in /home/kali/Desktop/Testdir/Passwords.txt -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey /home/kali/Desktop/Testdir/src/Images.zip -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey /home/kali/Desktop/Testdir/test.enc -pass pass:testkey -pass pass:testkey /home/kali/Desktop/Testdir/src/Documents.docx -out /home/kali/Desktop/Testdir/test.enc -pass pass:testkey /home/kali/Desktop/Testdir/test.enc -pass pass:testkey -pass pass:testkey
解决方案
问题根源
你的代码错误在于每次循环都在修改原始字符串变量:
- 第一次循环后,
cmd已经变成了完整的第一条命令;files也被修改成了文件名 + outarg + outfile + key + 换行 - 后续循环中,
getline读取新文件名到files时,会覆盖一部分,但之前拼接的多余内容已经留在cmd里,导致后续命令拼接完全混乱。
修正后的代码
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream Data("/home/kali/Desktop/filelist.txt"); // 把固定不变的部分设为常量,避免被意外修改 const string CMD_PREFIX = "openssl aes-256-cbc -in "; const string OUT_ARG = " -out "; const string OUT_FILE = "/home/kali/Desktop/Testdir/test.enc"; const string PASS_KEY = " -pass pass:testkey"; string file_path; while (getline(Data, file_path)) { // 每次循环重新构建完整命令,保证每个命令都是独立的 string full_command = CMD_PREFIX + file_path + OUT_ARG + OUT_FILE + PASS_KEY; cout << full_command << endl; // 如果要直接执行命令,替换成下面这行: // system(full_command.c_str()); } return 0; }
关键修正点
- 将固定的命令前缀、参数定义为
const常量,防止被意外修改; - 每次循环读取文件名后,重新拼接完整的命令字符串,而不是在原有字符串上追加;
- 直接在循环内输出/执行命令,不需要把所有命令都存到一个字符串里,既避免混乱,也节省内存。
内容的提问来源于stack exchange,提问作者urbanc cladr
相关产品推荐
相关产品推荐

