整理了Linux下最为基础的命令,可以当一篇Linux入门来看。

目录资源管理

ls

list

参数说明

-l: 查看详细信息

-a: 查看隐藏文件

-al: 查看隐藏文件并且显示详细信息

输出说明

如果使用-l参数查看所有详细信息,则可以看到类似如下的输出:

drwxr-xr-x 3 root root 4096 May 4 13:37 installPacket

-rw-r–r– 1 root root 178589686 May 4 12:32 jdk-8u231-linux-x64.rpm

  • 第一个字符代表类型,d为目录,-为普通文件,l表示软链接(符号链接)还有别的但是不多见。
  • 第二个字段长度固定为9字符,分为三组表示拥有者权限、拥有组权限和其他人权限。
  • 第三个字段表示硬链接(实体链接)数。对于文件,这个数目就等同于一共有多少个路径可以访问到这个文件区块,即硬链接的个数。对于目录,绝对路径算第一个链接,另外自身有一个./也链接到这个目录,所以至少为2,而且这个目录下面的子目录都有../链接到这个目录,所以每一个子目录可以使这个链接数+1(注意目录是不允许手动创建硬链接的,所以从这个链接数就可以算出子目录的数量)
  • 第四个和第五个字段分别表示所属人和所属组
  • 第六个字段表示大小(以字节数为单位)
  • 第七个字段表示修改时间和日期
  • 最后一个字段是文件名,如果是软链接还会显示原文件的位置,可能是相对路径也有可能是绝对路径,这个要看创建软链接的时候的输入。

cd

change directory

改变工作目录,后面可以接绝对路径或者相对路径

pwd

print working directory

打印当前目录(绝对目录)

mkdir

make directory

新建目录

rmdir

remove directory

移除(空的)目录

cp

copy

复制文件。会复制文件的所有内容并且产生一个新的文件inode,映射到磁盘一块新的区块进行存储。

参数说明

-a:等于-pdr 请参考下列说明;(常用)

-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);

-r:递归持续复制,用于目录的复制行为;(常用)

-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次

-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)

-l:进行硬式连结(hard link)的连结档创建,而非复制文件本身。可以用来制作硬链接,等于ln

-s:复制成为符号连结档 (symbolic link)。等于ln -s,可以用来制作软链接(快捷方式)

-u:若 destination 比 source 旧才覆盖destination 。

后面的参数先写原文件路径再写目的目录路径

rm

remove

参数说明

-f: 就是强制删除,不会再次警告。如果没有找到文件或者目录也不会报错

-r: 递归删除,用来删除目录

mv

move

可以用来移动文件或者改名

后面的参数先写原文件路径再写目的目录路径(或者重命名的新名字)

参数说明

-f: 如果已经存在,直接覆盖

-u: 如果目标文件已经存在,当目标版本低时覆盖

ln

link

创建文件硬链接。先写链接名,再写原文件名

-s: 改为创建文件软链接。

文件操作

touch

新建文件

cat

catenate

从第一行打印文件所有内容

tac命令可以从最后一行往前显示

echo file1 > file2 可以将file1内容写入file2中,如果文件不存在会创建。如果文件中本来有内容会被覆盖。

echo file1 >> file2 可以将file1内容追加到file2的另起一行中。

参数说明

-b: 显示行号(空白行不标号)

-n: 显示行号(空白行也标号)

nl

Number of Lines

打印文件并显示行号(空白行不标号)

类似cat -b

more

以man的那种翻页形式展示文件内容。

less

支持使用/或者?进行搜索,输入n寻找下一处,q离开。感觉比more更加好用。

echo

echo不是专门写入文件的命令,但是也可以做。

echo content > file 可以将内容写入文件中,如果文件不存在会创建。如果文件中本来有内容会被覆盖。

echo content >> file 可以将内容追加到文件的另起一行中。

vim

使用vim文本编辑器打开文件,如果文件不存在则新建。

常用操作

命令模式:

  • x删除光标处字符
  • v进入视图模式,光标移动选择文本。然后按y可以复制,或者d剪切
  • yy直接复制该行,dd直接剪切该行
  • p将剪贴板中的内容粘贴到光标处
  • i进入编辑模式
  • : 进入底线命令模式

