我有一个长期运行的脚本,可以与AWS合作。
我有另一个脚本,它为AWS身份验证设置了环境变量,但只有15分钟有效。
现在我无法完成长时间运行的脚本,所以有什么方法可以让cron job或其他任何可以更新运行长脚本的shell中的环境变量的方法
答案 0 :(得分:1)
阐述评论:
<强>假设强>
/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触发时脚本可能没有运行),它也容易出现故障。<强>参考强>