Tôi muốn sử dụng lệnh hệ thống/ống để thực thi lệnh với các ký tự đặc biệt. Dưới đây là mã mẫu. Sau khi thực hiện lệnh thông qua hệ thống/ống, nó sẽ thay đổi lệnh bằng cách thay đổi các ký tự đặc biệt. Tôi rất ngạc nhiên khi thấy lệnh hệ thống đang thay đổi văn bản được truyền dưới dạng lệnh.
chạy(char *cmd)
{
TẬP TIN *trong;
TẬP TIN bên ngoài *popen();
char buff[2048]= {0,};
if(!(in = popen(cmd, "r")))
{
exit(1);
}
while(fgets(buff, sizeof(buff), in)!=NULL)
{
printf("%s", buff);
}
pclose(trong);
}
chủ yếu()
{
char cmd[2048]={0,};
sprintf(cmd,"echo \"'http://1.2.3.4/files-spaces-specialchars-
ascii/%23@%23@@!@!@!@%23%23$$$$$$$ASA(()
(!FreemakeAudioConverterSetup.exe'\" >>/tmp/logger 2>&1");
printf("đây là CMD:[%s]\n",cmd);
system("echo "" > /tmp/logger"); /* để xóa nội dung tệp */
hệ thống (cmd);
chạy(cmd);
}
输出
[thiết bị đầu cuối]$ ./a.out
đây là CMD:[echo "'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23$$$$$$$ASA(() (!FreemakeAudioConverterSetup.exe'" >>/tmp/logger 2>&1]
[thiết bị đầu cuối]$ cat /tmp/logger
'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23538853885388(()(!FreemakeAudioConverterSetup.exe'
'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23538953895389(()(!FreemakeAudioConverterSetup.exe'
[thiết bị đầu cuối]$
Như được hiển thị ở trên, URL lệnh ban đầu đã thay đổi sau khi thực thi thông qua lệnh hệ thống/đường ống.
Bất kỳ ý kiến từ các nhà phát triển?
Sửa mã để nó biên dịch rõ ràng:
Lưu ý: Tôi cũng đã thêm cặp lỗi()
gọi, vậy nếu popen()
Nếu cuộc gọi không thành công, người dùng sẽ được thông báo chính xác về những gì đã xảy ra.
#include
#include
void run(char *cmd)
{
TẬP TIN *trong;
TẬP TIN bên ngoài *popen();
char buff[2048]= {'\0'};
if(!(in = popen(cmd, "r")))
{
perror("popen đọc thất bại" );
exit(1);
}
while(fgets(buff, sizeof(buff), in)!=NULL)
{
printf("%s", buff);
}
pclose(trong);
}
int chính(void)
{
char cmd[2048]={'\0'};
sprintf(cmd, "%s", "echo \"'http://1.2.3.4/files-spaces-specialchars-"
"ascii/%23@%23@@!@!@!@%23%23$$$$$$$ASA(()"
"(!FreemakeAudioConverterSetup.exe'\" >>/tmp/logger 2>&1");
printf("đây là CMD:[%s]\n",cmd);
system("echo "" > /tmp/logger"); /* để xóa nội dung tệp */
hệ thống (cmd);
chạy(cmd);
}
Sau đó chạy mã này sẽ tạo ra:
đây là CMD:[echo "'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23%23$$$$$$$ASA( ()(!FreemakeAudioConverterSetup.exe'" >>/tmp/logger 2>&1]
và con mèo /tmp/logger
kết quả:
mèo/tmp/logger
'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23%23193951939519395(()(!FreemakeAudioConverterSetup.exe'
'http://1.2.3.4/files-spaces-specialchars-ascii/%23@%23@@!@!@!@%23%23193961939619396(()(!FreemakeAudioConverterSetup.exe'
Tôi là một lập trình viên xuất sắc, rất giỏi!