c-argv vs bash扩展/命令替换/python



如果我的术语有点偏离,我很抱歉,但我正在努力弄清楚为什么一个有效,另一个无效。我有这个程序,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[], char* envp[]){
printf("argc: %dn", argc);
if(argc != 10) {
printf("argc incorrectn");
return 0;
}
if(strcmp(argv[4],"x00")) 
{
printf("argv[4] incorrectn");
return 0;
}
if(strcmp(argv[5],"x20x0ax0d")) 
{
printf("argv[5] incorrectn");
return 0;
};
printf("yesn");    
}

一段时间以来,我一直在尝试使用mix来传递strcmp部分命令和/或进程替换和python,但我搞不清楚如何使其工作,例如

./compartx $(python -c 'print("A " * 4)'; python -c 'print("x00")'; python -c 'print("B " * 5)';)

[我正试图通过argv[4]的第一次检查,更不用说argv[5]了暂时]

我确实看到了警告";命令替换忽略了输入中的nullbyte";。有网络上的许多帖子暗示不可能传递null字节到argv,但我今天早上浏览了bash手册,我成功了使用此参数传递strcmp部分

./compartx {0..2} $'' $' nr' {0..3}

有没有任何方法可以使用python实现同样的事情?

干杯,Sven

尝试在shell命令行中进行插值是没有意义的;而且很可能它无论如何都不能在一个插值中工作!

如果您需要使用Python来生成参数,那么也可以使用Python来运行命令:

import subprocess
subprocess.run([
'./compartx',
'1', '2', '3',
# strcmp will stop at the first null byte, so empty string will do here
'', 
'x20x0ax0d',
'6', '7', '8', '9'
])

运行它,你就会得到

argc: 10
yes

无需发送NUL;只需传递空字符串。strcmp无论如何都停在NUL字节,而C中的空字符串只是NUL;明确地传递一个额外的NUL不会改变行为(它击中第一个并停止(。

相关内容

最新更新