因為前段時間網線被人給換了,導致我的內網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權限,防止別人查看和修改你的文件
到了目前的情況,還遠不算折騰,上面的代碼要進行修改,修改的操作如下:
-
刪除
get_char
函數 -
把代碼中的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