2
我有一個長時間運行的腳本,它可以與AWS一起工作。在bash中更新環境變量
我有另一個腳本,它將環境變量放在AWS身份驗證中,但只有15分鐘有效。
,現在我不能chnage長時間運行的腳本,有沒有什麼辦法,我可以在那裏長時間運行腳本
我有一個長時間運行的腳本,它可以與AWS一起工作。在bash中更新環境變量
我有另一個腳本,它將環境變量放在AWS身份驗證中,但只有15分鐘有效。
,現在我不能chnage長時間運行的腳本,有沒有什麼辦法,我可以在那裏長時間運行腳本
闡述註釋cron作業或其他任何可更新的外殼環境變量:
假設
/usr/local/bin/callable
)。/usr/local/bin/callable
並在該文件路徑和名稱下創建一個新文件。/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
加成
gdb
(這將至少是避免你intecept另一個腳本長時間運行的腳本,在最壞的情況下,需要創建一個setuid
二進制文件來完成)。但是,您將需要知道或獲取長時間運行的腳本shell進程的PID(因爲它每次調用時都會更改)。由於同步問題,它也容易失敗(crontab觸發時腳本可能不運行)。參考
您可以準備將不時更新一個單獨的腳本。長腳本將在更新後立即讀取這個單獨的腳本並更新相關的環境變量。 – GMichael
@GMichael我沒有任何控制長腳本的外部模塊與我不能編輯 – Karl
你不能改變任何內部的運行腳本沒有重新啓動或代碼修改 – GMichael