心好痛,验证脚本的时候真的不要在实体机上操作

2018-04-20 17:03:16 +08:00
 plko345

想把一个目录下的所有文件的名称里的某个字符给删掉,刚写好一个功能实验了下,指定了目录,结果没想到脚本去操作指定目录以外的其它目录了,都不知道为什么,还好没用 root,要不后果不堪设想,到现在也不知道原因何在

我指定了的目录是 /home/mh/Document/test,结果还把 /home/mh/下其它目录也扫了一遍,但不知道有没有文件被修改,估计是有了,我用的字符是"es",应该比较常见,求大大帮我看看,顺便问问有没有办法反向来一套复原的操作

这是脚本

#!/bin/bash                                                                                                                                                                                   
PWD=$(pwd)
           
# 校正输入 
invalid_input () {
    printf "\e[41m\e[30mInvalid input '$REPLY'\e[0m\n" >&2 
    exit 1 
}          
           
           
# 删除字符串并重命名
delWord () {
    echo del
            
    for i in $(ls);do
        if [ -f $PWD/$i ];then
            rename $str '' $(pwd)/$i
            echo "good job"
        elif [ -d $PWD/$i ];then
            (cd $PWD/$i;delWord)
        fi  
    done   
    printf "\e[42m\e[30mDone!\e[0m\n"
           
}          
            
# 添加字符串并重命名
addWord () {
    echo add
            
}           
            
# 输入文件所在目录
read -p "Enter a path: " workpath
if [[ ! -d $workpath ]];then
    printf "\e[42m\e[31mError: Enter a valid path, try again.\e[0m\n"
    exit 2 
fi          
            
# 输入添加 /删除的字符串
read -p "Enter a String > " str 
# str 中是否含有非法字符
if [[ $str =~ [^_-.[:alnum:]] ]] || [[ $str =~ ^[[:digit:]] ]];then
    invalid_input
fi
 
# 选择添加 /删除操作
read -p "Delete or add a string?(1.del 2.add): "
 
 
if [[ $REPLY -eq 1 ]];then
    set -x
    cd $wordpath
    delWord $str
    set +x
elif [[ $REPLY -eq 2 ]];then
    addWord
else
    invalid_input
fi

这是部分输出结果,太多了只贴一部分,前面有好多终端拉不上去了看不到,也不知道处理了目标目录后它怎么干的,应该重定向到文本里的,唉!

......
+ cd linux
+ delWord
+ echo del
del
++ ls
+ for i in $(ls)
+ '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']'
+ '[' -d /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']'
+ cd x86
+ delWord
+ echo del
del
++ ls
+ for i in $(ls)
+ '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so ']'
+ rename es '' /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so
+ echo 'good job'
good job
+ printf '\e[42m\e[30mDone!\e[0m\n'
Done!
....
5068 次点击
所在节点    Linux
24 条回复
plko345
2018-04-20 17:04:11 +08:00
对了,写的兴起,所以加了点不必要的功能,不要在意
est
2018-04-20 17:09:47 +08:00
chmod -R 000 /
lmqdlr
2018-04-20 17:26:38 +08:00
想起来当年 bumblebee 的事故了
plko345
2018-04-20 17:27:35 +08:00
@lmqdlr 兄弟说出来让我开心下,而且我这个脚本都指定目录了想着没问题的,没想到....
crazyvv
2018-04-20 17:31:43 +08:00
请问您是在哪个目录执行的这个脚本?
Ziya
2018-04-20 17:38:03 +08:00
@plko345 就是那个「 rm -rf /」
plko345
2018-04-20 17:39:49 +08:00
@crazyvv 我的目标目录是 /home/mh/Document/test 目录,我运行脚本的目录在 /home/mh/Document 目录
plko345
2018-04-20 17:41:00 +08:00
@crazyvv 这才是最诡异的地方 TAT
lmqdlr
2018-04-20 17:56:39 +08:00
@plko345 bumblebee 一段脚本多了个空格,把 /usr 干掉了
yrom
2018-04-20 18:06:41 +08:00
你的一个变量拼错了

cd $wordpath
delWord $str

应该是 $workpath

╮(╯_╰)╭
plko345
2018-04-20 18:11:01 +08:00
@yrom 我 X,还真是,谢谢,可是为什么会从家目录开始呢,而不是当前运行脚本的目录,我明明是在 Document 目录下运行的啊
momocraft
2018-04-20 18:12:14 +08:00
有点辣眼睛 没看完

几个小建议:

- set -ue
- 加一个 dryrun 模式
- read 有不少坑,不如从命令行参数传进来
Azumo
2018-04-20 18:19:59 +08:00
想起刚玩 Linux 时在根目录迭代 sudo rm -rf /
mentalkiller
2018-04-20 18:30:55 +08:00
```shell
alias rm=trash

trash(){
t=$(date +%Y%m%d%H%M%S)
mv $@ /path/to/.trash/$@_$t
}
```
plko345
2018-04-20 18:33:27 +08:00
@momocraft set -e 我是想基本完成后再加的,read 的只是一时兴起加上去玩玩的,本来就函数里边的功能就完成了,无聊多写了些
yorks
2018-04-20 18:33:43 +08:00
@plko345
cd
已经回到 家里了。。。
menghuan
2018-04-20 18:34:24 +08:00
出过类似事故 rm 时候变量未定义就从家目录开始删
plko345
2018-04-20 18:35:57 +08:00
@momocraft dryrun 模式是什么?
Arnie97
2018-04-20 18:38:32 +08:00
@plko345 测试模式,只打印将要进行的操作列表,不进行任何实际操作
plko345
2018-04-20 18:43:54 +08:00
@Arnie97 谢谢,请问命令是哪个?从来没有用过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/448508

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX