[英]argv vs bash expansion/command substitution/python
如果我的術語有點偏離,我預先道歉,但我試圖弄清楚為什么一件事有效,而另一件事卻沒有。 我有這個程序,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[], char* envp[]){
printf("argc: %d\n", argc);
if(argc != 10) {
printf("argc incorrect\n");
return 0;
}
if(strcmp(argv[4],"\x00"))
{
printf("argv[4] incorrect\n");
return 0;
}
if(strcmp(argv[5],"\x20\x0a\x0d"))
{
printf("argv[5] incorrect\n");
return 0;
};
printf("yes\n");
}
我現在一直在嘗試通過混合使用命令和/或進程替換和 python 來傳遞 strcmp 部分,但我不知道如何進行這項工作,例如
./compartx $(python -c 'print("A " * 4)'; python -c 'print("\x00")'; python -c 'print("B " * 5)';)
[我正在嘗試通過對 argv[4] 的第一次檢查,暫時不要在意 argv[5]]
我確實看到警告“命令替換忽略輸入中的空字節”。 網上有很多帖子表明不可能將空字節傳遞給 argv,但我今天早上閱讀了 bash 手冊,並且設法使用此參數傳遞了 strcmp 部分
./compartx {0..2} $'\0' $' \n\r' {0..3}
有沒有辦法使用python實現同樣的事情?
干杯,斯文
嘗試在 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
'',
'\x20\x0a\x0d',
'6', '7', '8', '9'
])
運行它,你會得到
argc: 10
yes
無需發送NUL
; 只需傳遞空字符串。 strcmp
無論如何都會在NUL
字節處停止,而 C 中的空字符串只是一個NUL
; 顯式傳遞額外的NUL
不會改變行為(它命中第一個並停止)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.