因为前段时间网线被人给换了,导致我的内网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