心好痛,验证脚本的时候真的不要在实体机上操作 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
plko345
V2EX    Linux

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

  •  
  •   plko345 2018-04-20 17:03:16 +08:00 5475 次点击
    这是一个创建于 2733 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想把一个目录下的所有文件的名称里的某个字符给删掉,刚写好一个功能实验了下,指定了目录,结果没想到脚本去操作指定目录以外的其它目录了,都不知道为什么,还好没用 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! .... 
    24 条回复    2018-04-21 20:18:34 +08:00
    plko345
        1
    plko345  
    OP
       2018-04-20 17:04:11 +08:00
    对了,写的兴起,所以加了点不必要的功能,不要在意
    est
        2
    est  
       2018-04-20 17:09:47 +08:00
    chmod -R 000 /
    lmqdlr
        3
    lmqdlr  
       2018-04-20 17:26:38 +08:00 via Android
    想起来当年 bumblebee 的事故了
    plko345
        4
    plko345  
    OP
       2018-04-20 17:27:35 +08:00
    @lmqdlr 兄弟说出来让我开心下,而且我这个脚本都指定目录了想着没问题的,没想到....
    crazyvv
        5
    crazyvv  
       2018-04-20 17:31:43 +08:00
    请问您是在哪个目录执行的这个脚本?
    Ziya
        6
    Ziya  
       2018-04-20 17:38:03 +08:00
    @plko345 就是那个「 rm -rf /」
    plko345
        7
    plko345  
    OP
       2018-04-20 17:39:49 +08:00
    @crazyvv 我的目标目录是 /home/mh/Document/test 目录,我运行脚本的目录在 /home/mh/Document 目录
    plko345
        8
    plko345  
    OP
       2018-04-20 17:41:00 +08:00
    @crazyvv 这才是最诡异的地方 TAT
    lmqdlr
        9
    lmqdlr  
       2018-04-20 17:56:39 +08:00 via Android
    @plko345 bumblebee 一段脚本多了个空格,把 /usr 干掉了
    yrom
        10
    yrom  
       2018-04-20 18:06:41 +08:00
    你的一个变量拼错了

    cd $wordpath
    delWord $str

    应该是 $workpath

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

    几个小建议:

    - set -ue
    - 加一个 dryrun 模式
    - read 有不少坑,不如从命令行参数传进来
    Azumo
        13
    Azumo  
       2018-04-20 18:19:59 +08:00
    想起刚玩 Linux 时在根目录迭代 sudo rm -rf /
    mentalkiller
        14
    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
        15
    plko345  
    OP
       2018-04-20 18:33:27 +08:00
    @momocraft set -e 我是想基本完成后再加的,read 的只是一时兴起加上去玩玩的,本来就函数里边的功能就完成了,无聊多写了些
    yorks
        16
    yorks  
       2018-04-20 18:33:43 +08:00   1
    @plko345
    cd
    已经回到 家里了。。。
    menghuan
        17
    menghuan  
       2018-04-20 18:34:24 +08:00
    出过类似事故 rm 时候变量未定义就从家目录开始删
    plko345
        18
    plko345  
    OP
       2018-04-20 18:35:57 +08:00
    @momocraft dryrun 模式是什么?
    Arnie97
        19
    Arnie97  
       2018-04-20 18:38:32 +08:00 via Android
    @plko345 测试模式,只打印将要进行的操作列表,不进行任何实际操作
    plko345
        20
    plko345  
    OP
       2018-04-20 18:43:54 +08:00
    @Arnie97 谢谢,请问命令是哪个?从来没有用过
    doubleflower
        21
    doubleflower  
       2018-04-20 19:16:36 +08:00
    写脚本 -e 一定要啊,不然中间操作错了会一路错下去,发生什么事都可能
    afpro
        22
    afpro  
       2018-04-21 11:10:59 +08:00
    PWD 会随着目录变化而变化的 运行一半就已经不是你开始的 PWD=$(pwd)了吧。。。。。。
    plko345
        23
    plko345  
    OP
       2018-04-21 12:11:25 +08:00 via Android
    @afpro 后来运行时也发现了,改过了
    szlszl35622
        24
    szlszl35622  
       2018-04-21 20:18:34 +08:00
    我一般都是在腾讯云的学生鸡上面测试脚本,,
    出错直接重装系统
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2909 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 14:07 PVG 22:07 LAX 07:07 JFK 10:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86