假设某人坐在我的笔记本电脑后面一秒钟并运行:
alias cd='Ha Ha, Got You :))'
或者我们运行一个未知的软件/脚本/等等,它会将一些内容附加到~/.bashrc
. 例如:
alias sort='rm -rf ~'
这些只是示例aliases
;如您所知,这些事情也可以使用函数来完成:
cd(){ echo "Removing everything you've got :D"; }
这些情况只是假想的例子,考虑任何类似的事情。
那么小脚本怎么样?
sudo -n ls &>/dev/null
if [ "$?" -eq "0" ]
then
sudo "Some dangerous command"
else
cd $1
fi
然后alias cd="/home/user/.config/gtk/.cd.sh"
。
对于已经在 bash 中运行的命令,我们可以简单地关闭并重新打开终端,但是对于那些已经在启动文件中设置的命令,我们无法在每次运行终端时检查文件或别名/函数列表。
答案1
介绍
Bash 配置文件
Bash 有一堆配置(又名启动)文件,它使用这些文件为每个用户设置特定的环境。
其中一些文件位于/etc
,其中一个我知道的是/etc/profile
,它是一个全局配置文件,其设置将应用于所有会话,另一个是/etc/bash.bashrc
;我们不需要绕过这些文件,因为它们的位置已经受到保护,只有 root 才有权编辑它们。
一个非常重要且能给我们很大帮助的目录是:/etc/skel
;每当您创建具有主目录的新用户时,此目录中的文件将用作新用户主目录的骨架。
ls -a /etc/skel
.bash_logout .bashrc .profile
我们还可以用来dpkg
查找这些文件:
$ dpkg -L bash | grep etc
/etc/skel/.bashrc
/etc/skel/.bash_logout
/etc/skel/.profile
/etc/bash.bashrc
我们可以看到,这些都是由 安装的bash
。
bash 中的工作原理
可以在这些文件中的任何一个中设置别名或函数,所以让我们看看这些文件将如何使用bash
。
来自bash
手册页:
当 bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找
~/.bash_profile
、~/.bash_login
和~/.profile
,然后从第一个存在且可读的文件中读取并执行命令。
因此顺序是:~/.bash_profile > ~/.bash_login > ~/.profile
当登录 shell 退出时,bash 会从文件 ~/.bash_logout 读取并执行命令(如果存在)。
每次我们退出登录 shell 时都会运行这个程序,我看不出这个程序会对我们的情况产生什么影响。
当启动非登录 shell 的交互式 shell 时,bash 会从 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令(如果这些文件存在)。
因此最重要的文件是~/.bashrc
,因为我们运行的几乎 90% 的 bash shell 都处于交互和无登录模式。如果我们查看这个文件,我们可以看到它会查找另一个名为的文件~/.bash_aliases
,如果它能够找到它,那么它也会查找source
该文件。
开始处理这些文件
首先,我们应该转到~/.profile
,~/.bash_profile
否则,如果我们保护文件就无关紧要了~/.profile
,有人可以创建一个~/.bash_profile
,它将覆盖我们的配置,所以:
mv ~/.profile ~/.bash_profile
此后,如果您不使用~/.bash_aliases
文件,则创建它,再次像上面一样,某人可以简单地创建此文件,并且他/她有可能可以在其中更改或添加别名。
touch ~/.bash_aliases
最后使用chattr
来保护这些文件免遭编辑和删除。
来自chattr
手册页:
具有“i”属性的文件无法修改:无法删除或重命名,无法创建指向此文件的链接,也无法向此文件写入任何数据。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性。
sudo chattr +i ~/.bash_profile ~/.bashrc ~/.bash_aliases
我们完成了,不要忘记,无论何时你想要编辑这些文件,你应该先删除该-i
属性。
无需关闭/重新打开终端即可重置所有内容
另一个解决方法是创建一个文件:
sudo touch /usr/local/bin/reload_aliases
把你的别名放在那里:
unalias -a
alias x='...'
alias b='...'
确保没有人可以写入该文件:
sudo chmod a=r,x /usr/local/bin/reload_aliases
现在每次你想要重新加载所有内容时请运行:
/usr/local/bin/reload_aliases
回滚
如果你改变主意了:
sudo chattr -i ~/.bash_profile ~/.bashrc ~/.bash_aliases
mv ~/.bash_profile ~/.profile
rm ~/.bash_aliases # if you don't use it
答案2
如果你做了一些愚蠢的事情(不锁定屏幕就走开、盲目运行来自不受信任来源的未经检查的脚本等),你将得到糟糕的结果。
试图变得足够聪明来从不良做法中恢复过来从来没有奏效过。