linux
  • bash
  • environment-variables
  • setenv
  • shellshock-bash-bug
  • 2014-10-10 123 views 3 likes 
    3

    我需要從C/C++程序在Bash環境中定義Bash函數。在環境中設置Bash函數

    setenv("my_func", "() { echo \"This is my function\";}", 1); 
    

    或者

    putenv("my_func=() { echo \"This is my function\";}"); 
    

    但使用猛砸版:彈震錯誤之前,我可以這樣定義一個函數:

    my_func='() { echo "This is my function";}' 
    

    或從C程序等同與shellshock固定,我不能管理如何在環境中定義我的功能。

    奇怪的是,如果我運行env,我可以看到我的函數在環境中定義,但如果我稱它爲Bash,則它不存在。

    在此先感謝

    +1

    奇怪:人誰知道內部和無證的方式導出函數,不知道用的記錄方式'declare'或'export' ... – jm666 2014-10-10 07:36:58

    +2

    @ jm666,已經知道''export -f'',但我需要從C程序中編程執行。我不知道如何從C程序中將函數定義導出到沒有「putenv」或「setenv」的環境中。感謝您的回答 – JoseLSegura 2014-10-10 07:41:29

    +0

    以便攜的方式做這樣的事情要好得多,在沒有'bash'的環境中,像普通的舊shell,破折號,ksh,zsh等等。因此,您可能希望以@starrify已經告訴您的方式來源他們... – jm666 2014-10-10 07:59:07

    回答

    2

    如果您正在使用execv調用bash(這樣你只調用一次),你可以(使用execl爲了說明的目的)取代:

    execl("/bin/bash", "bash", "file_to_run", "arg1", "arg2", 0); 
    

    execl("/bin/bash", "bash", "-c", "f() {...} g() {...}\n. $0", 
            "file_to_run", "arg1", "arg2", 0); 
    

    然後你不需要用內部bash接口玩遊戲來定義函數。 (如果bash腳本正在運行也需要導出,不管出於什麼原因,只是增加export -f <func>行參數如下-c。該功能)

    這顯然與這兩個補丁打補丁和工作bashes的優勢。

    (我不得不作出類似的補丁各種方案,讓我分擔你的痛苦。)

    6

    僅供參考。由於沒有文檔記錄功能如何導出到環境中,因此您應該將其視爲濫用私人API,並且在將來的bash版本中可能會發生更改。

    函數不再使用環境字符串中的函數名稱導出。看到這一點,運行

    $ my_func() { echo "foo"; } 
    $ export -f my_func 
    $ env | grep -A1 'my_func' 
    BASH_FUNC_my_func%%=() { echo "foo" 
    } 
    

    由於在環境中使用的名字不再是一個有效的bash標識,你就需要使用env命令修改新進程的環境。

    env 'BASH_FUNC_my_func%%=() { echo "This is my function"; }' bash 
    

    從C,你只需要調整名稱。

    setenv("BASH_FUNC_my_func%%", "() { echo \"This is my function\";}", 1); 
    
    +0

    可能是相關的:[通過專門製作的環境變量的Bash代碼注入漏洞](https://access.redhat.com/articles/1200223) – anishsane 2014-10-10 13:54:05

    +0

    從Java中解析整個軟件的工作programa,我不能使用提供的語法來設置函數定義。使用'env'它可以工作。 – 2017-11-20 15:03:32

    相關問題