底线命令模式:

  • wq 保存退出
  • q! 不保存强制退出
  • set nu 显示行号(只是显示,并不是加入文件内容)
  • set nonu取消行号
  • ECS或者退格,返回命令模式

stat

查看文件的详细属性,如stat /etc/fstab

权限操作

chgrp

change group

改变文件或目录所属组。

-R: 表示递归改变目录下的所有内容所属组

后面先写组名,再写文件名。

chown

change owner

改变文件所属者和所属组。

chown [–R] 属主名 文件名

chown [-R] 属主名: 属组名 文件名

chmod

Change mode

改变文件属性

通过三个数字来表示属性,每一个数字通过加法得到:

  • r=4
  • w=2
  • x=1

用户和用户组管理

配置文件

/etc/passwd 用户信息配置文件

/etc/shadow 用户密码文件(已加密)

/etc/group 用户组文件

/etc/gshadow 记录组的密码的文件。

/etc/login.defs 默认用户配置

/etc/skel/ 创建用户时,会自动将这个下面的文件拷贝到用户的主目录中

用户

useradd

添加用户,后面跟用户名

-m: 同时创建用户目录

-g: 指定用户组名

-d: 指定用户目录

userdel

删除用户

-r: 同时删除用户目录所有内容

usermod

更改用户的配置,参数选项和useradd类似

passwd

后面不加任何东西可以改当前用户密码。

后面加用户名可以改用户密码

-l: 锁定用户,使得用户无法登陆

-d: 移除用户密码,同样可以达到使得用户无法登陆的目的

-u: 解锁用户,适用于锁定的用户

-f: 强迫用户下次登陆时改密码

su

Substitute User

不加东西默认切换到root用户

后面可以加上用户名表示切换到指定用户

whoami

查看自己的用户名

id

显示当前用户和用户组信息

umask

显示当前用户的umask。

umask描述了当前用户创建新文件时默认的权限,用777减去umask就得到了默认权限的代码。比如umask为022,则创建的文件默认权限为755。

用户组

groupadd

可以创建一个用户组

-g: 可以指定用户组的ID

groupdel

删除用户组

groupmod

修改用户组配置

-n: 更改名字,先写新名字,再选已有的用户组,表示将已有的一个组改为新名字

-g: 更改组ID

newgrp

切换到后面指定的组,前提是用户属于多个组而且在指定的组中。

gpasswd

可以用来添加用户到组中(不会将用户从原来的组中删除):gpasswd -a it kgroup,将it用户加入kgroup组中。也可以移除:gpasswd -d it kgroup,将it用户从kgroup中移除。

可以用来设置组密码:gpasswd kgroup。移除密码:gpasswd -r kgroup

groups

可以查看一个用户属于那些组群。groups it 查看it用户的所属组群。

硬件管理

df

Disk free

可以显示当前计算机的磁盘情况(分区)

-a: 列出所有文件系统

-h: 以易于阅读的格式显示空间大小,而不是字节数

-i: 不用磁盘容量而是inode的数量来显示

du

Disk Usage

可以显示当前目录(也可以在后面输入指定的目录)及其子目录的大小

-a: 还显示文件大小

-h: 以容易阅读的方式显示空间大小

mount

挂载,使得根目录系统以外的文件能够被访问到。

mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点

mount -a 可以马上挂载/etc/fstab中刚修改的内容。

此外,mount还可以挂载nfs等远程主机的文件系统。

umount

卸载,将挂载的目录弹出

umount [-fn] 装置文件名或者挂载点

free

显示内存空间情况。-h以便于阅读的方式显示(默认是字节数,带参数后自动换算成MB和GB等)

lspci

显示主板硬件。

lsusb

显示usb插入的硬件。

lshw

list hardware。生成硬件报告,包含所有硬件的详细信息。

fdisk

fdisk -l 查看磁盘信息。

mkfs

格式化一个分区,或者格式化一块没有分区的磁盘。可以用mkfs.etx4的形式来实际使用,将分区格式化为指定的分区格式。

lsblk

