2016-06-26 104 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触发时脚本可能不运行)。

参考