我正在寻找一种方法来消除某些安装程序的不良行为,这些安装程序会附加代码以.bashrc
自动强制加载其环境。这个问题出现过几次,主要是在 Conda 上,在某些情况下,用户最终会遇到帐户损坏而无法再登录的情况。
我尝试在 .bashrc 末尾添加一个未关闭的此处文档,如下所示:
# .bashrc
#...
: <<'__END__'
它有效,但会生成解析错误并发出恼人的警告。
什么是一个干净的方法来做到这一点(不使 .bashrc 只读)?
答案1
如果你结束你.bashrc
的
return 0
重击将忽略之后添加的任何行,因为.bashrc
像源脚本一样处理:
return
也可用于终止使用.
(source
) 内置函数执行的脚本的执行,返回n或脚本内执行的最后一个命令的退出状态作为脚本的退出状态。
(exit 0
导致 shell 退出,这不是您想要的。)
答案2
虽然 Stephen 的技巧确实有效,但这里的根本问题是安装程序以允许其修改您的.bashrc
.如果这样做,它可能会对其他事物进行各种不需要的更改,这些更改可能会导致交互中断或完全恶意(从故意发送的回拨间谍软件到来自供应链妥协或内部威胁的彻底恶意软件)。
正确的解决方案是不要以任何权限运行“安装程序”。相反,您可以在一次性容器或用户帐户中运行它们,然后仅将所需的文件从“暂存”环境复制到您想要使用它们的环境中。我使用我编写的工具执行类似的操作,乌桑德,它用于unshare
创建新用户并挂载命名空间,阻止网络访问以及对当前目录及其下所有内容之外的文件的写入访问。虽然目前还不是很灵活,但可以应用许多相同的概念来完成适合您特定工作流程的操作。
答案3
使用return
可以防止执行额外的内容,但它不能防止文件随着时间的推移被所有垃圾填满。它还会产生一个问题,即您不小心在下面添加了一些内容,return
并且必须弄清楚为什么您的更改没有生效。
我之前所做的就是在末尾添加一行,例如# END_ACTUAL_CONTENT
.我创建了一个脚本,可以找到该标记并删除其后面的所有内容,并将该脚本设置为定期运行。
您还可以使用这样的功能来消除那些烦人的安装程序:
function bashrc_save() { cp -f ~/.bashrc ~/.bashrc.backup }
function bashrc_restore() { mv -f ~/.bashrc.backup ~/.bashrc }
安装您的程序,bashrc_save; ./install.sh; bashrc_restore
它对您的文件所做的任何更改.bashrc
都将自动回滚。
我目前更进一步。我将我的.bashrc
文件(以及一堆其他配置文件)存储在一个单独的目录中~/.configfiles
,并创建指向这些文件通常所在位置的符号链接。该文件夹的内容位于 git 存储库中。我这样做是为了使系统之间的同步变得容易,但它还有一个额外的好处,即能够用来git diff
查看安装程序所做的所有更改,并用来git restore
批量恢复它们。