lsblk -f 可以查看所有分区的UUID和文件系统,展示比较清晰。

常见配置文件

/etc/fstab 开机自动挂载的配置文件。

/proc/swaps 查看交换分区和交换文件

系统和任务管理

ps

Processes Status 显示进程信息

-a: 显示当前终端运行的所有进程

-u: 显示进程用户信息

-x: 显示进程的参数

通常用-au就够了,后面可以加上|管道符,然后接上grep xxx,表示将显示结果交给grep过滤,找到含有xxx关键字的进程。以java为例可以写作 ps -au|grep java

前后台切换

Ctrl+z可以将当前的前台执行的任务挂起。

jobs命令可以查看此shell内后台执行的任务。

fg可以将jobs中的任务拉回前台。

命令后面加&可以让命令直接在后台执行。

pstree

以子进程父进程的关系呈现树状进程结构。

-p: 显示id

-u: 显示进程用户

可以使用pstree -pu

kill

可以杀掉进程

kill -9 id: id是通过ps查到的进程ID,一串数字。这个指令可以结束进程。

nohup

no hung up

nohup command &: 中间的command替换成正常的指令,表示即使终端退出依然在后台执行。比如可以配合脚本,让脚本一直跑在后台。

uname

-a显示完整的操作系统信息。

crontab

crontab -e可以以编辑器打开目前用户的计划任务配置文件(如果没有则新建),所有的修改、添加、删除都可以以编辑文件的方式进行配置。

文件中每一行表示一个计划任务,从左到右依次指定 分时日月周 和执行的用户,最后是命令。时间的表示可以用逗号列出多个,也可以用-来指定范围,*表示通配,而\表示每隔一段时间执行。

/var/spool/cron/目录下保存着用户的计划任务,以创建的用户名为文件名。

systemctl

系统管理,通常用来管理服务。

  • start 开启服务
  • stop 停止服务
  • restart 重启服务
  • reload 重新加载服务的配置文件
  • enable 设置开机启动
  • is-enabled 查看是否为开机启动
  • disable 取消开机启动
  • status 查看服务的状态
  • systemctl list-units –type=service 查看所有已启动的服务

前台和后台运行

  • & 后台运行
  • jobs 查看后台的进程
  • fg %job-number 把后台进程拉到前台
  • ctrl+z暂停进程
  • bg %job-number将前台暂停的进程放入后台并开始

后台服务

以mysql为例

启动服务

service mysqld start

停止服务

service mysqld stop

重启服务

service mysqld restart

查看端口占用

netstat -ntpl可以看到端口占用的情况,以及监听的进程。

软件安装和卸载

首先,简单介绍Linux的软件安装大方向,按照从高层到地层的顺序:

  • 使用在线软件包管理器安装。
  • 使用软件包管理器如rpm,一般是通过rpm运行.rpm安装包进行离线安装和卸载。类似于“添加和卸载程序”。
  • 使用开发者提供的二进制文件直接运行。开发者通常会编译好代码形成可执行程序,然后以压缩包的形式提供在网络上。解压后就可以直接运行(严格来说不算安装?)。如有需要,可自己解决环境变量等问题。
  • 使用开发者提供的源代码,自己编译安装。开发者以压缩包的形式把源代码放到网上,下载下来之后需要自己本地编译安装,需要自己解决依赖。

在线软件包管理器

根据Linux发行版的不同,主流的包管理器包括yum(Fedora, RedHat, CentOS,RedHat系默认)和apt(Debian系默认)。这些在线软件包管理器的特点是,必须连接互联网才能使用,而且包管理器可以自动解决软件包之间的依赖关系。

类似应用商店的存在。但是有一点不同的是,有时候需要添加仓库才能找到想要安装的软件。

下面介绍两个用的最多的工具。

apt-get

Debian系默认安装。

使用apt-get安装软件步骤如下:

  1. 有可能需要添加软件包仓库。软件包仓库是一些公共站点,提供软件包下载服务,可能有许多镜像站,可以查找挑选距离自己较近的镜像。编辑/etc/apt/sources.list文件,添加一行deb [web或ftp地址] [发行版名字] [main/contrib/non-free]。然后终端键入apt-get update在更新apt-get,加载新的仓库。

  2. 使用apt-get install <package_name>进行安装,如果没有找到,可以试试添加别的仓库试试。

