2016-06-26 103 views
2

我有一個長時間運行的腳本,它可以與AWS一起工作。在bash中更新環境變量

我有另一個腳本,它將環境變量放在AWS身份驗證中,但只有15分鐘有效。

,現在我不能chnage長時間運行的腳本,有沒有什麼辦法,我可以在那裏長時間運行腳本

+0

您可以準備將​​不時更新一個單獨的腳本。長腳本將在更新後立即讀取這個單獨的腳本並更新相關的環境變量。 – GMichael

+0

@GMichael我沒有任何控制長腳本的外部模塊與我不能編輯 – Karl

+1

你不能改變任何內部的運行腳本沒有重新啓動或代碼修改 – GMichael

回答

1

闡述註釋cron作業或其他任何可更新的外殼環境變量:

假設

  • 長時間運行的腳本不能修改。
  • 長時間運行的腳本將調用一個可修改的可執行文件(爲了舉例,假設可執行文件爲/usr/local/bin/callable)。
  • 您有權重命名/usr/local/bin/callable並在該文件路徑和名稱下創建一個新文件。
  • 長時間運行的腳本以root用戶身份運行,或者/usr/local/bin/callable必須能夠使用設置的setuid位執行權限提升。
  • 您需要安裝gdb
  • 如果長時間運行的腳本未以超級用戶身份運行,則需要安裝gcc

風險

  • 如果這是一個關鍵的系統和安全是中度至重大關切,不使用的下列任。
  • 儘管不太可能發生,但是附加到正在運行的進程並向其注入調用可能會導致意外或未定義的行爲。如果這是執行一些關鍵程序的關鍵系統,則請勿使用以下任何程序。
  • 通常,所有這些程序都是壞主意,但它們代表了一種可能的解決方案。但是...
  • 使用需要您自擔風險。

程序(對於長期運行的腳本運行作爲root)

bash# mv /usr/local/bin/callable /usr/local/bin/callable.orig 
bash# cat > /usr/local/bin/callable << EOF 
> #!/bin/bash 
> 
> echo -e "attach ${PPID}\ncall setenv(\"VAR_NAME\", \"some_value\", 1)\ndetach" | /usr/bin/gdb >& /dev/null 
> 
> /usr/local/bin/callable.orig 
> 
> EOF 
bash# chmod 755 /usr/local/bin/callable 

程序(對於長期運行的腳本NOT運行作爲root)

bash# mv /usr/local/bin/callable /usr/local/bin/callable.orig 
bash# cat > /usr/local/bin/callable.c << EOF 
> #include <stdio.h> 
> #include <sys/types.h> 
> #include <unistd.h> 
> #include <stdlib.h> 
> int main(void) { 
> char inject[128]; /* You may want to increase this size, based on your environment variables that will affect the size of the string */ 
> uid_t save_uid = getuid(); 
> gid_t save_gid = getgid(); 
> sprintf(inject, "echo -e \"attach %u\ncall setenv(\\\"VAR_NAME\\\", \\\"some_value\\\", 1)\ndetach\" | /usr/bin/gdb >& /dev/null", getppid()); 
> setreuid(0, 0); 
> setregid(0, 0); 
> system(inject); 
> setregid(save_gid, save_gid); 
> setreuid(save_uid, save_uid); 
> system("/usr/local/bin/callable.orig"); 
> return 0; 
> } 
> EOF 
bash# gcc -o /usr/local/bin/callable /usr/local/bin/callable.c 
bash# rm -f /usr/local/bin/callable.c 
bash# chown root:long_running_script_exclusive_group /usr/local/bin/callable 
bash# chmod 4750 /usr/local/bin/callable 

加成

  • ,而不再截獲的,就可以了,如你所說,用一個cronjob附加到過程與gdb(這將至少是避免你intecept另一個腳本長時間運行的腳本,在最壞的情況下,需要創建一個setuid二進制文件來完成)。但是,您將需要知道或獲取長時間運行的腳本shell進程的PID(因爲它每次調用時都會更改)。由於同步問題,它也容易失敗(crontab觸發時腳本可能不運行)。

參考