在bash中更新环境variables

我有一个长期运行的脚本,它与AWS有一些工作。

我有另一个脚本,它把AWSauthentication的环境variables,但只有15分钟有效。

现在我不能chnage长时间运行的脚本,所以有什么办法,我可以有cron工作或其他任何东西可以更新在长脚本运行的shell中的环境variables

详细说明:

假设

  • 长时间运行的脚本不能被修改。
  • 长时间运行的脚本将调用可修改的可执行文件(为了举例,假定可执行文件是/usr/local/bin/callable )。
  • 您有权限重命名/usr/local/bin/callable并在该文件路径和名称下创建一个新文件。
  • 长时间运行的脚本以root身份运行,或者/usr/local/bin/callable必须能够使用setuid位设置来执行权限升级。
  • 你需要安装gdb
  • 如果长时间运行的脚本没有以root身份运行,则需要安装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 

程序 (长时间运行的脚本作为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附加到进程上(至少这样做可以避免使用另一个脚本来描述长时间运行的脚本,最坏的情况是需要创建一个setuid二进制来做到这一点)。 但是,您将需要知道或获取长时间运行的脚本shell进程的PID(因为它每次调用都会改变)。 由于同步问题,它也容易失败(crontab触发时脚本可能不运行)。

参考

  • 更改正在运行的进程的环境变量
  • 有没有办法改变另一个进程的环境变量?