簡體   English   中英

更新 Bash 中的環境變量

[英]Updating environment variables in Bash

我有一個長時間運行的腳本,它與 AWS 一起工作。

我有另一個腳本,它為 AWS 身份驗證放置環境變量,但這僅在 15 分鍾內有效。

現在我無法更改長時間運行的腳本,所以有什么方法可以讓我有一個 cron 作業或其他任何可以更新運行長腳本的 shell 中的環境變量的方法嗎?

闡述評論:

假設

  • 無法修改長時間運行的腳本。
  • 長時間運行的腳本將調用一個可以修改的可執行文件(為了示例,假設可執行文件是/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 觸發時腳本可能未運行),它也容易失敗。

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM