AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 910226
Accepted
Ravexina
Ravexina
Asked: 2017-04-30 07:44:27 +0800 CST2017-04-30 07:44:27 +0800 CST 2017-04-30 07:44:27 +0800 CST

禁止妥协的别名和函数;别名 cd='rm -rf ~'

  • 772

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

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 中运行的命令,我们可以简单地关闭并重新打开终端,但是在启动文件中设置的命令呢,我们无法在每次运行终端时检查文件或别名/函数列表.

command-line
  • 2 2 个回答
  • 2080 Views

2 个回答

  • Voted
  1. Best Answer
    Ravexina
    2017-04-30T07:44:27+08:002017-04-30T07:44:27+08:00

    介绍

    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
  2. waltinator
    2017-04-30T09:43:00+08:002017-04-30T09:43:00+08:00

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

    试图变得足够聪明以从不良做法中恢复以前从未奏效。

    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve