在 bash 中运行screen
会清除变量 LD_LIBRARY_PATH。我读了一些资料,似乎这是预期的行为,但我需要绕过它。
解决方法是将 LD_LIBRARY_PATH 声明添加到~/.bashrc
。在我的例子中,LD_LIBRARY_PATH 在启动 shell 和我调用 screen 之间发生了很大变化,所以我需要获取当前的LD_LIBRARY_PATH 的值进入screen
会话。
答案1
screen
不会取消设置环境变量;它会被 Linux 本身删除。
在大多数系统上,/usr/bin/screen
可执行文件与设置组ID位utmp
组,以便能够修改utmp
数据库。它还使用设置组ID控制对套接字目录的访问(/var/run/screen/
)。
在 Linux 上,当设置用户标识(或者设置组ID) 程序运行时,它不会接收某些环境变量(包括LD_LIBRARY_PATH
、其他几个LD_*
变量和HOSTALIASES
),以减少可能的攻击点:否则您可以编写一个小型库并欺骗su
或sudo
以这种方式调用您的“改进”函数。
您可以删除设置组ID位screen
,但您必须让套接字目录可供所有人完全访问(模式 0777)。不过,这不应该是一个安全风险,因为它screen
还会检查附加程序的 UID 本身。
然而,你应该不是使utmp
数据库可全世界写入。
答案2
在您的 中.screenrc
,您可以使用setenv
命令在屏幕的环境中设置一个值。
setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN
这是在 shell 启动前设置的。显然LD_LIBRARY_PATH_SCREEN
需要在启动 screen 前设置。
答案3
尝试export
您感兴趣的环境变量。
export LD_LIBRARY_PATH
答案4
保留LD_LIBRARY_PATH
变量的另一种方法是运行里面的命令,screen
如下所示:
screen -dmLS compile bash -lc "make -j12"