CentOS修改rm命令的折腾


因为前段时间网线被人给换了,导致我的内网IP变换,因此需要重新设置NFS,结果发现从机上一直挂载不上,然后发现无法ls的目录下设置的data文件夹竟然还存在,因此想要删除它,就直接使用了rm -rf命令,因为ls都能死机,因此想当然就认为没有挂载上,结果删了好多NFS上的内容。

因此今天就想修改一下rm命令,使得以后执行这种操作的时候可以自动进行备份,同时,我不想像绝大多数人一下直接使用变相的mv命令,于是根据网上的方式修改了mv和rm命令。

修改rm命令的shell代码如下所示,我是一个运维菜鸟,shell脚本功底差因此是根据别人的改的。

#! /usr/bin/bash

if [ -f "$1" ]; then
    get_char()
    {
        SAVEDSTTY=`stty -g`
        stty -echo
        stty raw
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -raw
        stty echo
        stty $SAVEDSTTY
    }
    path=/bak/${USER}
    if [ ! -d "/bak/${USER}" ]; then
        mkdir -p /bak/${USER}
        chmod -R a+w /bak/${USER}
    fi
    echo $1 | grep "/" >/dev/null
    if [ "`echo $?`" = "0" ]; then
        cd ${1%/*}
    fi

    datenow=`date +%Y%m%d`
    timenow=`date +%H%M%S`
    /usr/bin/cp -R $1 ${path}/${1##*/}.${datenow}.${timenow}
    echo "Target file\"$1\"
    has been copied to ${path}/${1##*/}.${datenow}${timenow}"
    echo "Now going to "rm $1", Press any key to continue..."
    char=`get_char`
    rm $1
fi

if [ -f "$2" ]; then 
    get_char()
    {
        SAVEDSTTY=`stty -g`
        stty -echo
        stty raw
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -raw
        stty echo
        stty $SAVEDSTTY
    }
    path=/bak/${USER}
    if [ ! -d "/bak/${USER}" ]; then
        mkdir -p /bak/${USER}
        chmod -R a+w /bak/${USER}
    fi
    echo $2 | grep "/" >/dev/null
    if [ "`echo $?`" = "0" ]; then
        cd ${2%/*}
    fi

    datenow=`date +%Y%m%d`
    timenow=`date +%H%M%S`
    /usr/bin/cp -R $2 ${path}/${2##*/}.${datenow}.${timenow}
    echo "Target file\"$2\"
    has been copied to ${path}/${2##*/}.${datenow}${timenow}"
    echo "Now going to "rm $1 $2", Press any key to continue..."
    char=`get_char`
    rm $1 $2
fi

上述的shell代码大家可以在CentOS下直接使用,原本写成函数可以减少许多行,但是对于shell我初来乍到,因此没有贸然改,而且当时用的vim写,复制老方便了,就造成了这种不美观的现象。

代码的基本意思就是在根目录下建立一个bak文件夹,这个文件夹是777权限的,可以方便大家在不使用sudo的时候也能够把要删除的文件和文件夹放入进来,而且会按照使用rm命令的用户名来备份文件。

因为我目前身兼开发和维护,因此对于一些细节没有特别在意,如果在大家都使用的机子上使用这个命令,需要做如下的修改:

  • 建立的文件夹除了/bak文件夹,其他的用户的私人文件夹应该是770权限,防止别人查看和修改你的文件

到了目前的情况,还远不算折腾,上面的代码要进行修改,修改的操作如下:

  1. 删除get_char函数

  2. 把代码中的rm修改为你原来的rm重命名之后的名称

因为get_char函数会让你用任意键继续,如果直接用上面的代码替换,你会发现你再也无法登入了。因此登入的时候好像会调用rm或者mv命令,我当时把rm和mv都换了,导致我现在也不清楚到底是哪个命令导致的问题,使得输入密码正确后也无法登陆成功,直接卡死。黑色Terminal需要你的输入。

第二点主要是因为避免进入无线死循环,一旦没有进行更换,你除非在本地上重启进入单用户模式进行维护,不然就一辈子别想登陆这台机子了。

这里面还有几个问题需要我以后去验证,目前没有时间去做,以后希望可以进行验证和修改。

  • 用户登陆的时候如何使用了rm和mv命令,这个需要我去了解更深入的Linux内核知识才可以

  • 对于rm命令,如何更好地支持多参数和灵活判断参数位置,这个需要shell编程功底

目前只能想到这些,以后再行修改和细化,修改后的代码如果我测试之后OK了,也会再放上来,如果有朋友修改了,也希望可以告诉我,让我这个运维渣渣可以学到更多。

如果文中有错别字,请见谅,Win10半个多月没重启了,卡得不要不要的,打字如放幻灯片。

下面贴上关于mv的shell代码,与rm的代码大同小异,使用的时候要进行的改动也一样。

#! /usr/bin/bash

if [ -f "$2" ]; then 
    get_char()
    {
        SAVEDSTTY=`stty -g`
        stty -echo
        stty raw
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -raw
        stty echo
        stty $SAVEDSTTY
    }
    path=/bak/${USER}
    if [ ! -d "/bak/${USER}" ]; then
        mkdir -p /bak/${USER}
        chmod -R a+w /bak/${USER}
    fi
    echo $2 | grep "/" >/dev/null
    if [ "`echo $?`" = "0" ]; then
        cd ${2%/*}
    fi
    datenow=`date +%Y%m%d`
    timenow=`date +%H%M%S`
    /usr/bin/cp $2 ${path}/${2##*/}.${datenow}.${timenow}
    echo "Target file\"$2\"
    has been copied to ${path}/${2##*/}.${datenow}${timenow}"
    echo "Now going to "mv $1 $2", Press any key to continue..."
    char=`get_char`
fi
mv $1 $2


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM