Linux系统基础优化及常用命令
Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令。
ifconfig
查询、设置网卡和ip
等参数ifup
,ifdown
脚本命令,更简单的方式启动关闭网络ip
符合指令,直接修改上述功能
Linux的网络功能
在我们刚装好linux
的时候,需要用xshell
进行远程连接,那就得获取ip
地址,有时候网卡默认是没启动的,Linux
也就拿不到ip
地址,因此我们得手动启动网卡
1 | #编辑网卡配置文件 |
网卡配置文件详解
1 | # 网络配置文件: |
ifup
,ifdown
命令
ifup
和ifdown
是直接连接到/etc/sysconfig/network-scripts
目录下搜索对应的网卡文件,例如ifcfg-eth0
然后加以设置
ifup
ifup
命令用于激活指定的网络接口。
语法
1 | ifup(参数) |
参数
网络接口:要激活的网络接口。
实例
1 | ifup eth0 #激活eth0 |
ifdown
ifdown
命令用于禁用指定的网络接口。
语法
1 | ifdown(参数) |
参数
网络接口:要禁用的网络接口。
实例
1 | ifdown eth0 #禁用eth0 |
ifconfig
命令
ifconfig
命令被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig
命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。
语法
1 | ifconfig(参数) |
参数
1 | add<地址>:设置网络设备IPv6的ip地址; |
实例
显示网络设备信息(激活状态的):
1 | [root@localhost ~]# ifconfig |
说明:
**eth0
**表示第一块网卡,其中HWaddr
表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是00:16:3E:00:1E:51
。
**inet addr
**用来表示网卡的IP
地址,此网卡的IP
地址是10.160.7.81
,广播地址Bcast:10.160.15.255
,掩码地址Mask:255.255.240.0
。
lo是表示主机的回环地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd
服务器的指定到回环地址,在浏览器输入127.0.0.1就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道。
- 第一行:连接类型:
Ethernet
(以太网)HWaddr
(硬件mac
地址)。 - 第二行:网卡的
IP
地址、子网、掩码。 - 第三行:
UP
(代表网卡开启状态)RUNNING
(代表网卡的网线被接上)MULTICAST
(支持组播)MTU:1500
(最大传输单元):1500字节
。 - 第四、五行:接收、发送数据包情况统计。
- 第七行:接收、发送数据字节数统计信息。
启动关闭指定网卡:
1 | ifconfig eth0 up |
ifconfig eth0 up
为启动网卡eth0
,ifconfig eth0 down
为关闭网卡eth0
。ssh登陆linux
服务器操作要小心,关闭了就不能开启了,除非你有多网卡。
为网卡配置和删除IPv6
地址:
1 | ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址 |
用ifconfig
修改MAC地址:
1 | ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE |
配置IP
地址:
1 | [root@localhost ~]# ifconfig eth0 192.168.2.10 |
启用和关闭arp
协议:
1 | ifconfig eth0 arp #开启网卡eth0 的arp协议 |
设置最大传输单元:
1 | ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes |
ip
命令
ip
是一个命令,不是TCP/IP
那个ip
,这个ip
命令是结合了ifconfig
和route
两个命令的功能。
1 | ip addr show #查看ip信息 |
用户管理与文件权限篇
现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立账户,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源。普通用户在所分配到的资源内进行各自的操作,相互之间不受影响。但是这些普通用户的权限是有限制的,且用户太多的话,管理就不便,从而引入root
用户。此用户是唯一的,且拥有系统的所有权限。root
用户所在的组称为root
组。“组”是具有相似权限的多个用户的集合。
root
的权利
Linux
系统的特性就是可以满足多个用户,同时工作,因此Linux
系统必须具备很好的安全性。在安装RHEL7
时设置的root
管理员密码,这个root
管理员就是所有UNIX
系统中的超级用户,它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户,启动/关闭进程,开启/禁用硬件设备等等。因此“能力越大,责任越大”,root
权限必须很好的掌握,否则一个错误的命令可能会摧毁整个系统。
root
为什么叫root
?
在Linux
系统中,用户也有自己的UID
身份账号且唯一
系统管理员UID
为0
系统用户UID
为1~999 Linux
安装的服务程序都会创建独有的用户负责运行。
普通用户UID
从1000开始:由管理员创建
用户组GID
为了方便管理属于同一组的用户,Linux
系统中还引入了用户组的概念。通过使用用 户组号码(GID
,Group IDentification
),我们可以把多个用户加入到同一个组中,从而方 便为组中的用户统一规划权限或指定任务。假设有一个公司中有多个部门,每个部门中又 有很多员工。如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设 置权限。例如,可以通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的 数据库信息等。
Linux
管理员在创建用户时,将自动创建一个与其同名的用户组,这个用户组只有该用户一个人
Linux/unix
是一个多用户、多任务的操作系统。
**root
**:默认在Unix/linux
操作系统中拥有最高的管理权限。可以理解为qq
群的群主
普通用户:是管理员或者具备管理权限的用户所创建的,只能读、看,不能增、删、改。
创建普通用户
1 | #添加用户 |
useradd
useradd
命令用于Linux
中创建的新的系统用户。useradd
可用来建立用户帐号。帐号建好之后,再用passwd
设定帐号的密码.而可用userdel
删除帐号。使用useradd
指令所建立的帐号,实际上是保存在/etc/passwd
文本文件中。
在Slackware
中,adduser
指令是个script
程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd
命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux
中,**adduser
命令**则是useradd
命令的符号连接,两者实际上是同一个指令。
语法
1 | useradd(选项)(参数) |
选项
1 | -c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中; |
参数
用户名:要创建的用户名。
实例
新建用户加入组:
1 | useradd –g sales jack –G company,employees //-g:加入主要组、-G:加入次要组 |
建立一个新用户账户,并设置ID:
1 | useradd caojh -u 544 |
需要说明的是,设定ID
值时尽量要大于500,以免冲突。因为Linux
安装后会建立一些特殊用户,一般0到499之间的值留给bin
、mail
这样的系统账号。
passwd
passwd
命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
语法
1 | passwd(选项)(参数) |
选项
1 | -d:删除密码,仅有系统管理者才能使用; |
参数
用户名:需要设置密码的用户名。
知识扩展
与用户、组账户信息相关的文件
存放用户信息:
1 | /etc/passwd |
存放组信息:
1 | /etc/group |
用户信息文件分析(每项用:
隔开)
1 | 例如:jack:X:503:504:::/home/jack/:/bin/bash |
组信息文件分析
1 | 例如:jack:$!$:???:13801:0:99999:7:*:*: |
实例
如果是普通用户执行passwd
只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用passwd
用户名,注意要以root
用户的权限来创建。
1 | [root@localhost ~]# passwd linuxde //更改或创建linuxde用户的密码; |
普通用户如果想更改自己的密码,直接运行passwd
即可,比如当前操作的用户是linuxde
。
1 | [linuxde@localhost ~]$ passwd |
比如我们让某个用户不能修改密码,可以用-l
选项来锁定:
1 | [root@localhost ~]# passwd -l linuxde //锁定用户linuxde不能更改密码; |
再来一例:
1 | [root@localhost ~]# passwd -d linuxde //清除linuxde用户密码; |
注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。
切换用户
1 | # su命令可以切换用户身份的需求, |
1 | #先看下当前用户(我是谁) |
- 一般情况下,在生产环境避免直接用
root
用户,除非有特殊系统维护需求,使用完立刻退回普通用户 - 非交互式设置密码(
echo "redhat"|passwd --stdin 123456 && history -c
)
Tip:
1.超级用户root
切换普通用户无需密码,例如“群主”想踢谁就踢谁
2.普通用户切换root
,需要输入密码
3.普通用户权限较小,只能基本查看信息
4.$
符号是普通用户命令提示符,#是超级管理员的提示符
1 | [root@tony-PC:~]# |
groupadd
命令
group
命令用于创建用户组,为了更加高效的指派系统中各个用户的权限,在工作中常常添加几个用户到一个组里面,这样可以针对一类用户安排权限。
例如超哥以前在公司里,就负责添加openLDAP
用户管理,偶尔台湾,美国的同事去上海协作,我就得给他们添加到it部门组里面,以至于他们有对服务器操作的权限。groupadd it_dep
groupadd
命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
语法
1 | groupadd(选项)(参数) |
选项
1 | -g:指定新建工作组的id; |
参数
组名:指定新建工作组的组名。
实例
建立一个新组,并设置组ID
加入系统:
1 | groupadd -g 344 linuxde |
此时在/etc/passwd
文件中产生一个组ID
(GID
)是344的项目。
userdel
删除用户
userdel
命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
语法
1 | userdel(选项)(参数) |
选项
1 | -f:强制删除用户,即使用户当前已登录; |
参数
用户名:要删除的用户名。
实例
userdel
命令很简单,比如我们现在有个用户linuxde
,其家目录位于/var
目录中,现在我们来删除这个用户:
1 | userdel linuxde //删除用户linuxde,但不删除其家目录及文件; |
请不要轻易用-r
选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd
中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd
是极为重要的文件,可能您一不小心会操作失误。
sudo
命令
sudo
命令用来以其他身份来执行命令,预设的身份为root
。在/etc/sudoers
中设置了可执行sudo
指令的用户。若其未经授权的用户企图使用sudo
,则会发出警告的邮件给管理员。用户使用sudo
时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
语法
1 | sudo(选项)(参数) |
选项
1 | -b:在后台执行指令; |
参数
指令:需要运行的指令和对应的参数。
实例
配置sudo
必须通过编辑/etc/sudoers
文件,而且只有超级用户才可以修改它,还必须使用visudo
编辑。之所以使用visudo
有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo
来检查一下语法。
visudo
默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo
不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:
1 | >>> sudoers file: syntax error, line 22 << |
此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo
将不会再运行,直到错误被纠正。
现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar
可以通过sudo
执行所有root
可执行的命令。以root
身份用visudo
打开配置文件,可以看到类似下面几行:
1 | # Runas alias specification |
我们一看就明白个差不多了,root
有所有权限,只要仿照现有root
的例子就行,我们在下面加一行(最好用tab作为空白):
1 | foobar ALL=(ALL) ALL |
保存退出后,切换到foobar
用户,我们用它的身份执行命令:
1 | [foobar@localhost ~]$ ls /root |
好了,我们限制一下foobar
的权利,不让他为所欲为。比如我们只想让他像root
那样使用ls和ifconfig
,把那一行改为:
1 | foobar localhost= /sbin/ifconfig, /bin/ls |
再来执行命令:
1 | [foobar@localhost ~]$ sudo head -5 /etc/shadow |
现在让我们来看一下那三个ALL
到底是什么意思。第一个ALL
是指网络中的主机,我们后面把它改成了主机名,它指明foobar
可以在此主机上执行后面的命令。第二个括号里的ALL
是指目标用户,也就是以谁的身份去执行命令。最后一个ALL
当然就是指命令名了。例如,我们想让foobar
用户在linux
主机上以jimmy
或rene
的身份执行kill
命令,这样编写配置文件:
1 | foobar linux=(jimmy,rene) /bin/kill |
但这还有个问题,foobar
到底以jimmy
还是rene
的身份执行?这时我们应该想到了sudo -u
了,它正是用在这种时候。 foobar
可以使用sudo -u jimmy kill PID
或者sudo -u rene kill PID
,但这样挺麻烦,其实我们可以不必每次加-u
,把rene
或jimmy
设为默认的目标用户即可。再在上面加一行:
1 | Defaults:foobar runas_default=rene |
Defaults
后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:
1 | Defaults env_reset |
另一个问题是,很多时候,我们本来就登录了,每次使用sudo
还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:
1 | foobar localhost=NOPASSWD: /bin/cat, /bin/ls |
再来sudo
一下:
1 | [foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log |
当然,你也可以说“某些命令用户foobar
不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL
中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。
日志与安全
sudo
为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo
的日志功能不是自动的,必须由管理员开启。这样来做:
1 | touch /var/log/sudo |
在syslog.conf
最后面加一行(必须用tab
分割开)并保存:
1 | local2.debug /var/log/sudo |
重启日志守候进程,
1 | ps aux grep syslogd |
把得到的syslogd
进程的PID
(输出的第二列是PID
)填入下面:
1 | kill –HUP PID |
这样,sudo
就可以写日志了:
1 | [foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg |
不过,有一个小小的“缺陷”,sudo
记录日志并不是很忠实:
1 | [foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null |
重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo
根本就没看到重定向。这也有个好处,下面的手段不会得逞:
1 | [foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够 |
sudo
有自己的方式来保护安全。以root
的身份执行sudo-V
,查看一下sudo
的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo
后面的命令,或者被检查后再传递的,比如:PATH
,HOME
,SHELL
等。当然,你也可以通过sudoers
来配置这些环境变量。
1 | # 使用普通账户访问 |
文件与目录权限
Linux权限的目的是(保护账户的资料)
Linux权限主要依据三种身份来决定:
user/owner
文件使用者,文件属于哪个用户group
属组,文件属于哪个组others
既不是user
,也不再group
,就是other
,其他人
什么是权限
在Linux
中,每个文件都有所属的所有者,和所有组,并且规定了文件的所有者,所有组以及其他人对文件的,可读,可写,可执行等权限。
对于目录的权限来说,可读是读取目录文件列表,可写是表示在目录内新增,修改,删除文件。可执行表示可以进入目录
Linux权限的观察
1 | root@tony-PC:/media/tony/数据# ls -l |
解读上述信息:
文件类型
1
2
3
4
5- 一般文件
d 文件夹
l 软连接(快捷方式)
b 块设备,存储媒体文件为主
c 代表键盘,鼠标等设备权限,第一个字母为文件类型,后续9个字母,每3个一组,是三种身份的权限
文件链接数
文件拥有者-属主
文件拥有组-属组
文件大小
最后一次被修改的时间日期
文件名
文件权限
我们已知三种身份权限(属主,属组,其他人),每种身份都有rwx
的三种权限,系统还提供了数字计算权限。
1 | r read 4 可读,可以用cat等命令查看 |
每种身份最低是0分,最高是r+w+x 7分
因此三种身份,最高权限是777,最低是000
1 | -rw-r--r-- 1 root tony 0 8月 7 11:28 bbb.txt |
目录权限
权限这里测试不要用root实验!!!!root太牛逼了
请用普通用户执行!!!!!测试文件、文件夹权限操作,请用普通用户!
1 | r 可以对此目录执行ls列出所有文件 |
权限与数字转化
1 | root@tony-PC:/media/tony/数据# ls -l /var/log/mysql/error.log |
查看用户权限命令
1 | # 查看用户所属群主 |
id
id
命令可以显示真实有效的用户ID
(UID
)和组ID
(GID
)。UID
是对一个用户的单一身份标识。组ID
(GID
)则对应多个UID
。id
命令已经默认预装在大多数Linux
系统中。要使用它,只需要在你的控制台输入id
。不带选项输入id
会显示如下。结果会使用活跃用户。
当我们想知道某个用户的UID
和GID
时id命令是非常有用的。一些程序可能需要UID/GID
来运行。id
使我们更加容易地找出用户的UID
以GID
而不必在/etc/group
文件中搜寻。如往常一样,你可以在控制台输入man id
进入id的手册页来获取更多的详情。
语法
1 | id [-gGnru][--help][--version][用户名称] |
选项
1 | -g或--group 显示用户所属群组的ID。 |
实例
1 | [root@localhost ~]# id |
解释:用户root
的UID
号码 = 0,GID
号码 = 0。用户root
是下面组的成员:
root
组GID
号是:0bin
组GID
号是:1daemon
组GID
号是:2sys
组GID
号是:3adm
组GID
号是:4disk
组GID
号是:6wheel
组GID
号是:10
打印用户名、UID
和该用户所属的所有组,要这么做,我们可以使用 -a
选项:
1 | [root@localhost ~]# id -a |
输出所有不同的组ID
,有效的,真实的和补充的,我们可以使用 -G
选项来实现:
1 | [root@localhost ~]# id -G |
结果只会显示GID
号。你可以和/etc/group
文件比较。下面是/etc/group
文件的示例内容:
只输出有效的组ID
,通过使用 -g
选项来只输出有效组ID
:
1 | [root@localhost ~]# id -g |
输出特定用户信息,我们可以输出特定的用户信息相关的UID
和GID
。只需要在id
命令后跟上用户名:
1 | [root@localhost ~]# id www |
修改文件权限属性
普通用户只能修改自己的文件名,时间与权限(注意)
因此修改其他用户权限,只能用最nb
的root
用户
chown
chown
命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
语法
1 | chown(选项)(参数) |
选项
1 | -c或——changes:效果类似“-v”参数,但仅回报更改的部分; |
参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。
实例
将目录/usr/meng
及其下面的所有文件、子目录的文件主改成 liu
:
1 | chown -R liu /usr/meng |
修改bbb.txt
文件所属用户为root
1 | # 查看该文件初始所属用户 |
chgrp
chgrp
命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id
,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root
),则不能改变该文件的组。
在UNIX
系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp
指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。
语法
1 | chgrp(选项)(参数) |
选项
1 | -c或——changes:效果类似“-v”参数,但仅回报更改的部分; |
参数
- 组:指定新工作名称;
- 文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。
实例
将/usr/meng
及其子目录下的所有文件的用户组改为mengxin
1 | chgrp -R mengxin /usr/meng |
修改bbb.txt
所属组为root
1 | # 初始所属组为tony |
修改权限的命令
chmod
chmod
命令用来变更文件或目录的权限。在UNIX
系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod
指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
权限范围的表示法如下:
u
User
,即文件或目录的拥有者;g
Group
,即文件或目录的所属群组;o
Other
,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;a
All
,即全部的用户,包含拥有者,所属群组以及其他用户;r
读取权限,数字代号为“4”;w
写入权限,数字代号为“2”;x
执行或切换权限,数字代号为“1”;-
不具任何权限,数字代号为“0”;s
特殊功能说明:变更文件或目录的权限。
语法
1 | chmod(选项)(参数) |
选项
1 | -c或——changes:效果类似“-v”参数,但仅回报更改的部分; |
参数
权限模式:指定文件的权限模式;
文件:要改变权限的文件。
知识扩展和实例
Linux
用 户分为:拥有者、组群(Group
)、其他(other
),Linux
系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root
的相关信 息, 都是记录在/etc/passwd
文件中。每个人的密码则是记录在/etc/shadow
文件下。 此外,所有的组群名称记录在/etc/group
內!
linux
文件的用户权限的分析图
例:rwx rw- r--
r=读取属性 //值=4
w=写入属性 //值=2
x=执行属性 //值=1
1 | chmod u+x,g+w f01 //为文件f01设置自己可以执行,组员可以写入的权限 |
文件的属主和属组属性设置
1 | chown user:market f01 //把文件f01给uesr,添加到market组 |
1 | chmod [身份] [参数] [文件] |
1 | 当前权限 |
修改文件名,修改文件更改日期
1 | mv pyyu.txt chaoge.txt |
软连接
软连接也叫做符号链接,类似于windows
的快捷方式。
常用于安装软件的快捷方式配置,如python
,nginx
等
ln
ln
命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用”-s”选项。
注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
语法
1 | ln(选项)(参数) |
选项
1 | -b或--backup:删除,覆盖目标文件之前的备份; |
参数
- 源文件:指定连接的源文件。如果使用
-s
选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; - 目标文件:指定源文件的目标连接文件。
实例
将目录/usr/mengqc/mub1
下的文件m2.c
链接到目录/usr/liu
下的文件a2.c
1 | cd /usr/mengqc |
在执行ln
命令之前,目录/usr/liu
中不存在a2.c
文件。执行ln
之后,在/usr/liu
目录中才有a2.c
这一项,表明m2.c
和a2.c
链接起来(注意,二者在物理上是同一文件),利用ls -l
命令可以看到链接数的变化。
在目录/usr/liu
下建立一个符号链接文件abc
,使它指向目录/usr/mengqc/mub1
1 | ln -s /usr/mengqc/mub1 /usr/liu/abc |
执行该命令后,/usr/mengqc/mub1
代表的路径将存放在名为/usr/liu/abc
的文件中。
扩展知识
Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。
文件链接有两种形式,即硬链接和符号链接。
硬链接
建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。
创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。
在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。
对硬链接有如下限制:
- 不能对目录文件做硬链接。
- 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。
符号链接
符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如图中的abc
文件),其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。
与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。
符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。
用ln -s
命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。
符号链接保持了链接与源文件或目录之间的区别:
- 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
- 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。
- 符号链接的大小是其链接文件的路径名中的字节数。
- 当用
ln -s
命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file
其中,表示“文件大小”的数字“14”恰好说明源文件名original_file
由14个字符构成。
1 | ln -s 目标文件 软连接名 |
创建软连接并加入环境变量
1 | # 查看环境变量 |
PS1
变量
Linux
命令提示符由PS1
环境变量控制
1 | [root@tony_pc ~]# echo $PS1 |
tar
解压命令
tar命令可以为linux
的文件和目录创建档案。利用tar
,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar
最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar
命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux
中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar
命令),然后再用压缩程序进行压缩(gzip/bzip2
命令)。
注意:
tar
命令:用来压缩和解压文件。tar
本身不具有压缩功能。他是调用压缩功能实现的。如果要实现压缩可以在用
tar
打包后使用gzip
命令进行压缩;或者直接使用tar
选项中的-z
或-j
来压缩文件
语法
1 | tar(选项)(参数) |
选项
1 | -A或--catenate:新增文件到以存在的备份文件; |
参数
文件或目录:指定要打包的文件或目录列表。
实例
将文件全部打包成tar
包:
1 | tar -cvf log.tar log2012.log 仅打包,不压缩! |
在选项f
之后的文件档名是自己取的,我们习惯上都用 .tar
来作为辨识。 如果加z
选项,则以.tar.gz
或.tgz
来代表gzip
压缩过的tar包;如果加j
选项,则以.tar.bz2
来作为tar
包名。
查阅上述tar包内有哪些文件:
1 | tar -ztvf log.tar.gz |
由于我们使用 gzip
压缩的log.tar.gz
,所以要查阅log.tar.gz
包内的文件时,就得要加上z
这个选项了。
将tar包解压缩:
1 | tar -zxvf /opt/soft/test/log.tar.gz |
在预设的情况下,我们可以将压缩档在任何地方解开的
只将tar内的部分文件解压出来:
1 | tar -zxvf /opt/soft/test/log30.tar.gz log2013.log |
我可以透过tar -ztvf
来查阅 tar
包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!
文件备份下来,并且保存其权限:
1 | tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log |
这个-p
的属性是很重要的,尤其是当您要保留原本文件的属性时。
在文件夹当中,比某个日期新的文件才备份:
1 | tar -N "2012/11/13" -zcvf log17.tar.gz test |
备份文件夹内容是排除部分文件:
1 | tar --exclude scf/service -zcvf scf.tar.gz scf/* |
其实最简单的使用 tar 就只要记忆底下的方式即可:
1 | 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 |
压缩当前目录所有jpg
结尾的文件
1 | tar -cf all_pic.tar *.jpg |
netstat
命令
netstat
命令用来打印Linux
中网络系统的状态信息,可让你得知整个Linux
系统的网络情况。
语法
1 | netstat(选项) |
选项 (常用)
1 | -t或--tcp:显示TCP传输协议的连线状况; |
实例
1 | [root@tony_pic ~ 10:21:59]#netstat -tunlp |
查看ssh的网络连接
1 | root@tony-PC:/tmp/test# netstat -tunlp | grep ssh |
查看80端口是否开启
1 | root@tony-PC:/tmp/test# netstat -tunlp |grep 80 |
ps
命令
ps
命令用于报告当前系统的进程状态。可以搭配kill
指令随时中断、删除不必要的程序。ps
命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
语法
1 | ps(选项) |
选项
1 | -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 |
由于ps
命令能够支持的系统类型相当的多,所以选项多的离谱!
示例:查询python
的运行进程
1 | root@tony-PC:/tmp/test# ps -ef | grep python |
关掉python
运行的gen/test.py
进程:
1 | root@tony-PC:/tmp/test# kill 21657 |
kill
命令
kill命令用来删除执行中的程序或工作。kill
可将指定的信息送至程序。预设的信息为SIGTERM
(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL
(9)信息尝试强制删除程序。程序或工作的编号可利用ps
指令或job
指令查看。
语法
1 | kill(选项)(参数) |
选项
1 | -a:当处理当前进程时,不限制命令名和进程号的对应关系; |
参数
进程或作业识别号:指定要删除的进程或作业。
实例
列出所有信号名称:
1 | kill -l |
只有第9种信号(SIGKILL
)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
1 | HUP 1 终端断线 |
先用ps
查找进程,然后用kill杀掉:
1 | ps -ef | grep vim |
killall
命令
killall
命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill
命令杀死指定进程PID
的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps
等命令再配合grep
来查找进程,而killall
把这两个过程合二为一,是一个很好用的命令。
语法
1 | killall(选项)(参数) |
选项
1 | -e:对长名称进行精确匹配; |
参数
进程名称:指定要杀死的进程名称。
实例
杀死所有同名进程
1 | killall vi |
SELinux
功能
SELinux(Security-Enhanced Linux)
是美国国家安全局(NSA
)对于强制访问控制的实现,这个功能管理员又爱又恨,大多数生产环境也是关闭的做法,安全手段使用其他方法。
大多数ssh
连接不上虚拟机,都是因为防火墙和selinux
阻挡了
永久关闭方式:
1 | 1.修改配置文件,永久生效关闭selinux |
临时关闭selinux
(命令行修改,重启失效):
1 | getenforce #获取selinux状态 |
Tip:
1 | 修改selinux配置后,想要生效还得重启系统,技巧就是(修改配置文件+命令行修改,达到立即生效) |
iptables
防火墙
在学习阶段,关闭防火墙可以更方便的学习,在企业环境中,一般只有配置外网ip
的linux
服务器才会开启防火墙,但是对于高并发流量的业务服务器仍然是不能开启的,会有很大性能损失,因此需要更nb
的硬件防火墙。
关闭防火墙具体操作如下:
1 | centos7默认已经使用firewall作为防火墙了 |
Linux
中文显示设置(防止中文乱码)
此项优化为可选项,根据个人情况选择是否调整Linux
系统的字符集,字符集就是一套文字符号以及编码。
Linux
下常用字符集有:
GBK
实际企业应用较少UTF-8
广泛支持,MYSQL
也使用UTF-8
,企业广泛使用
1 | #查看系统当前字符集echo $LANGlocale#检查xshell crt的字符集#命令修改字符集 |
英文版本
1 | # vim /etc/profile.d/locale.sh |
乱码核心解决办法
1 | 1.系统字符集utf8 |
df
命令
df
命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB
。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
语法
1 | df(选项)(参数) |
选项
1 | -a或--all:包含全部的文件系统; |
参数
文件:指定文件系统上的文件。
实例
查看系统磁盘设备,默认是KB
为单位:
1 | [root@LinServ-1 ~]# df |
使用-h
选项以KB
以上的单位来显示,可读性高:
1 | [root@LinServ-1 ~]# df -h |
查看全部文件系统:
1 | [root@LinServ-1 ~]# df -a |
tree
命令
tree
命令以树状图列出目录的内容。
语法
1 | tree(选项)(参数) |
选项
1 | -a:显示所有文件和目录; |
参数
目录:执行tree
指令,它会列出指定目录下的所有文件,包括子目录里的文件。
设置主机名
1 | # 查看当前主机名 |
DNS
DNS
(Domain Name System
,域名系统),万维网上作为域名和IP
地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP
数串。
通过域名,最终得到该域名对应的IP
地址的过程叫做域名解析(或主机名解析)。
查看Linux
的dns
,唯一配置文件
1 | 配置文件 |
本地强制dns
解析文件/etc/hosts
1 | 指定本地解析: |
nslookup
命令
nslookup
命令是常用域名查询工具,就是查DNS
信息用的命令。
nslookup4
有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。而在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。
进入交互模式,直接输入nslookup
命令,不加任何参数,则直接进入交互模式,此时nslookup
会连接到默认的域名服务器(即/etc/resolv.conf
的第一个dns
地址)。或者输入nslookup -nameserver/ip
。进入非交互模式,就直接输入nslookup 域名
就可以了。
1 | #解析 |
计划任务crond
服务
crontab
命令被用来提交和管理用户的需要周期性执行的任务,与windows
下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond
进程,crond
进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
语法
1 | crontab(选项)(参数) |
选项
1 | -e:编辑该用户的计时器设置; |
参数
crontab
文件:指定包含待执行任务的crontab
文件。
知识扩展
Linux
下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc
目录下有一个crontab
文件,这个就是系统任务调度的配置文件。
/etc/crontab
文件包括下面几行:
1 | SHELL=/bin/bash |
注意:
查看计划任务的执行:
tail -f /var/log/cron
写计划任务时,命令必须加上绝对路径,否则会出现这种情况:从日志中看,确实触发了计划任务的执行,但是命令却没有执行成功,比如
* * * * * reboot
就会出现这种情况,需要将reboot
写成/usr/sbin/reboot
计划任务执行的命令 是否存在,软件是否安装
确保
crontab
服务运行
1
2
3 systemctl status cron
ps -ef|grep crond检测
crontab
是否开机启动
1 systemctl is-enabled crond所有命令一定要用绝对路径来写!
前四行是用来配置crond
任务运行的环境变量,第一行SHELL
变量指定了系统要使用哪个shell
,这里是bash
,第二行PATH
变量指定了系统执行命令的路径,第三行MAILTO
变量指定了crond
的任务执行信息将通过电子邮件发送给root
用户,如果MAILTO
变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab
工具来定制自己的计划任务。所有用户定义的crontab
文件都被保存在/var/spool/cron
目录中。其文件名与用户名一致,使用者权限文件如下:
1 | /etc/cron.deny 该文件中所列用户不允许使用crontab命令 |
crontab
文件的含义:用户所建立的crontab
文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
1 | minute hour day month week command 顺序:分 时 日 月 周 |
其中:
minute
: 表示分钟,可以是从0到59之间的任何整数。hour
:表示小时,可以是从0到23之间的任何整数。day
:表示日期,可以是从1到31之间的任何整数。month
:表示月份,可以是从1到12之间的任何整数。week
:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。command
:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在
minute
字段,表示每十分钟执行一次。
crond服务
1 | /sbin/service crond start //启动服务 |
查看crontab
服务状态:
1 | service crond status |
手动启动crontab
服务:
1 | service crond start |
查看crontab
服务是否已设置为开机启动,执行命令:
1 | ntsysv |
加入开机自动启动:
1 | chkconfig –level 35 crond on |
实例
每1分钟执行一次command
1 | * * * * * command |
每小时的第3和第15分钟执行
1 | 3,15 * * * * command |
在上午8点到11点的第3和第15分钟执行
1 | 3,15 8-11 * * * command |
每隔两天的上午8点到11点的第3和第15分钟执行
1 | 3,15 8-11 */2 * * command |
每个星期一的上午8点到11点的第3和第15分钟执行
1 | 3,15 8-11 * * 1 command |
每晚的21:30重启smb
1 | 30 21 * * * /etc/init.d/smb restart |
每月1、10、22日的4 : 45重启smb
1 | 45 4 1,10,22 * * /etc/init.d/smb restart |
每周六、周日的1:10重启smb
1 | 10 1 * * 6,0 /etc/init.d/smb restart |
每天18 : 00至23 : 00之间每隔30分钟重启smb
1 | 0,30 18-23 * * * /etc/init.d/smb restart |
每星期六的晚上11:00 pm重启smb
1 | 0 23 * * 6 /etc/init.d/smb restart |
每一小时重启smb
1 | * */1 * * * /etc/init.d/smb restart |
晚上11点到早上7点之间,每隔一小时重启smb
1 | * 23-7/1 * * * /etc/init.d/smb restart |
每月的4号与每周一到周三的11点重启smb
1 | 0 11 4 * mon-wed /etc/init.d/smb restart |
一月一号的4点重启smb
1 | 0 4 1 jan * /etc/init.d/smb restart |
每小时执行/etc/cron.hourly
目录内的脚本
1 | 01 * * * * root run-parts /etc/cron.hourly |
必须掌握的/etc
下的linux
目录知识
1 | /etc: |
环境变量
添加环境变量的方式有两种,下面以/opt/php7.2
为例进行说明
加入$PATH
1 | # 查看当前环境变量 |
使用软连接
1 | # 查看环境变量 |