Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
有很多同学微信问我,Linux命令这么多,该怎么从入门到精通?其实,这个事情非常的simple,这篇文章将会带你飞。文章非常的长,要挑一个阳光明媚的sunshine weekend,耐心去搞定。
本文将由一个Linux命令概览开始,说明Linux命令的方方面面。如果你读完这部分还是一头雾水,那么就证明需要按照下面的小白教程去学习了,内容涵盖了:如何挑选Linux发行版、如何安装Linux系统,按照主题学习Linux系统的命令等。
入门后的 **学习方式:多敲多打,用条件反射替代大脑记忆--如果你将来或者现在要用它来吃饭的话。**其中,也有一些难啃的骨头,关注小姐姐味道微信公众号,我们一起用锋利的牙齿,来把它嚼碎。
这部分是给稍微有点Linux经验的同学准备的,如果你是初学者,请跳过此part直接进入第二部分。
工作中,最常打交道的就是对目录和文件的操作。linux提供了相应的命令去操作他,并将这些命令抽象、缩写。
可能是这些命令太常用了,多打一个字符都是罪过。所以它们都很短,不用阿拉伯数字,一个剪刀手就能数过来。
看命令。
mkdir 创建目录 make dircp 拷贝文件 copymv 移动文件 moverm 删除文件 remove
例子:
# 创建目录和父目录a,b,c,d
mkdir -p a/b/c/d
# 拷贝文件夹a到/tmp目录
cp -rvf a/ /tmp/
# 移动文件a到/tmp目录,并重命名为b
mv -vf a /tmp/b
# 删除机器上的所有文件
rm -rvf /
linux上是黑漆漆的命令行,依然要面临人生三问:我是谁?我在哪?我要去何方?
ls
命令能够看到当前目录的所有内容。ls -l
能够看到更多信息,判断你是谁。pwd
命令能够看到当前终端所在的目录。告诉你你在哪。cd
假如你去错了地方,cd命令能够切换到对的目录。find
find命令通过筛选一些条件,能够找到已经被遗忘的文件。
至于要去何方,可能就是主宰者的意志了。
这是是非常非常加分的技能。get到之后,也能节省更多时间来研究面向对象。小姐姐味道已经输出了“最常用的vim、sed、awk技巧系列”。
cat
最常用的就是cat
命令了,注意,如果文件很大的话,cat命令的输出结果会疯狂在终端上输出,可以多次按ctrl+c
终止。
# 查看文件大小
du -h file
# 查看文件内容
cat file
less
既然cat有这个问题,针对比较大的文件,我们就可以使用less
命令打开某个文件。类似vim,less可以在输入/
后进入查找模式,然后按n
(N)向下(上)查找。
有许多操作,都和vim类似,你可以类比看下。
tail
大多数做服务端开发的同学,都了解这么命令。比如,查看nginx的滚动日志。
tail -f access.log
tail命令可以静态的查看某个文件的最后n行,与之对应的,head命令查看文件头n行。但head没有滚动功能,就像尾巴是往外长的,不会反着往里长。
tail -n100 access.log
head -n100 access.log
sort和uniq经常配对使用。sort可以使用-t
指定分隔符,使用-k
指定要排序的列。
下面这个命令输出nginx日志的ip和每个ip的pv,pv最高的前10
# 2019-06-26T10:01:57+08:00|nginx001.server.ops.pro.dc|100.116.222.80|10.31.150.232:41021|0.014|0.011|0.000|200|200|273|-|/visit|sign=91CD1988CE8B313B8A0454A4BBE930DF|-|-|http|POST|112.4.238.213
awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10
grep
grep用来对内容进行过滤,带上--color
参数,可以在支持的终端可以打印彩色,参数n
则输出具体的行数,用来快速定位。
比如:查看nginx日志中的POST请求。
grep -rn --color POST access.log
推荐每次都使用这样的参数。
如果我想要看某个异常前后相关的内容,就可以使用ABC参数。它们是几个单词的缩写,经常被使用。A after 内容后n行B before 内容前n行C count? 内容前后n行
就像是这样:
grep -rn --color Exception -A10 -B2 error.log
diff
diff命令用来比较两个文件是否的差异。当然,在ide中都提供了这个功能,diff只是命令行下的原始折衷。对了,diff和patch还是一些平台源码的打补丁方式,你要是不用,就pass吧。
为了减小传输文件的大小,一般都开启压缩。linux下常见的压缩文件有tar、bzip2、zip、rar等,7z这种用的相对较少。
.tar 使用tar命令压缩或解压
.bz2 使用bzip2命令操作
.gz 使用gzip命令操作
.zip 使用unzip命令解压
.rar 使用unrar命令解压
最常用的就是.tar.gz
文件格式了。其实是经过了tar打包后,再使用gzip压缩。
创建压缩文件
tar cvfz archive.tar.gz dir/
解压
tar xvfz. archive.tar.gz
快去弄清楚它们的关系吧。
开机是按一下启动按钮,关机总不至于是长按启动按钮吧。对了,是shutdown命令,不过一般也没权限-.-!。passwd命令可以用来修改密码,这个权限还是可以有的。
mount
mount命令可以挂在一些外接设备,比如u盘,比如iso,比如刚申请的ssd。可以放心的看小电影了。
mount /dev/sdb1 /xiaodianying
chownchown
用来改变文件的所属用户和所属组。chmod
用来改变文件的访问权限。
这两个命令,都和linux的文件权限777有关。
示例:
# 毁灭性的命令
chmod 000 -R /
# 修改a目录的用户和组为 xjj
chown -R xjj:xjj a
# 给a.sh文件增加执行权限(这个太常用了)
chmod a+x a.sh
yum
假定你用的是centos,则包管理工具就是yum。如果你的系统没有wget命令,就可以使用如下命令进行安装。
yum install wget -y
systemctl
当然,centos管理后台服务也有一些套路。service
命令就是。systemctl
兼容了service
命令,我们看一下怎么重启mysql服务。 推荐用下面这个。
service mysql restart
systemctl restart mysqld
对于普通的进程,就要使用kill命令进行更加详细的控制了。kill命令有很多信号,如果你在用kill -9
,你一定想要了解kill -15
以及kill -3
的区别和用途。
su
su用来切换用户。比如你现在是root,想要用xjj用户做一些勾当,就可以使用su切换。
su xjj
su - xjj
-
可以让你干净纯洁的降临另一个账号,不出意外,推荐。
登陆一台linux机器,有些命令能够帮助你快速找到问题。这些命令涵盖内存、cpu、网络、io、磁盘等。
unameuname命令可以输出当前的内核信息,让你了解到用的是什么机器。
uname -a
ps
ps命令能够看到进程/线程状态。和top有些内容重叠,常用。
# 找到java进程
ps -ef|grep java
top系统状态一览,主要查看。cpu load负载、cpu占用率。使用内存或者cpu最高的一些进程。下面这个命令可以查看某个进程中的线程状态。
top -H -p pid
free
top也能看内存,但不友好,free是专门用来查看内存的。包括物理内存和虚拟内存swap。
df
df命令用来查看系统中磁盘的使用量,用来查看磁盘是否已经到达上限。参数h
可以以友好的方式进行展示。
df -h
ifconfig
查看ip地址,不啰嗦,替代品是ip addr
命令。
ping
至于网络通不通,可以使用ping来探测。(不包括那些禁ping的网站)
netstat虽然ss命令可以替代netstat了,但现实中netstat仍然用的更广泛一些。比如,查看当前的所有tcp连接。
netstat -ant
此命令,在找一些本地起了什么端口
之类的问题上,作用很大。
还有一些在工作中经常会用到的命令,它们的出现频率是非常高的 ,都是些熟面孔。
export
很多安装了jdk的同学找不到java命令,export
就可以帮你办到它。export用来设定一些环境变量,env命令能看到当前系统中所有的环境变量。比如,下面设置的就是jdk的。
export PATH=$PATH:/home/xjj/jdk/bin
有时候,你想要知道所执行命令的具体路径。那么就可以使用whereis命令,我是假定了你装了多个版本的jdk。
crontab
这就是linux本地的job工具。不是分布式的,你要不是运维,就不要用了。比如,每10分钟提醒喝茶上厕所。
*/10 * * * * /home/xjj/wc10min
datedate命令用来输出当前的系统时间,可以使用-s参数指定输出格式。但设置时间涉及到设置硬件,所以有另外一个命令叫做hwclock
。
xargsxargs读取输入源,然后逐行处理。这个命令非常有用。举个栗子,删除目录中的所有class文件。
find . | grep .class$ | xargs rm -rvf
#把所有的rmvb文件拷贝到目录
ls *.rmvb | xargs -n1 -i cp {} /mount/xiaodianying
linux是一个多作业的网络操作系统,所以网络命令有很多很多。工作中,最常和这些打交道。
ssh
这个,就不啰嗦了。你一定希望了解ssh隧道
是什么。你要是想要详细的输出过程,记得加参数-v
。
scp
scp用来进行文件传输。也可以用来传输目录。也有更高级的sftp
命令。
scp a.txt 192.168.0.12:/tmp/a.txt
scp -r a_dir 192.168.0.12:/tmp/
wget
你想要在服务器上安装jdk,不会先在本地下载下来,然后使用scp传到服务器上吧(有时候不得不这样)。wget命令可以让你直接使用命令行下载文件,并支持断点续传。
wget -c http://oracle.fuck/jdk2019.bin
mysql
mysql应用广泛,并不是每个人都有条件用上navicat
的。你需要了解mysql的连接方式和基本的操作,在异常情况下才能游刃有余。
mysql -u root -p -h 192.168.1.2
不要觉得复杂,命令是有限的,但激情无限;都会也不要骄傲,一个vim就够折腾一辈子。捷径就是总结,深入只有探索。白马过隙,终会行云流水,手到擒来。
物是人非,年华易老。唯有时光,不会辜负。
和Linux比较像的还有Unix,但如果你是一个二三十岁的小青年,你接触到可能只有Linux的世界了。从手机,到服务器上广泛使用的centos
,到漂亮的桌面发行版ubuntu
,甚至是风靡全球的树莓派
,到处都是linux的身影。
知道一点相关操作系统的历史,是能够陶冶情操的。GNU/Linux
是为了抵制一些商业公司的垄断行为而发展起来的,凝结了一代互联网人向往自由的心血。
和其他Unix比起来,Linux其实很年轻。直到1991年,一个叫Linus Torvalds
的芬兰年轻人才开始开发我们现在所知道的Linux内核
。
Linux
的吉祥物是企鹅,这个吉祥物直到1996年才确定,所以你会经常看到一些搞笑的图片。如果你是90后,那这只小企鹅几乎和你一般大,还是个年轻的小伙。
Linux的发展历程比较的复杂。经过一次次的过关斩将,Linux走到今天确属不易。关于其发展历史,你可以通过下面的链接,查看高清图片。20年的时间,对软件行业来说,是一段非常漫长的时光,有多少的风光已经物是人非。
高清见图片(http://1t.click/aUnx) 。可以看到,linux只占了那可怜的一小块。这就像人类的出现,在生命的长河中,微不足道,但却是一个质的飞跃。
你可能注意到,在前面的描述中,说的是GUN/Linux
,而不仅仅是Linux
。Linux本身只是一个内核,作用有限,只有和GNU
联合起来,拥有完整的生态才会发挥它的作用。
谈到上面区别的原因,是为了记住Richard Stallman
在1983年发起的GNU
计划。他同时是smalltalk
语言的发明者,被公认的第二个面向对象的语言。我在早些年,还研究过一段时间。哦,他还编写了一个巨无霸编辑器,Emacs
。
只有一个人被捧成神,他才会有能量折磨你。
针对于Linux历史,我们不做过多介绍。下面介绍几个经典的发行版本。
现在的Linux发行版本,已经有上千个,你要是喜欢、而且多金,你也可以做一个。如何在这其中,找到最合适的版本,是需要经过一番折腾的。很多发行版本,其实是很小众的。
这不像是哲学领域的某些东西,真理掌握在少数人手中。只有获得良好发展,并得到认可的Linux发行版,才有它的价值,可以说是彻头彻尾的实用主义。
但这东西又像女朋友,刚开始感觉风采迥异,各有千秋,到最后了解到是一样的庸俗不堪。但有人就是喜欢Linux相关的工作,一干就是一辈子...
我可以先说一下自己的历程。刚开始,接触的是红帽redhat
,当时还没有分什么企业版。用了一段时间以后,又切换成更稳定的slackware
。但是slackware上的程序更新实在太慢了,于是又切换成readhat血统的fedora
,这个版本的软件保鲜度很高。其间,又尝试了其他几个linux版本,最终,在2013年前后,换成了滚动升级的archlinux
,直到现在。
要我个人做个推荐的话:
1、个人用户(技术),桌面版用ubuntu
=>archlinux
。
2、企业用户,服务器,使用centos
。
这么多Linux版本,其实有两条主线。debian
系列和redhat
系列。很多发行版本,其实是二次翻新,很多就直接拿这两个基础系列进行改造。正所谓:操作系统千千万,都是帽子和大便。
下面这个屎一样的图表,就是debian。呃呃呃,和大便只差一个字母。
Debian计划
是一个致力于创建一个自由操作系统的合作组织。它的特点是:稳定、安全,到现在为止,已经发展了20多年了。我们所熟悉的ubuntu,就是基于debian改进的。
红帽是一家商业公司,涉足Linux比较早,现在对个人提供一些红帽认证
之类的证书。现在云主机使用较多的centos,包括红帽公司的RHEL
,占据了大部分服务器市场。近期,centos 8
推出了centos stream
滚动版本,看起来更像是一个正常的操作系统。
我们看一下处于不同层次的几个典型版本。从应用方面来说,linux有桌面、服务器、研究用等用途。
ubuntu的出现,对Linux的推广有不可磨灭的贡献。它是一个易于安装的桌面版本(也有服务器版本),界面非常漂亮。ubuntu是基于debian系统的unstable分支修改的,包管理软件是apt-get
。
它的创建者是Mark Shuttleworth
,南非企业家,世界上第二名自资的太空游客。我想,无论是太空还是ubuntu,这都是梦想吧。
centos是目前最流行的服务器版本。它是RHEL源代码再编译的产物,主要是为了绕开一些法律问题。在包管理,甚至稳定性上,与红帽企业版没什么差别。
archlinux采用滚动升级
的模式进行发行,尽全力提供最新的稳定版本。刚开始安装,arch只提供一个基本的系统,甚至连界面都没有,对初学者不是很友好。
但是,archlinux是非常干净的系统。很多软件,只有你需要的时候才会安装。它的软件和理念通常都是最新的,定制化非常强,深得许多Linux爱好者的喜爱。
上面的archlinux,提供了编译后的软件包。用户在安装软件时,只需要下载、解压即可。gentoo将这个过程更近一步,可以说更加的变态。它下载的是软件的源代码,然后在本地进行编译,然后安装。
这通常非常的蛋疼,因为下载、编译会花费非常长的时间,但它有一个非常大的优点,就是稳定。
这个系统比较底层,对技能要求更多,不太推荐。
LFS的全拼是“linux from scratch”,意思是从零构建一个linux系统。它有一个非常详细的安装文档,教你怎样编译内核,编译引导程序,编译和配置必要的软件。
这是一个疯狂而必要的过程。如果你想要自己的Linux之上更上层楼,跟着文档做一遍是受益无穷的。你需要经过多次交叉编译,最终使用chroot命令切换到新系统进行后续操作。
想做一个自己的发行版么?从这开始吧。
kali linux是一个非常专业的发行版。如果你在做渗透方面的工作,将是一个非常好的选择。
发行版的安装包非常大,包含了常见的破解工具,渗透工具,攻击工具。这非常的危险,我曾用它暴力破解了非常多的wifi密码,成功的窥视了邻居的隐私。还是非常好用的。
工欲善其事,必先利其器。你可能会想到买一台云主机练练手,但那毕竟要花点银子,我们可以自己安装一个。我们在上面提到,目前使用最广泛的,就是centos
。不论你是自建机房,还是使用类似于阿里云这样的云端环境,大多数都会提供centos
的安装。
你可能会找到多种安装虚拟机的方式。本小节,将使用虚拟双网卡
的方式,准备一个纯洁的环境。这一小节,图片很多。
以阿里云为例,默认第一位就是CentOS,提供了从7.6版本到旧版本的多个镜像。
下面的文章,我们就以CentOS 7
稳定版本为基础环境。centos很流行,所以镜像也有很多。国内,我们从上海交大下载,速度应该会快一些。
http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
如果交大哪天不维护了。可以从这里找:
http://centos.mirror.ndchost.com/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
为了让大家学到更多的知识,我们使用最小化
的系统ISO。最小化的iso不到1GB
,而预装了很多软件的dvd有4.3GB
的大小。我们就用这个减肥版。
要想快速学习、体验Linux,最便捷的方式,就是使用虚拟机进行安装。目前,最流行的虚拟机,一个是VMware
,一个是VirtualBox
。在MacOS上还有一个Parallels Desktop
。
其中,VirtualBox免费而且跨平台,能够满足我们的需求。接下来,将一步步引导你进行安装。
(1) 点击新建,开启安装旅程。
(2) 填写名称,版本。然后点击继续。
(3)按照你的机器配置,选择内存
我的机器是8GB内存的,就分配给虚拟机2GB,这个已经足够用了。
(4) 创建一个虚拟磁盘
点击继续后,将弹出一个对话框。我们不用多管,一直点继续,知道对话框消失。这非常的粗暴。
(5) 接下来,点击设置。
(6) 切换到Storage选项,选择我们下载的iso
(7) 点击启动,开始安装。
使用方向键切换,使得高亮聚焦在Install CentOS 7
上。点击确定,开始安装。
(8) 弹出一个安装界面
接下来的步骤有点多,如果我们没有特别的介绍,那么直接continue就ok了。
(9) 接下来,配置磁盘分区
依然保持默认,并按按钮Done
退出。
(10) 配置用户
linux上默认的用户名为root
。接下来我们设置root用户的密码为123456
。由于这是一个弱密码,所以需要点击两次确定退出。
(11) 等待安装完毕,进行重启
(12) 安装成功
这个时候,我们安装的虚拟机,还不能联网,无法把自己的意念传达出去。由于我们没有对虚拟机进行任何设置,所以使用的是默认的NAT
模式。
将光标聚焦到命令行窗口,然后输入命令dhclient
。等待几秒钟,执行ping baidu.com
测试以下网络,可以看到能够正常访问网络了。
上面黑漆漆的窗口,就是我们现在的Linux界面。有人觉得很丑,就像是在玩dos,但像我这种不可救药的人,却觉得格外的亲切。
接下来的命令,我们不会再截图,而使用高亮的代码块表示。为了不至于让人晕头转向,请先看下图。
由于NAT
模式的特点,我们的虚拟机能够访问外网,但无法被外部发现。酒香竟怕巷子深。为了解决这个问题,我们需要再添加一块网卡。
在做这些更改之前,需要首先关闭虚拟机。可以强制关闭机器,也可以在命令行中输入:
shutdown -h now
虚拟机关闭后,再次点击设置,切换到网络适配器选项卡。如图,添加一个新的网络适配器,适配器类型为Host-only Adapter
。通过这块网卡,我们的宿主机就能够访问它了。
再次启动虚拟机,执行dhclient
命令后,执行ip addr
查看主机的ip地址。可以看到,我们现在有两块网卡,两个ip地址。
记录下192打头的网络地址,我们会使用外部的程序,比如XShell
、SecureCRT
等,进行连接。比如,我这里的ip地址是:192.168.99.100
。不废话,看图。
小提示:关于虚拟网卡的网段,如果有差异。你可以在全局设置里,改成和我一样的。
你可能已经体验到,通过虚拟机自带的命令行界面进行输入,局限性非常大。通过远程连接,可以把终端界面切换到我们熟悉的操作模式,如果能够显示彩色的终端,那再好不过了。下面介绍几个工具,一般的,使用xshell的居多。
Windows
XShell
你可能在公司内,见过你的SRE同事,运指如飞,命令字符如流水一般撒过屏幕。即使非常繁杂,难以记忆的密码,也能瞬间输入。他可能用的就是xshell。
SecureCRT
比较老的一款产品,使用也较多。
MobaXterm
MobaXterm就是一单文件纯绿色软件,下载过来exe包直接运行即可,不需要任何的安装过程。
它们都有免费版和专业版之分。无力购买的话,就找找破解版。但是注意,盗版汉化的ssh客户端,有些别有用心的人会在软件中植入木马,窃取你的密码、证书,这种情况已经发生过很多次。
MacOS
对于macos用户来说,简单的很。直接使用iTerm,输入命令行即可。比如使用下面的命令连接我们的机器。
ssh [email protected]
Linux
唔,你都已经是Linux环境了,还折腾个啥虚拟机呢?直接用吧。
推荐使用XShell、SecureCRT、iTerm等工具,通过ssh进行远程连接。对于一些命令拷贝、验证来说,要方便快捷的多。
万事开头难。面对黑漆漆的Linux窗口,要勇敢的走出第一步。不要怕输错了什么,系统健壮的很。命令行通常会拥有比图形界面更高的效率,更加重要的是它可以做自动化之类的小工具,这使得生产力产生质的飞跃。
现在,你已经安装好了centos,并远程连接上了它。我们拥有了它,但并不能了解它的脾气。接下来,让我们进入Linux命令行的世界。和我签订契约吧,少年。
本小节会使用非常详细的演进方式,来看一下一个命令,是怎样生成和执行的。
好啦,我们现在就在终端里了。什么叫做终端呢?你在很多黑客电影里,看到的黑漆漆的界面就是,它提供了一个可以输入字符串的交互式界面,至于那些闪光的、扫描机一样的东西,是不存在的。
尝试输入些什么吧。 比如:jdsjf
。
[root@localhost ~]# jdsjf
-bash: jdsjf: command not found
我们再次把这张图贴一下。怎么回事?命令的输出翻译成中文,就是“找不到命令”的意思。什么叫命令?就是我们上面随便输入的字符串jdsjf
。
然后,我们看下提示中其他一些有用的东西。
↓↓↓↓↓↓
bash 代表的是我们所使用的shell
,shell可以认为是一个解释器,将我们的输入解释成一系列可执行的指令。现在的linux发行版,最流行的就是bash解释器,几乎每个都预装了它。
命令找不到,证明我们的字符串bash解释不了。但是,Linux上一些目录里的文件,是可以被默认找到的,这些目录的集合,就叫PATH
。PATH还是一个环境变量,我们可以通过命令查看它的尊容。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
想要知道系统中有哪些命令,就可以看下上面这些文件夹中,都有哪些文件。文件非常非常之多,但是大部分我们不会接触。所以,xjjdog才会写这么个东西--聚焦那些最常用,最有用的命令,最常用的参数,最有用的场景。
命令输出后,还有一些额外的东西,比如[root@localhost ~]
,这部分叫做提示符,光标会一直跳动,等待你的输入。这部分是可以定制的,甚至可以定制的十分漂亮。
到现在为止,我们什么都没得到。按照程序员的想法来说,就要实现一个hello world
的程序。在终端shell里,这个过程变得简单,远比写一个java程序简单。
[root@localhost ~]# echo "Hello World"
Hello World
如上所示,echo
的意思就是输出一些内容。后面的Hello World
,就叫做参数,它们之间以空格分隔,可以接受多个参数。
[root@localhost ~]# echo "Hello World" , "Fuck 996"
Hello World , Fuck 996
以上命令能够正常运行,证明echo是我们的终端能够认识的一个命令。那到底这个命令是在什么地方呢?可以使用whereis
命令进行查找。
[root@localhost ~]# whereis echo
echo: /usr/bin/echo /usr/share/man/man1/echo.1.gz
命令显示。我们的echo命令全路径,是/usr/bin/echo
,由于它处于PATH目录中,所以能够被识别到。
接下来,我们把上面的命令,做成一个脚本。然后将这个脚本,放到PATH目录中。不过先等等,我们要先给命令起个名字。
首先需要创建一个文件。在Linux上,创建文件使用touch
命令。
[root@localhost ~]# touch jdsjf
命令执行后,什么都没发生,它只是创建了一个空文件。接下来,我们向其中添加一些内容。
[root@localhost ~]# echo "echo 'Hello World'" > jdsjf
注意符号>
,它的意思是,将前面的输出,重定向到后面的文件中。执行完上面的命令,jdsjf
中的内容,就变成了echo 'Hello World
。
接下来,我们尝试着去执行刚才生成的命令。
[root@localhost ~]# ./jdsjf
-bash: ./jdsjf : Permission denied
我们通过相对路径的方式,来执行刚刚生成的命令。结果,终端显示我们并没有这个命令的执行权限。
其实,Linux在权限控制这一方面,非常的详细。一个文件,有可读、可写、可执行三种属性。如果想要一个文件能够执行,需要给它添加执行权限,这个过程是由命令chmod
完成的。
[root@localhost ~]# chmod u+x jdsjf
[root@localhost ~]# ./jdsjf
Hello World
我们将在后面的章节,来详细介绍权限方面的知识。如上所示,命令已经能正常输出,接下来,我们把命令移动
到PATH中的一个目录。
[root@localhost ~]# mv jdsjf /usr/local/bin/
[root@localhost ~]# jdsjf
Hello World
不需要加任何的相对路径,现在,只需要输入jdsjf,就可以正常输出一串数字。我们成功的让一个没有任何意义的字符串,表达了它的想法。虽然我们依然是它的主宰。
你可以想一下下面这三个问题:
1、我可以自定义一个目录,比如/root/mybin
,把它加入到PATH么?
2、我可以省略上面的touch命令,直接使用重定向生成文件么?
3、除了放到PATH和相对路径,还有没有其他的命令执行方式?
想要了解linux的基本使用方法,就要了解一个基本的事实--linux系统中,一切皆文件。
不管是命令,还是文档,甚至设备,目录,套接字,在linux上对它们的操作都是一致对待的。许多开发驱动程序的小伙伴,会发现使用的一些函数,和读写文件的没什么两样(open、close、read、write、ioctl)。今天我们所说的基本操作,针对的就是普通文件和目录,本小节将详细解释相关命令。
到现在为止,我们还不知道自己在系统的什么地方。在浏览器上,我们能够通过导航栏上的url,了解到自己在互联网上的具体坐标。相似的功能,是由pwd
命令提供的,它能够输出当前的工作目录。
pwd
命令是非常非常常用的命令,尤其是在一些命令提示符
设置不太友好的机器上。另外,它也经常用在shell脚本中,用来判断当前的运行目录是否符合需求。
有很多线上事故,都是由于没有确认当前目录所引起的。比如rm -rf *
这种危险的命令。在执行一些高危命令时,随时确认当前目录,是个好的习惯。
[root@localhost ~]# pwd
/root
我们使用root用户默认登陆后,就停留在/root
目录中。Linux中的目录层次,是通过/
进行划分的。
Linux的文件系统,从一开始就有一个规范标准。它还有一个专有缩写名词,叫做FHS
(Filesystem Hierarchy Standard)。FHS经过多年的演进,目录结构也越来越清晰。除了一些标准的要求,还有一些使用者之间的约定。
接下来,我们大体看一下linux上的默认目录,对其有一个基本的感觉。
第1层 | 第二层 | 介绍 |
---|---|---|
/bin | 目录/usr/bin的软链接 | |
/sbin | 目录/usr/sbin的软链接 | |
/lib | 目录/usr/lib的软链接 | |
/usr | /bin | 存放一些常用的命令 |
/usr | /sbin | 存放一些管理员常用的命令 |
/usr | /lib | 用来存放动态库和一些模块文件 |
/sys | 内核中的数据结构的可视化接口 | |
/proc | 内存映像 | |
/run | 内存映像 | |
/boot | 存放引导程序,内核相关文件 | |
/dev | 存放一些设备文件 ,比如光盘 |
|
/etc | 用于存储一些全局的、应用的配置文件 | |
/var | 与/var/run一样,存放的是系统运行时需要的文件,比如mysql的pid等 | |
/tmp | 非常特殊的临时文件夹,断电丢失 | |
/home | /** | 用户目录,比如我的目录是/home/xjjdog |
/root | root用户的home目录 |
home
平常,我们打交道最多的目录,就集中在自己的用户目录,我们可以在里面做任何操作,比如我们现在root用户的/root
目录。一些自己的资料,比如视频、音频、下载的文件,或者做测试用的一些数据资料,就可以自行在这些目录下规划。root用户比较特殊,普通用户的私人目录都是在/home下的。
/etc
etc目录是经常要打交道的目录,存放了一些全局的系统配置文件和应用配置文件。比如你安装了php,或者nginx,它们的配置文件就躺在/etc目录下的某个文件夹里。
/var
var目录存放一些运行中的数据,有必须的,也有非必须的。一些黑客入侵之后,会在这里面的某些文件中留下痕迹,他们会着重进行清理。var目录还是一些应用程序的默认数据存放之地,比如mysql的数据文件。
/tmp
目录是一个特殊的临时目录,文件在断电以后就消失了。但这个目录,所有的用户,都有写入权限,通常用来做文件交换用。
/proc
和/sys
目录,是两个神奇的目录。它们两个是一种伪文件系统,可以通过修改其中一些文件的状态和内容,来控制程序的行为(修改后会直接刷到内存上,太酷了)。刚开始的时候,只有proc目录,由于里面内容有多又乱,后面又规划出sys目录,用来控制内核的一些行为。如果你在调优一些系统参数,和这些文件打交道的时间比较多。
还有几个空的目录,我们没有列在上面的表格上。比如/srv
目录,通常会把一些web服务的资料,比如nginx的,放在这里面。但是,这并不是强制要求的,所以我见过的/srv
目录,通常会一直是空的。同样的,/opt
目录也是这样一个存在,你就当它不存在就行。这都属于使用者规划的范畴,自定义性非常强。
在使用Linux系统的时候,也可以创建自己的目录。比如,我就喜欢自己创建一个叫做/data
的目录,用来存放一些数据库相关的内容。举个例子,/data/mysql
存放mariadb的数据,而/data/es/
存放elasticsearch的索引内容。
linux上的文件类型有很多,它们大部分都分门别类的存放在相应的目录中,比如/dev目录下,就是一些设备文件;/bin文件下,是一些可以执行命令。通常都好记的很。
所以,上面的表格内容,我是怎么看到的呢,靠记忆么?ls
命令,能够列出相关目录的文件信息。可以被评为linux下最勤劳的命令标兵。
现在的终端,都能够输出彩色的信息,非常的直观。
oh-my-zsh
和oh-my-bash
等项目,可以让你的终端更加的漂亮。把它加入到你的研究清单里吧。
[root@localhost /]# ls /
# 注意:ls可以接受路径参数,你不用先跳转,就可以输出相关信息
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost /]# ls -l /
# 带上 -l参数,可以查看一些更加详细的信息。
total 20
lrwxrwxrwx. 1 root root 7 Nov 3 20:24 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Nov 3 20:34 boot
drwxr-xr-x. 19 root root 3080 Nov 3 21:19 dev
drwxr-xr-x. 74 root root 8192 Nov 3 20:34 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 3 20:24 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 20:24 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 108 root root 0 Nov 3 21:19 proc
dr-xr-x---. 2 root root 135 Nov 4 07:53 root
drwxr-xr-x. 24 root root 740 Nov 3 21:20 run
lrwxrwxrwx. 1 root root 8 Nov 3 20:24 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Nov 3 21:19 sys
drwxrwxrwt. 9 root root 4096 Nov 4 03:40 tmp
drwxr-xr-x. 13 root root 155 Nov 3 20:24 usr
drwxr-xr-x. 19 root root 267 Nov 3 20:34 var
ls最常用的,就是加参数l
或者参数a
。
加上参数l
,能够看到文件的一些权限信息已经更新日期等。但我们还看到了一些更有意思的东西。比如:
lib -> usr/lib
上面表示的,是软链接信息。
就如同我们上面表格所展示的一样,lib
目录,是/usr/lib
的快捷方式,它们之中的内容,没有什么两样。
关于ls -l
展示的更加详细的内容,可以参照我下面的这张图。我们将在了解后面小节的内容后,再次对这张图进行回顾。
直接在你的/root目录里,执行ls -al
,你会看到更多东西。这些额外的隐藏文件,都是以.
开头,以配置文件居多。这就是参数a
的作用。
[root@localhost ~]# ls -al
total 28
dr-xr-x---. 2 root root 135 Nov 4 07:53 .
dr-xr-xr-x. 17 root root 224 Nov 3 20:28 ..
-rw-------. 1 root root 1273 Nov 3 20:28 anaconda-ks.cfg
-rw-------. 1 root root 246 Nov 4 11:41 .bash_history
-rw-r--r--. 1 root root 18 Dec 28 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 28 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 28 2013 .bashrc
-rw-r--r--. 1 root root 100 Dec 28 2013 .cshrc
-rw-r--r--. 1 root root 129 Dec 28 2013 .tcshrc
细心的同学,应该会注意到两个特殊的目录。.
和..
。前者表示的是当前目录,而后者表示的是上层目录。
使用cd
命令,将在这些目录中,自由穿梭。
小技巧:如果你对英文日期阅读困难,可以使用
ls -al --full-time
查看可读的日期。
执行cd命令,可以将工作目录切换到目标文件夹。为了展示cd命令的效果。请在root用户下,执行下面的命令,这将创建一个7层的目录。
cd
mkdir -p a1/b2/c3/d4/e5/f6/{g7,g8,g9,g10}
我们使用cd命令,切换到最后一层。然后,我们使用..
切换到上层目录。
[root@localhost ~]# cd a1/b2/c3/d4/e5/f6/g7
[root@localhost g7]# pwd
/root/a1/b2/c3/d4/e5/f6/g7
[root@localhost g7]# cd ..
[root@localhost f6]# pwd
/root/a1/b2/c3/d4/e5/f6
所以,切换到上面n层目录,只需使用多层级的../
即可。有几个特殊的变量,需要说明一下。
../
指的是上层目录
../../
指的是上两层目录
./
指的是当前目录
~
指的是当前的用户目录,这是一个缩写符号
-
使用它,可以在最近两次的目录中来回切换
我们来使用命令把上面这些特殊变量验证一下。
# 跳转到用户根目录
[root@localhost tmp]# cd ~
[root@localhost ~]# pwd
/root
# 进入到第三层目录
[root@localhost ~]# cd a1/b2/c3/
[root@localhost c3]# pwd
/root/a1/b2/c3
# 跳回到前三层目录
[root@localhost c3]# cd ../../..
[root@localhost ~]# pwd
/root
# 跳到上次访问的目录
[root@localhost ~]# cd -
/root/a1/b2/c3
[root@localhost c3]# pwd
/root/a1/b2/c3
# 进入当前目录:等于什么都没干
[root@localhost c3]# cd ./
[root@localhost c3]# pwd
/root/a1/b2/c3
以上就是cd命令的常用用法。现在,我们返回头来看一下mkdir
。顾名思义,就是创建目录的意思,但一般在工作中,都会加上-p
参数,这样就可以一次性创建多层目录。注意mkdir后面的大括号{}
,可以一次性的指定多个目录进行创建,这通常能节省很多时间。
使用命令行操作文件,是非常方便的。
touch
新建文件
cp
复制文件
mv
移动文件
rm
删除文件
这四个风骚的命令,主宰着文件资料的去向。我们依然使用上面创建的目录,进行接下来的操作。
# 创建三个文件
[root@localhost ~]# touch long-long-long.txt
[root@localhost ~]# touch 996.txt
[root@localhost ~]# touch icu.txt
[root@localhost ~]# ls
996.txt a1 anaconda-ks.cfg icu.txt long-long-long.txt
# 复制一个文件
[root@localhost ~]# cp 996.txt 007.txt
[root@localhost ~]# mv long-long-long.txt short.txt
[root@localhost ~]# ls
007.txt 996.txt a1 anaconda-ks.cfg icu.txt short.txt
# 移动996.txt到a1目录,icu.txt到a1/b2目录
# 删除short.txt
[root@localhost ~]# mv 996.txt a1/
[root@localhost ~]# mv icu.txt a1/b2/
[root@localhost ~]# rm short.txt
rm: remove regular empty file ‘short.txt’? y
# 递归删除a1目录
[root@localhost ~]# rm -rvf a1/
removed directory: ‘a1/b2/c3/d4/e5/f6/g7’
removed directory: ‘a1/b2/c3/d4/e5/f6/g8’
removed directory: ‘a1/b2/c3/d4/e5/f6/g9’
removed directory: ‘a1/b2/c3/d4/e5/f6/g10’
removed directory: ‘a1/b2/c3/d4/e5/f6’
removed directory: ‘a1/b2/c3/d4/e5’
removed directory: ‘a1/b2/c3/d4’
removed directory: ‘a1/b2/c3’
removed ‘a1/b2/icu.txt’
removed directory: ‘a1/b2’
removed ‘a1/996.txt’
removed directory: ‘a1/’
[root@localhost ~]# ls
007.txt anaconda-ks.cfg
经过一番操作以后,只剩下了007了。除了上面基本的操作,接下来我要介绍一些更加重要的功能。
可以看到在使用rm
删除文件的时候,进行了一次提示。这是为了避免误删除一些东西,但有时候,你需要不显示这种提示,就可以加-f
参数。f
参数对于cp、mv等命令来说,同样适用,它是force
的意思。
rm -f file
cp -f file1 file2
mv -f file1 file2
另外,还有一个参数-r
,这是递归的意思。我们的目录和文件,通常有多个层次,递归可以把操作全部作用于上面,比如上面的递归删除a1目录。
# 警告:以下命令会造成严重后果
rm -rf /
上面的这个命令,你一定经常看到。这不是笑话,已经有很多用户因此丢失了数据,这就是传说中的删根
,最终你将一无所有。那参数v
又是干什么用的呢?加上它之后,可以看到命令详细的执行过程。在平常的操作中,我一般都加上。
你可能已经了解到,ll -l
命令的第一列,能够显示linux的文件类型。请对此有一个大体的印象,因为后面的很多命令,会用到这些知识。
-
表示普通文件
d
表示目录文件
l
表示链接文件,比如快捷方式
s
套接字文件
c
字符设备文件,比如/dev/
中的很多文件
b
表示块设备文件,比如一些磁盘
p
管道文件
Linux上的文件可以没有后缀,而且可以创建一些违背直觉的文件。比如后缀是png,但它却是一个压缩文件(通常不会这么做)。大学时,就有聪明的同学这样藏小电影,效果很好。
查看文件的具体类型,可以使用file
命令,它很聪明,能够识别很多文件格式。
[root@localhost ~]# file /etc
/etc: directory
[root@localhost ~]# file /etc/group
/etc/group: ASCII text
[root@localhost ~]# file /dev/log
/dev/log: socket
[root@localhost ~]# file /dev/log
/dev/log: socket
[root@localhost ~]# file /bin
/bin: symbolic link to `usr/bin'
本部分的操作,面向的就是ASCII text
类型的,普通文本文件。接下来,我们要创建一些文件。然后写入一些内容到文件里,以便进行后续的操作。
使用重定向符,能够直接生成文件。下面,我要生成10到20的数字,每一个数字单独一行,写入一个叫做spring
的文件。巧的很,seq
命令可以完成这个过程。
seq 10 20 >> spring
我们在前面提到过>
的意思,是将前面命令的输出,重定向到其他地方。在这里,我们用了两个>
,它依然是重定向的意思,但表示的是,在原来文件的基础上,追加
内容。
也就是编程语言里的w+
和a+
的意思。
为了查看文件的生成效果,可以使用cat命令检测。cat命令将会把文件的内容,输出打印到终端上。如果加上参数n
,甚至可以打印行号。效果如下:
[root@localhost ~]# cat spring
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# cat -n spring
1 10
2 11
3 12
4 13
5 14
6 15
7 16
8 17
9 18
10 19
11 20
除了查看文件内容,cat命令通常用在更多的地方。只有和其他命令联合起来,它才会觉得生活有意义。
# 合并a文件和b文件到c文件
cat a b>> c
# 把a文件的内容作为输入,使用管道处理。我们在后面介绍
cat a | cmd
# 写入内容到指定文件。在shell脚本中非常常用。我们在后面会多次用到这种写法
cat > index.html <