簡體   English   中英

argv vs bash 擴展/命令替換/python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM