我有一个带有动态IP地址的Linux。我想根据当前IP更改bash提示。python脚本负责此连接,并在启动时启动。
os.system('export PS1="\u@'+str(self.ip)+'>"')
该命令已执行,但这不会在python进程的环境块之外进行任何修改:并非所有已登录用户或将来将登录的用户。
当时的想法是为每个用户或/ etc / bashrc更改.bashrc。它将解决新连接的问题,但不能解决打开的问题。
这不会在python进程的环境块之外修改任何内容
它甚至没有做到这一点。它修改了/bin/sh -c "export..."
system()调用的子进程的环境块,并且修改立即丢失-它们也不会“向上”传播到Python进程。(检查os.environ["PS1"]
是否有疑问。实际上,为什么不直接设置os.environ?)
(此外,Bash有一组单独的“ shell变量”。两者之间存在很大的重叠-环境变量是在shell启动时导入的,并且可以将shell变量标记为导出到子环境中-但是关键是,即使您从外部更新Bash的环境块,则实际上不会更新Bash实际使用的shell变量$ PS1。)
也就是说,“从外部”(实际上是唯一的方法)更新流程环境的一个常见技巧是将调试器附加到流程并调用相应的函数来修改环境,如程序本身所示:
$ gdb -p <pid> (gdb) p(int)putenv(“ FOO = bar”) $ 0 = 0 (gdb) p(char *)getenv(“ FOO”) $ 1 = 0x55bb09f61404“ bar”
这实际上将与PS1一起使用,因为Bash带有其自己的getenv()和putenv()实现,从而覆盖了常规的libc版本。该自定义实现实际上并没有更新environ
,而是更新了相应的shell变量。putenv("PS1=foo")
因此,通过调试器进行调用将更新Shell提示符。
坦率地说,这是对实际问题的可怕解决方案。如果希望shell提示符始终显示当前IP地址,只需使提示符本身检查正确的值是什么即可。
Bash允许您包括诸如$ PS1之类的文字扩展,$var
甚至$(cmd)
在$ PS1之内,并且它们会在每次显示提示时进行扩展。例如(请注意\$
被逃脱):
$ PS1="<now=\$(date +%X)> " ↵
<now=03:27:02 PM> ↵
<now=03:27:04 PM> ↵
<now=03:27:07 PM> ↵
<now=03:27:08 PM> ↵
因此,为了将其应用于您的“ IP更新器”脚本,
无需尝试更改所有环境,只需使脚本将IP地址写出到文件中即可(例如,/tmp/current-ip
)。
使用$(< filename)
扩展名,使您的shell提示从该文件中读取:
PS1="@\$(</tmp/current-ip)>"
就是这样。您无需遍历所有环境模块即可–每次下次需要显示提示时,每个shell都会自动重新读取文件。例如:
$ echo 1.1.1.1> / tmp / current-ip↵ $ PS1 =“ @ \ $(</ tmp / current-ip)>”↵ @ 1.1.1.1> ↵ @ 1.1.1.1> echo 22.22.22.22> / tmp / current- ip↵@ 22.22.22.22>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句