更新软件可以使用apt-get upgrade更新所有软件,apt-get dist-upgrade更新系统。

卸载有两种方式:

  • apt-get remove packagename保留配置文件的卸载。
  • apt-get –purge remove packagename删除配置文件的彻底卸载。

yum

在线安装,所以需要联网

yum install gcc

  • install:安装rpm软件包;带上-y: 表示安装过程一路选yes,不再确认
  • update:更新rpm软件包;
  • check-update:检查是否有可用的更新rpm软件包;
  • remove:删除指定的rpm软件包;
  • list:显示软件包的信息;
  • search:检查软件包的信息;
  • info:显示指定的rpm软件包的描述信息和概要信息;
  • clean:清理yum过期的缓存;
  • shell:进入yum的shell提示符;
  • resolvedep:显示rpm软件包的依赖关系;
  • localinstall:安装本地的rpm软件包;
  • localupdate:显示本地rpm软件包进行更新;
  • deplist:显示rpm软件包的所有依赖关系。

仓库配置文件:/etc/yum.repos.d目录中

yum配置文件:/etc/yum.conf

软件包管理器

这里指rpm之类的离线软件包管理器。

rpm

rpm -ivh 后面加安装包文件即可

rpm -qa可以查看已经安装的软件,也可以用rpm -qa|grep java这种格式来过滤查找。

rpm -e 后面加软件名称(通过上面一条指令查询出来的软件全名)可以卸载软件,或者可以使用rpm -e --nodeps 来强制移除软件所有文件。

解压安装

tar解压

压缩包安装,通常是.tar.gz后缀的文件。这种安装方式最为普适,但是由于仅仅是把目录解压出来,所以可能需要自己解决依赖、设置环境变量等。

tar -zxvf 后面加压缩包即可

zip解压

unzip -d <dir> <zip_file>指定解压目录和压缩文件路径来解压。也可以带上-o来默认覆盖已存在的目录。

