抽取自IDEA开发 ,现在主要是分三个方面:Linux命令,Shell,Vim和其他技巧
因为Linux的实践点也很多,后续会把文本三剑客也拆出来补充。。
0x00.前言
日后再说,有兴趣可先补一下Linux历史… 只是建议需要在win下与linux交互,建议cmder+xshell/ftp (而不是裸git-bash或裸scp,搭配使用)
更新: WSL2 + 最新的Terminal 似乎也还不错, 但是目前还只是尝鲜阶段 ,等正式release再看看吧…
0x01.常用命令
切换用户.正常安全环境是不允许直接登录root用户的.但是很多操作需要root权限.那么常见用户权限切换授予. 首先说一下
su user与su - user与sudo su - user.第三个比较少见以前. 简单说主要差别是:- su user是输入user的passwd,如果写的su root 或者裸su ,等于输入root用户的passwd. 用户环境不变
- su - user 等价于 su -l user,是省略了l的写法,会把用户环境完全切换过去.
- sudo su - user 不管你切换哪个user,输入的都是root的密码,带有root权限? (待确认)
crontab 是linux常用定时任务的命令. 注意它源自希腊语,所以不是读
crontable(至少我目前没有看到这种全名说法.) 任务分用户级,本质是/var/spool/cron文件 ;系统级别/etc/cron.d(命令是用户级)然后最简单的说,它由有六个
*+command组成. 由外到内依次是分:时:日:月:星期,取值范围跟生活一致. 不过星期为什么是从0~7呢,因为0跟7都是Sunday… 如图所示:直接
crontab -e就可以直接进入编辑添加,crontab -l查看.简单理解了之后就看实际的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#1.每天凌晨4点7分执行xx目录下的shell
7 4 * * * /bin/sh backup.sh
#2.两个时间点如何写呢?
0 7,17 * * * /usr/shell/script.sh
#3.如果所有全是*代表每分钟执行一次. 而不是每秒.
* * * * * /root/script.sh
#4.每周六执行sh
0 17 * * 6 /scripts/script.sh
#5.每天凌晨3点执行一个shell,然后把输出日志打印到xx.log
0 3 * * * /bin/sh backup.sh > /tmp/xx.log
#6.如果需要每N分钟,或者每N天执行一次呢? 比如每50分钟执行一次,使用`/`
#但是要注意, 每N天执行一次并不能直接设置,因为那是月为单位的..
*/50 * * * * /bin/sh backup.sh > /tmp/xx.log
#7.每天执行一次,其他的每N天执行无法直接实现.
0 0 * * *scp命令分发文件.
1
2
3
4
5
6
7
8#发送单个文件到某个ip:本机文件地址 目标主机:目标地址,-p可指定ssh端口
scp ~/Downloads/janus.zip jin@10.130.22.4:/home/jin
#发送文件夹
scp -r images hack@whoami.jin.com:/home/hack
#每次都需要手动输入密码会非常蛋疼,常用的配RSA,建议小文件xftp直接走sftp
scp -i rsafile #可省netstat查看网络(cent7改为新的net命令了).
1
2
3
4
5
6
7
8
9#1.查看端口使用
#有个简单的做法是采用lsof命令 -i:port 查看端口占用
$ lsof -i:80 #注意需要有足够权限,普通用户是看不到root的80口使用的进程的.
#netstat在win上个linux上是稍有差别的.注意
$ netstat -anp |grep 80 #参数含义需要注意
# -t / -u 代表只列出tcp/udp连接
# -n 是因为默认netstat会通过IP反向解析域名,降低速度.一般不需要可去掉
# -p 获取进程ID等信息kill命令(传入的数字对应不同信号量
-9常见)注意: 常见情况下直接
kill pid就行了,不需要带-9,因为这类似于正常关机和强制关机的区别. 很多进程在接受到退出的请求后是有自己的完整退出流程的. 直接强行杀死可能有隐患.hadoop的一些命令技巧: (完整详细参考见新的文章)
1
2
3
4
5
6
7
8#有时候访问路径需要使用hadoop源文件地址.
$ hadoop fs -ls remotePath #访问非本机hadoop文件地址可能需要/path/to/hadoop绝对路径
#可以用于测试文件夹是否存储,要想看到输出结果可以执行完后`echo $?` ,成功0,否则1
$hadoop fs -test -d filePath
#统计文件大小. 注意有些缩写命令提示已过时,就不推荐再合一起写了
$hadoop fs -dus -h filePath重定向相关(搭配nohup)
- 我们执行一个shell或py,一般需要把输出重定向到另一个日志文件
sh xx.sh > xx.log这里>是覆盖输出,如果想追加用>>即可. 然后在末尾补上2>&1.这是什么意思呢?简单说就是把错误重定向到标准输出. (这里1,2是文件描述符,>是重定向,&是指前一个操作采用后面相同的方式…不是and) - 有时候看到重定向到
/dev/null目录,这个目录相当于linux的黑洞空间,等于说把日志都到后台不记录不显示 - 使用
nohup command和直接使用command &的区别是什么? 参考阮一峰-Linux守护进程 ,简单说nohup是为了避免程序停止(no hang up-不挂起,本身并没有后台运行功能)
- 我们执行一个shell或py,一般需要把输出重定向到另一个日志文件
wget / curl 请求网络资源
这两个命令放一起是因为部分功能可以重叠,curl也可以下载文件
1
2
3
4#这个应对有些提示"文件名过长"的下载有效,多出现于系统语言是中文...
wget -O fileName url
wget -b url #后台下载, 通过tailf wget-log可以查看进度du & df 查看文件或磁盘大小占用命令
1
2
3
4
5
6#查看整个系统磁盘占用
df -h
#单纯查看某个文件夹的大小
du -sh direct
#查看整个文件夹及其子目录大小并显示总和(常用)
du -hc direct进程运行切换到后台
1
2
3
4
5
6
7
8
9
10
11
12
13
14#1.执行命令的时候末尾带 &
sh xx.sh &
#2.执行任务的时候,让进程n后台:有两种办法
#2.1先ctrl+z 暂停程序(显示Stopped)
bg 1 #任务到后台第一个,注意这个1不是pid(后续就继续给数字) 等同于%1
fg 1 #让进程1切换到前台
#2.2
#3.查看后台进程
jobs -l #你会发现之前的shell被自动在尾部加上了 & ,l一般可以不加
#4.杀死任务就不需要查看进程号了
kill -9 %1 #杀死第一个后台任务find查找文件(
whereis,locate,which)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#注意: 绝大部分情况-->优先使用locate命令, 速度快N倍 !!
#find本质就是全遍历,速度是最慢的,但是可靠性和功能是最全的.
#1.全盘查找.txt
find / -name "*.txt"
#2.1常见需求,删除xx天前的xx类型文件,比如log/png/mp3
find $path -mtime +5 -name "*.log" -exec rm -f {} \; #默认的{} \;是标准写法..注意
#2.2如果是想删除分钟级别的.只需要把mtime换为mmin即可.
find /tmp/logs -mmin 60 -name "*.png" -exec rm -f {} \;
#全盘某个文件. 这个用的也很多.不过由于Linux下查找命令比较多,注意区分使用场景
#3.如果是查1天以上数据优先使用locate,本质是建了一个文件索引数据库(/var/lib/locatedb),查起来快很多
$ locate xx.jar #可以用updatedb命令更新db,近似于find -name. (推荐优先用)
#4. which本质是从系统环境变量去查可执行文件. whereis是查某个程序所有位置(二进制,源码等)
$ which nginx # whereis nginxtar(tape archive)跟xzip命令(打包+压缩)
首先基本概念要知道,tar全名中的archive
[ˈɑrˌkaɪv]是归档的意思(别读错了), 所谓压缩一般说的是”打包+压缩”两个过程. 所以对应才会有不少参数命令写法,关于压缩相关底层,详见我单独的文章1
2
3
4
5
6
7
8
9
10
11
12
13
14#把a.txt文件gzip压缩为x.tar.gz(注意名字只是为了区分,并不是说强制要求,所以.tgz也很正常)
$ tar zcvf newFile.tar.gz oldFile # 带-也行. -c是create的意思
#后面出现了bzip2,xz等更好压缩比的算法. 如下是bzip2压缩包
$ tar jcvf newFile.tar.bz oldFile #我一般就简写 xx.tbz了,压缩比高,但速度慢gzip 3倍+
#单纯查询xx.tgz压缩包文件内容
$ tar ztvf xx.tgz # -t 是list的意思, -v verbose (冗长) 这个不太理解
#gzip解压xx.tgz包 和 bzip2解压
$ tar zxvf xx.tgz -C dir # -x是extract的意思. 记全称才能更清晰. (man可以查看)
$ tar jxvf xx.tbz -C dir # -j等同--bzip2 , 同理-z 是--gzip. 本地目录-C可省
#7z的性能非常好(多核利用),且开源. 但是linux一般没自带. bzip2和xz要用建议下多线程版本lsof(list open files)命令(分析进程/文件占用)
因为Unix下一切皆文件的哲学,这个命令其实是很强大的. (建议root权限执行)
通过文件可以访问数据/网络连接,甚至是各种硬件. 不管是TCP/UDP, 本质OS都给这个进程分配了一个fd(file descriptor) ,无论这个文件用途如何, fd都提供了进程与os之间交互的通用接口. 所以通过lsof 查看fd的详细信息对排查许多本质问题有很大帮助.
1
2
3#lsof 可以直接使用. 一般常跟具体文件路径
#查看9000端口的占用
lsof -i:9000ln (link files)命令 (软链)
需要注意的是,从原理上理解&区分软链/硬链和快捷方式/符号连接的区别是很有必要的, 并且需要先搞清楚inode这个东西. 关于这部分参考单独的存储文章
1
2
3
4
5
6
7
8
9
10
11#最常用的语法
ln -s filePath newPath
#例如常用的脚本
ln -s software/tinkerpop3.3/apache-xxx/bin/gremlin.sh start-gremlin
#注意:
#1.软链与原文件有不同的inode. 简单可以理解为指向真实文件的指针.
#2.与win上的快捷方式是很类似的,但是并不等同.(理解上可以这样记),特别是win上文件夹的快捷方式实际包含了部分文件.而非单纯指向.
#3.软链大小始终为5?
#4.删除软链的时候不要轻易TAB
rm linkName #是不同于rm linkName/ 的chown和chmod和chgrp(改变权限)
1
2
3
4
5
6
7#常见的权限ch三人组,全名是change + owner/mode/group,这样记忆和区分.
#chmod用的最多,比如改变文件的不同组权限
chmod +x file
chmod 755 file
#常用递归的改变文件夹所属用户
chown -R user:user dirNamemail(邮件)命令
1
2
3
4
5
6
7#首先需要配置邮件服务器,这个这不说了. 最常用的方法如下
$ mail -s "Title A" sendAddr@test.com #回车后输入正文,ctrl+D结束发送.
#上面这个是需要手动输入正文的,如果想命令输入.简单的做法使用管道
echo "正文如下: XXX" | mail -s "Title B" sendAddr@test.com
#很多时候,我们需要高效一点使用mail 发送一些错误信息或者路径提示,甚至需要有个表格格式化,那还这么echo么? 待补...df(disk free) & du(usage)磁盘命令
1
2
3
4
5#若易输错,记全称单词.du常用统计文件/文件夹大小
$ du -csh dirName #默认是显示所有.
#
$ df -h
0x02.Shell开发
shell里面有一些比较常见的就是调用各种命令然后进行遍历/判断处理,那么首先需要了解常见的命令(包括常见文本处理的sed,awk,grep). 先说基本命令的操作,以及shell的一些特殊之处(这些会影响代码阅读).
8.9更新: Shell这一块也抽取为单独文章, 见此
0x03.Vim使用
完全入门可以先看看Linux中文社区翻译的入门文章, 这里只列最常用的快捷键,以及需要时可以快速查询的链接.快捷键多记就熟了,不需要特意去学.
A. 常用键
复制粘贴删除
- 复制当前行到下一行yy p
- 多行复制..(shell): 在复制开始的首行光标 nyy p
- 复制当前单词不带空格
ye,带空格是yw建议少用..容易出问题 (和ctrl+w对应.) - dd 删掉当前行, ctrl+w删除当前词语 (常用)
查找替换 (常用,重点)
1
2
3
4
5
6
7
8
9
10
11#查找字符串,/ ?有多种方式,区别待补充,n上一个,N下一个
?str
#1.替换全文中所有str1为str2,替换当前行我觉得没什么好说的...就是不带任何参数,实际用不多
:%s/str1/str2/g
#2.替换全文中所有str1为str2,但是需要逐个确认,这时候也可以选择全文替换.
:%s/str1/str2/gc # √推荐√
#3.如果我要替换的字符里本身就有'/','\','<'这种特殊字符.需要这样做 '\/path\/to' --> 等价于/path/to
#就是每个特殊符号前转义一下,默认区分大小写,不区分加上i. 关键看看整词组替换.避免很多时候太多误判
:%s/\/path\/to/str2/gc位置跳转
- G :跳转到文尾
- gg :调到文件头 (还可以
:1)
撤退,前进: u 和ctrl+r
有个核心问题,如何回滚历史以防误操作没发现的蛋疼问题?
B. 困惑点
1. 意外进入了帮助模式
在 vim 任何模式下, 按 F1 都会进入帮助模式, 这个模式会自动分屏两半, 且停止输入, 需要手动 :q 退出, 新手可能会误按后懵掉, 尤其是不小心设置 F1 自动触发的时候.
2. Q和q的烦恼
:q 作为vim中最常用的键, 就导致 q 字符会被经常使用, 但是 Q 和 q 或者 q: q? q/ 这些都会触发不同的效果, 新手很容易进入特殊模式, 然后感到很费解. 其实只要稍微清楚一下在做什么, 刻意注意一下就好:
- 普通模式按
Q进入了Ex模式, 这个基本被抛弃了, 你直接输visual退出就好 - 普通模式按
q进入了记录模式(record), 这类似一个键位记录重放, 入门无需使用,:q退出就行. q:和其他两, 包括使用ctrl + f, 都是列出vim的历史记录, 执行复用执行, 同样:q可退出
总之这几个 q 相关的奇怪界面, 你只要自己了解尝试一次, 就不会陌生了, 然后注意别误按 q 就好
3. 奇怪的上滚模式
在命令模式下输入 a, c, i 任一字符然后回车, 都会进入蛋疼的 ex 输入模式, 你无需管其他, 在某行开头打一个 . 号, 然后回车退出就行, 这个如果不清楚的确非常难受…但是误入几率低
0x04.文本三剑客
1.文本查找grep:(参考文档)
1 | #1.常用grep -E,后可跟正则表达式, -o表示只输出匹配到的部分.常用于文件内容查找 |
2.文本分析awk:(参考文档)
1 | #awk是文本三剑客里面相对用到最少的? 那么什么是文本分析呢? |
3.文本编辑sed:(参考文档)
sed全名stream editor, 是一种流式编辑器,侧重正则. 非常高效 geek, 先用最基本的就很强大了.. vim 替换很多也就是 sed 的语法.
要特别注意, sed -i 的就地重置, 本质是一次重新的读写 rename , 不管它是否匹配到字符, 都会创建一个新的文件. 千万慎重使用sed -i "xx" *.txt 这样的写法, 会导致你所有txt文件的时间全部置为当前时间.
1 | # 0. sed -i 操作前, 一定要先备份!!! |
后续待更新拆分,主要是新东西太多,得分轻重缓急。。
0x05.其他技巧
1. Linux中参数加/不加 - 和 -- 区别
首先常见有几种写法: (比如)
1 | #1.查看gcc版本 |
首先你可以自己敲敲试试,会发现上面1,2 效果也是不同的. 第一和第三个并非我们容易理解的单纯缩写和省略的区别, 而是 System V(five) 和BSD/GNU 的风格区别.先简单说一下历史:
- SystemV 和 BSD是同一个Lab(AT&T)的两个小组, 其中SystemV演变为Unix的商业标准,BSD则是开源派Unix代表
- Linux沿用着Unix的架构体系,准确说Linus只开发了内核部分. 我们使用的各种软件多来自GNU & GPL两个经典开源组织. 所以我们经常在Linux中用非内核程序命令,就可能会遇到
--x的现象了. - 内核启动最后会调用init程序,而它执行就有对应有两种风格: SystemV中init调用
/etc/inittab,而BSD下调用/etc/rc,虽然目的相同, 但是不同的使用方法可能会有版权问题. - 参数前
-的是SystemV 风格. 参数前不带-的是BSD风格. (如果软件同时兼容这两个风格就能随意用) - 有不少软件,比如
gcc,单独也给SystemV风格适配了一下 (个人猜测) 所以也有输出,但和BSD稍有不同,最好的查看方法就是通过man命令去看看完整文档, 也方便清楚缩写的意思.
简单说了下历史原因,再来看看其他考虑和不同:
- 有些GUN程序功能复杂,需要的参数不能通过简单的52个大小写字母(缩写)表示.
- 全称单词易于理解
- 在GUN风格风格下, 选项参数可以直接
--sort=age这样传入. (也可空格,但是System V的 -s 是不行的) - 很多命令大部分都能直接
-x执行, 但是帮助参数需要--help而不能-h,这个原因我暂时不确定,可能是习惯?
参考文章:
- 各种blog–估计很多摘自鸟哥 或
- 开源英文文档…(而且很多还写的有点问题,就不一一列了)
- Linux中文社区-新手Vim上路
- Vim初学者常见问题
