我试图在shell中运行任意bash命令,但我只能访问运行/bin/bash -c
的shell购买
无论如何都能运行类似的东西:
/bin/bash -c "export FOO=bar"
然后在原始shell中看到FOO设置?
答案 0 :(得分:3)
没有
这不是特定于shell的 - 没有UNIX进程可以更改父进程的环境变量而没有父进程来表示接口(例如,从stdout读取新的变量/值),或者使用不可靠且不受支持的hackery(比如使用调试器附加到父进程并直接调用setenv()
)。
以ssh-agent
为例:
$ ssh-agent
SSH_AUTH_SOCK=/var/folders/t2/t58p1nwx1g38tkhykqfhvmm80000gn/T//ssh-0HSNi1V5h9wf/agent.17313; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17314; export SSH_AGENT_PID;
echo Agent pid 17314;
...因此,记录下使用的模式类似于:
$ eval "$(ssh-agent)"
在这种情况下,该接口是eval
- 能够使用shell代码;但是,由于这通常用于执行任意命令,因此支持此接口存在安全风险。
因为你的目标是使用shell命令的结果来修改一个完全没有shell语言的程序的环境,因此不支持eval
或{{1这使您能够使用更安全的流格式,例如NUL分隔的流。例如,如果你的shell程序写source
对,key=val\0
字符NUL
,你可以在Python中做类似于以下的事情:
\0
...移植到您选择的语言。从shell写这种格式:
for env_val in s.split('\0'):
if not env_val.contains('='): continue
k, v = env_val.split('=', 1)
environ[k] = v
......就够了。