不允许危及安全的别名和函数;别名 cd='rm -rf ~'

不允许危及安全的别名和函数;别名 cd='rm -rf ~'

假设某人坐在我的笔记本电脑后面一秒钟并运行:

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

如果你做了一些愚蠢的事情(不锁定屏幕就走开、盲目运行来自不受信任来源的未经检查的脚本等),你将得到糟糕的结果。

试图变得足够聪明来从不良做法中恢复过来从来没有奏效过。

相关内容