> tmux new -s test
> OK=test
> export OK
> env | grep OK
OK=test
> [control]+[B],[D]
> grep OK /proc/*/environ
> while read P ; do ps eww -p $P | grep OK; done < <(pgrep bash)
> id
uid=0(root) gid=0(root) groups=0(root)
ご覧のとおり、2つのことを試しましたが、まだ別のセッション(シェルインスタンス)から環境変数を読み取る方法を探しています。 tmuxから何かをエクスポートして実行したときにのみ変数を見ることができます(例:sleep 999)。共有をキャンセルしても効果がないようです。
答え1
シェルの内部を知っているデバッガを接続し、その知識を使ってその情報を抽出する以外は何もできません。
いいえ、getenv("OK")
ほとんどsystem("printenv OK >/this/tty")
のシェルは標準のlibc関数を使用して環境を管理せずに環境のリストをexecve()
。
の環境が/proc/PID/environ
渡されました。スタートプロセスとプロセスが意図的にまたは意図せずに変更された可能性があることを観察します。
たとえば、この(UBトリガ)Cコードは子を「追加」し、呼び出しのタイミングと方法によって子に返されたり渡されたりすることがWTF=help
あり/proc/PID/environ
ます。getenv()
setenv()
putenv()
% cat a.c
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv)
{
memcpy(argv[argc + 1], "WTF=help", 9);
pause();
}
% cc a.c
% ./a.out &
[4] 3445
% tr '\0' '\n' </proc/3170/environ | head -n1
WTF=help