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