zip -r <zip_file> ./*将当前目录下所有文件压缩,-r表示递归添加所有子目录中的文件。

编译安装

如果压缩包里是源代码,还没办法直接运行,需要自行编译安装。

进入解压后的目录后,make指令来编译,编译后make install来安装。

如果有报错,可能是依赖缺少,需要花点时间先安装所有依赖的其他软件包。

配置环境变量

如果是rpm或者yum安装的话,通常不用配置环境变量,而使用tar压缩包安装则一般要配置环境变量才能在任何目录中使用应用。

环境变量配置文件所在的位置是:/etc/profile 直接在文件里编辑即可。

格式大概是:用:做分隔,用$取变量,要记得export出去才能使用。例如配置jdk环境变量:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile命令可以使得修改立即生效,之后可以echo $PATH来查看现在的环境变量内容

网络

常用配置文件

/etc/sysconfig/network-scripts/* 保存着网卡的配置信息

/etc/resolv.conf 域名解析器的配置文件

/etc/hosts 和windows下的hosts文件相同,事先储存一些域名和ip的对应信息

/etc/services 定义了Linux系统中所有服务的名称、协议类型、服务端口等信息

traceroute

yum install traceroute

可以查询到指定地址中途的路由节点

ifconfig

查看网络配置信息

ping

-c指定发送次数

netstat

查看网络状态,得知整个Linux系统的网络情况。可以查看网络连接、路由表、接口统计、伪装连接、组播成员

arp

查看arp表

tcpdump

抓包。例如tcpdump -i eno16777736 可以抓取指定网卡的数据包。

scp

远程复制(传输文件)。由于是基于ssh连接的,所以端口号要用-P 参数指定远程主机的ssh服务端口号(默认22)。

rsync

远程同步文件(每次只复制改变的部分)。适用于在计划任务中进行备份。

安全策略

last

查看成功的登陆记录

-n: 后面接一个数字,表示显示最近多少条记录

还可以在后面接上一个用户名,表示只查看这个用户的登陆记录

lastb

查看失败的登陆记录

-n: 后面接一个数字,表示显示最近多少条记录

还可以在后面接上一个用户名,表示只查看这个用户的失败登陆记录

iptables

iptables -I INPUT -s 159.203.219.38 -j DROP 封禁ip地址,可以禁止和该ip地址的双向沟通

iptables -D INPUT -s ***.***.***.*** -j DROP 解封ip地址

iptables --list 查看封禁和允许的配置

iptables -A OUTPUT -m string --string "www.baidu.com" --algo bm --to 65535 -j DROP 封禁指定的域名,禁止和该域名的双向沟通。

firewall

除了要在运营商那里配置安全组之外,本机的防火墙也要设置。安全组可以理解成套在机子外面的一层保护,但是如果本机不设置还是无法与外界交流。

查看已有规则

firewall-cmd --list-ports

开放端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

关闭、开启和重启服务

开放端口之后要重启才能生效

systemctl restart firewalld.service

也可以直接关掉,以后就不用操心防火墙了。

systemctl stop firewalld

如果担心安全问题可以再启动起来。

systemctl start firewalld

应对暴力破解

主要有以下策略:

  1. 修改远程登录端口
  2. 限制登录IP
  3. 使用非root用户登录
  4. 使用其他工具,如fail2ban

第一条中,修改/etc/ssh/sshd_config文件中的Port 将前方的#注释删除,并将22修改为你想要使用远程登录的端口,例如54231。然后重启sshd。

第二条中,以sshd:172.16.*.*的格式在/etc/hosts.allow文件中添加允许ssh登陆的ip记录,并在/etc/hosts.deny文件中添加sshd:all:deny记录,就可以把除允许ip外的所有ip全部封禁。然后使用service sshd restart指令来重启使得配置生效。

第四条中,可以使用fail2ban配合firewall或者iptables对登陆失败过多的ip地址进行封禁。具体可以参考CentOS 7 下安装和使用 Fail2ban

关于前三条具体可以参考:拒绝ssh远程暴力破解

bash技巧

输出流定位

在命令后面加上> 文件名可以把命令的结果输出到文件中,而不是显示在控制台上。

>> 文件名的效果是,如果文件已经存在,则会另起一行把内容写在后面,不会覆盖掉原来的内容。这个在给主机添加公钥的时候非常方便。

管道符 |

使用管道符|连接两个命令,可以把前一条命令的执行结果作为后一条命令的参数之一(具体哪个参数要看命令本身)一次完成计算。最后输出的结果是后面命令的结果,只不过使用的内容来自前者。

最常用的应用之一就是ps -aux | grep xxx这样查询进程了。

一次多命令

;分号可以在一次先后执行两条命令,两条命令的执行彼此独立。比如echo abc ; echo ddd

&&连接两条命令时,只有当前一条命令执行成功后,后一条才会开始执行。

||连接两条命令时,只有当前一条命令执行失败时,后一条才会执行。

screen

screen是一款文字界面增强软件。如果在只安装了文字界面的虚拟机上,由于鼠标无法使用,就无法选择文本进行复制粘贴的操作。使用screen进入一个窗口后再操作,可以用组合键Ctrl+a+[ 进入复制界面,此时窗口内显示的内容被定格,可以用键盘上下左右移动光标选择复制开始的位置回车,再在复制结束的位置回车就可以将中间的内容存入剪贴板了。然后在任何需要的地方Ctrl+a+] 即可粘贴所复制的内容。

界面切换

以CentOS7为例,如果安装了图形界面,则可在字符界面和图形界面两者之间切换:

systemctl set-default multi-user.target设置默认以字符界面启动,重启生效。

systemctl set-default graphical.target设置默认以图形界面启动,重启生效。

startx在字符界面时,启动图形界面。

快捷操作

Ctrl+L 清屏,效果等同于clear

Ctrl+R 关键字搜索历史使用过的命令

Ctrl+xx (连按两下x) 跳到行末或行首

!! 代表上一条命令

!$ 代表上一条命令的最后一个参数

history 查看历史输入的命令,储存在.bash_history中

未完待续…

以后随着学习的深入将继续补充这篇文章。