我有一个长期运行的脚本,它与AWS有一些工作。
我有另一个脚本,它把AWSauthentication的环境variables,但只有15分钟有效。
现在我不能chnage长时间运行的脚本,所以有什么办法,我可以有cron工作或其他任何东西可以更新在长脚本运行的shell中的环境variables
详细说明:
假设
/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
程序 (长时间运行的脚本不作为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
附加到进程上(至少这样做可以避免使用另一个脚本来描述长时间运行的脚本,最坏的情况是需要创建一个setuid
二进制来做到这一点)。 但是,您将需要知道或获取长时间运行的脚本shell进程的PID(因为它每次调用都会改变)。 由于同步问题,它也容易失败(crontab触发时脚本可能不运行)。 参考