1,基本概念
Shell(命令行):是一个程序,接受键盘输入的命令,并将命令传递给操作系统进行执行。
Bash:Bourne Again Shell, 是大多数linux系统分之中所带的一种shell程序。
命令提示符:
[username@machinename]$: $ 表示普通用户登录
[root@machinename]#: #表示root,超级用户登陆
2 简单命令:
help [command]: 能显示出命令commad的具体参数设置
date: 显示时间
cal: 显示日历
df:显示硬盘的剩余存储空间等
free: Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer
exit: 结束终端会话
3.文件夹
linux系统的文件路径如下图所示,几个重要的文件夹的用途:
/boot: 系统内核文件,和开机相关文件
/bin: 二进制程序文件,系统进行调用和执行
/dev: 和设备相关的文件,磁盘,usb等
/etc: 系统的配置文件
/home: 用户文件夹,每一个用户都在该路径下拥有一个文件夹,存放自己的数据,如 /home/zack
/lib: 内核系程序共享的库文件,类似于windows系统中的DLLS
/usr: linux系统中最大的文件夹,包括所有普通用户的程序和相应的支持程序
/usr/bin: linux distributions 安装的一些可执行程序文件
/usr/share: /usr/bin目录下程序共享的一些配置文件,数据,图片等
/usr/lib: /usr/bin目录下程序的共享库文件
/usr/sbin: root用户(系统管理员)的一些程序文件
/usr/local: 用户安装的一些程序文件和支持文件,如/usr/local/bin中为可执行程序。
/var: 可变化的一些数据文件,/var/log/messages 为日志文件
4.文件和文件夹操控命令
(. 为当前目录;.. 为上一级目录,~ 为当前登录用户目录)
pwd : 打印当前文件夹路径名 (print working directory)
cd : 进入相应的文件夹路径,可以是相对路径和绝对路径
cd ~ : 进入当前登陆用户的用户目录 (/home/user)
ls : 列出文件夹内的内容(文件夹和文件)
常用参数如下:
ls -a : 列出所有文件,包括隐藏文件(文件名以 . 开头)
ls -d : 只列出文件夹
ls -l :列出文件及其相关详细信息
ls -l 显示如下的格式:
相应的含义:
-rw-r--r--: 总共十个字符,第一个表示文件类型,后面每三个为一组,依次表示读r,写w,执行x权限,第一组为文件主人的权限,第二组为主人所在用户组的权限,第三组为所有用户权限
file : 检测文件的类型 (在linux系统中,文件的后缀名并不需要和文件的类型匹配)
file filename
less: 查看文本文件的内容
less filename
less 会打开该文件,在less模式下,键盘的命令如下:
箭头可以上下移动,q为退出
mkdir: 创建文件夹,可以同时创建多个文件夹
mkdir dir1 dir2 dir3
cp: 复制文件或文件夹
cp item dir 复制一个文件或文件夹到另一个文件夹
cp item1 item2 dir 复制多个文件到一个文件夹
相关参数: -iv 两个参数最好每次加上, 复制文件夹时加参数 -r
示例命令:
mv: 移动或重命名文件(在同一个文件夹重命名,在不同文件夹移动,最终原来的文件没有了)
mv item1 item2 移动或重命名文件或文件夹
mv item1 item2 dir 移动多个文件到文件夹
参数: 最好每次加上 -iv
命令语句示例及含义:
rm: 删除文件或文件夹(可同时删除多个)
注意:使用前最好用ls查看下,使用时最好带选项 -i
rm file1 file2
参数和示例:最好带参数-iv, 删除文件夹带 -r,递归删除文件夹内所有内容
5,软链接和硬链接
参考:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。(ls -i 命令能查看文件inode号)
硬链接(hard link):若一个 inode 号对应多个文件名,则称这些文件为硬链接。每一个文件都有一个默认的硬链接(可以理解为文件名),再创建硬链接时,多了一个指向该文件的指针。(当文件的硬链接数为0,文件内存会被回收)
局限性:硬链接只能指向文件,只在同一个磁盘分区中起作用;只能对已存在的文件进行创建;
软链接(soft link/system link):软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。(类似windows快捷方式?)
特点:软链接可以指向文件或文件夹,软链接可交叉文件系统;可对不存在的文件或目录创建软链接;软链接有自己的文件属性及权限等;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常
上图中表明了两者的区别,硬链接通过inode号直接找到文件内容,软连接先通过自己的inode号找到自己的文件内容,从文件内容中读取到目标文件的路径,再从该路径拿到目标文件的inode号,从而找到目标文件。
下图是命令ls -li 的结果,第一列为文件的inode号, 第二列十位字符的第一个字符若为l时,表明该文件是软链接,第三列的数字表明该文件(文件夹中文件)的硬链接数。
相关命令语句:
https://www.cnblogs.com/zr520/archive/2016/11/06/6036468.html
创建硬连接:(文件)
ln file link
创建软连接:(文件或文件夹)
ln -s item link (示例: ln -s /bin/less /usr/local/bin/less)
删除连接: rm link
修改软链接:ln -snf newitem link (这将会修改原有的链接地址为新的地址)
例如:
创建软链接:ln -s /var/www/test test #test指向/var/www/test 修改软链接:ln -snf /var/www/test1 test #test指向/var/www/test1
6. linux命令的类型
linux的一个命令语句可以分为下面四种类型:
可执行程序(executable program):和所有/usr/bin目录下的程序一样
shell内建命令(command built into the shell):bash程序内置的一些命令(shell builtins),如命令 cd
shell方法(shell fuction):环境变量中配置的shell scripts
别名(alias): 从其他命令创建的别名
常用命令
type:查看该命令的种类(上面四种中一种)。
which:显示可执行程序所在位置,只适用于可执行程序类型的命令。
help: 显示shell builtins(shell内建方法)的帮助文档, 对于部分可执行程序,可以用 --help
man :显示可执行程序的使用手册文档 (大部分可执行程序支持) (q退出)
man -k reg(正则表达式):搜索正则表达式匹配的命令
apropos: 和man -k 一样
whatis: 显示命令的简介
info: 显示命令的简介信息入口(类似超链接)(q退出)
alias: 创建别名,自定义命令的名字 (可以将多条命令加在一起,下面的foo,相当于执行后面三个命令)
至此,查看一个命令的帮助文档,可以用help, --help, man 或info。
7.标准输入和输出,重定向,管道
https://ryanstutorials.net/linuxtutorial/piping.php
linux中有如下三种标准文件流,应用程序从标准输入接受数据,对于程序执行结果输出到标准输出,对于程序执行时的异常信息或状态码等输出到标准错误输出。
STDIN: 标准输入,文件描述符为0,从键盘输入
STDOUT: 标准输出,文件描述符为1,输出到屏幕
STDERR:标准错误输出,文件描述符为2,输出到屏幕
重定向:
- > 重定向标准输出到文件,(文件不存在时创建,存在时覆盖其内容)
- >> 重定向标准输出到文件,(文件不存在时创建,存在时追加)
- < 重定向标准输入,从文件读取
- 2> 重定向标准错误输出.
- 示例:
- 1,下面语句,将命令ls的输出重定向,即不输出到屏幕,而输出到ls-output.txt文件
- (下面命令可以创建或覆盖文件来产生一个空白文件)
2,追加
3,重定向标准错误输出
4,下面三个命令将标准输出和标准错误都重定向到一个文件
5,下面命令,从文件读取内容作为cat程序的输入
管道符号
| 管道符,将一个程序的输出,重定向为下一个程序的输入(管道符是将一个命令的输出,传给下一个命令的输入,重定向 > 是将一个命令的输出,传到一个文件)
(管道符和标准输出重定向区别:https://askubuntu.com/questions/172982/what-is-the-difference-between-redirection-and-pipe)
如下命令,将ls输出作为less命令的输入
sort : 对输入内容进行排序 (https://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html)
下面命令,按时间顺序进行了排序
下面命令将输出内容排序后再输出到less
uniq:忽略掉重复行(即多条重复记录时只显示一条)
uniq -d 只显示出重复行的数据
wc: 显示出文件的行数,字数和字节数
wc -l 只显示行数
grep: 只显示复合匹配条件的记录
grep -i 忽略大小写
grep -v 只显示不匹配的行
下面命令显示内容中包含 zip 的行
head: 默认只显示前十行
tail: 默认只显示后十行
head/tail -n 5 :显示前/后5行
tee :从标准输入读取内容,同时输出到标准输出和文件 (tee fitting: 三通接头)
如下面命令输出到文件ls.txt,并输出到grep命令
8,命令扩展(command expansion)
对于命令行输入的命令,在起作用前,shell会对其含义进行扩展。如下面的第二条命令echo *,echo没有打印*,这是因为shell将*扩展为当前路径下的所有文件名称。
8.1 路径名称扩展:
对于输入的通配符(wildcards),shell会扩展成对应的路径,如下面的命令
常用的通配符及其含义如下:
通配符示例:
8.2 算术扩展:
对于整数的简单计算语句,shell能进行扩展,表达式为$(arithmetic expression)
8.3 大括号扩展
大括号扩展能创建多个可选项,如下面的几条命令
其常见的用途是用来创建多个文件夹
8.3 参数扩展
对于变量,shell能扩展出其对应值,如下面的命令中 USER为一个变量 (通过printenv|less)能查看到所有变量名称
8.4 命令取代
将一条命令的输出进行扩展
8.5 抑制命令扩展
有时候不想shell对输入的语句进行扩展,可以采用双引号和单引号来抑制这种扩展,如下面第一条命令,shell将$5进行了扩展为空字符。
双引号:使用双引号后,部分内容不能进行扩展 ,路径名扩展和word spliting不起作用,($, \ 还起作用, 即算数扩展,参数扩展和命令取代还起作用)
单引号:使用单引号后,所有扩展都不能使用
转义符 \ :有时候只是需要单个符号不被扩展,可以使用转义符 \
9,键盘快捷键
游标移动:
ctrl -a :移动到行开头; ctrl -e :行结尾; ctrl -l 清理屏幕
剪切和粘贴:
ctrl -k :游标出剪切到行末尾; ctrl -y : 粘贴剪切的内容到游标出。
字符操作:
自动补齐:输入一两个字母后按tab,能自动补全
Alt -?(或按两次tab):显示所有可能补齐的选项
clear: 清理屏幕
history: 显示历史命令,bash默认显示前500条命令
Ctrl -r 向上搜索记录, 输入搜索条件, 找到后ctrl -j 复制到当前
历史命令扩展:
按上下箭头能切换到历史命令中上一条和下一条(复制命令到当前游标出)
!88, 能切换到history list中的第88条命令 (即执行第list中的第88条命令)
10,权限管理
id: 显示用户id,组id,用户组等信息 (id user,无user时默认显示当前用户)
在linux系统中每个用户都有自己的id,都属于一个用户组,每一个用户组都有id,root用户的id为0。用户账号的信息都定义在 /etc/passwd 文件中,用户组的信息都定义在 /etc/group 文件中,当创建用户和用户组时,这些信息都会被更新。(/etc/shadow 存放用户的密码信息)
useradd: 创建用户
groupadd: 创建用户组
文件的读写权限
linux的每个文件都有十个字符来描述其读,写和执行相关的权限,如上面ls -l 命令显示的第一列十个字符。第一个字符为文件类型,接下来三个字符为文件所属用户(owner)的读,写,执行权限,随后三个字符为用户组(group)的读,写,执行权限,最后三个为所有用户(world)的读,写,执行权限。
文件类型:- (普通文件), d(文件夹) , l(软链接), c, b
读,写,执行权限:- , r , w , x(执行)
文件权限属性示例:
chmod: 改变文件权限(只有文件主人和超级用户能修改)
上面的600为三个八进制数,每一个八进制对应三个二进制数,相应权限如下:6(rw-),0(---),0(---);常用的八进制权限数据如下:
除了支持八进制数外,chmod命令还支持字母,相应含义如下:(u:用户,g:用户组,o:其他用户,a:所有用户)
常用权限修改如下:(u+x:为用户添加执行权限;u=rx:设置用户权限为读,执行)
chmod u+x,go=rw test2 (注意逗号后面不能加空格) ,该命令为test2文件用户添加执行权限,用户组和其他用户设置为读,写权限。
umask: 设置默认的权限 (默认的umask为:0002)
umask 数字的含义:对于数字0,原来的权限不变,对于数字1,原来权限取消
umask 0002
umask 0022
下面的命令中看到默认的umask为0002,创建test3.txt文件,权限为-rw-rw-r--,删除该文件后,修改umask为0000,再创建该文件,权限为-rw-rw-rw-。
改变登陆的用户id:
1,退出后新用户登陆
2,su命令: su [-l ] [user]
su:切换到指定的用户登录,-l 指该载入用户的登录环境,并切换到该用户目录文件夹(和该用户登录几乎一样),没指定用户名时指超级用户,-l 也可省略成 -。
切换为超级用户,需要密码验证
以超级用户执行一条命令:(注意命令用单引号,防止扩展)
3,sudo命令
以超级用户(不指定用户名时)执行命令,通常输入自己的密码或不用输密码,配置文件中会配置,还会配置用户能执行的命令
sudo -i 切换到超级用户
chown:改变文件主人和用户组(需要超级用户权限)
chown [owner] [:[group]] file
相关示例含义
chown bob test.txt 将文件text.txt主人改为bob
chown :bobs test.txt 将文件text.txt用户组改为bobs
passwd : 改密码(默认为当前用户)
11,进程
ps: 查看正在运行的进程
https://www.cnblogs.com/wxgblogs/p/6591980.html
上述显示结果中PID为进程ID,TTY为终端设备类型(tty和pts参见:https://segmentfault.com/a/1190000009082089)
ps -x :查看较为完整的进程信息,如下图
上面显示的STAT表示进程的状态,具体含义如下:(R:running;S:sleeping;T:stopped;)
top:动态显示进程(每三秒刷新) (q:退出)
kill: 终止进程
kill [signal] PID
常见signal如下:
killall:向多个进程发送信号
killall [-u user] [-signal] name
jobs : 显示所有活跃的作业 (jobs -l 还能显示出每个作业的PID)
https://www.cnblogs.com/EasonJim/p/6849885.html
(ctrl + Z: 将当前程序挂起至后台;ctrl + c 终止前台程序)
下面命令中运行一段python脚本程序,按ctrl + Z将程序挂起,通过jobs能看到该作业。
1 表示作业ID
+ 表示一个当前的作业, 若为 - ,表示下一个作业
bg : 将作业放在后台执行(作业ID作为参数)
下面命令将上述的python脚本程序放在后台执行,通过jobs可以看到该程序的状态由 stopped变为了running
fg : 将后台作业放在前台执行(作业ID作为参数)
shutdown: 关闭或重启系统
shutdown -r now 关机后重启
shutdown -h now 关机后不重启
shutdown -r +10 10分钟后重启
shutdown -r 10:00 10点钟重启
shutdown -h +10 10分钟后关机
shutdown -h 10:00 10点钟关机
reboot: 重启系统 (需要管理员权限)
12,vim编辑器的使用
https://www.cnblogs.com/next-open/p/3662899.html
vim filename 进入vim编辑器(文件不存在时创建新文件)
Vim 编辑器有命令模式和编辑模式两种,刚进入文件时为命令模式,只能输入命令,不能输入文本内容, 按键盘 i (或insert)进入编辑模式,按esc回到命令模式。
下面是命令模式下的常用命令(必须输入冒号。冒号后无空格)
:help [keyword] 搜索帮助文档中的内容
:q 退出编辑器
:q! 强制退出编辑器
:w 保存
:wq 保存并退出
命令行模式下的按键:(0 到行开头,$到行末尾)
复制和粘贴:https://www.cnblogs.com/didi/p/4067193.html
y 复制
p粘贴
p 粘贴剪切板里的内容在光标后
(在其他文件复制代码后,进入vim编辑器,insert进入编辑模式,按 shift+insert能粘贴复制的代码)
vim配置(python版)参考:https://www.cnblogs.com/cjy15639731813/p/5886158.html
vim打开多个文件:
一、如果在终端还没有打开vim vim -o 文件1 文件2 #vim横向分屏打开多个文件 vim -O 文件1 文件2 #vim纵向分屏打开多个文件 二、如果在终端已经打开vim :vs 文件 #横向分屏打开另一个文件 :sp 文件 #纵向分屏打开另一个文件 :split 文件 #纵向分屏 :vsplit #横向分屏 三、关闭窗口 :qa #关闭所有 :q或者:close #关闭光标所在窗口 :only #关闭除光标所在的窗口之外的其它窗口 四、切换窗口 ctrl + w w(w按两次) ctrl + hjkl
vim常用命令
:set number 显示行号 :set nonumber 不显示行号
vim多行注释和取消
多行注释: 1. 进入命令行模式,按ctrl + v进入 visual block模式,移动光标上移或者下移,选中多行的开头 2. 按大写字母I,再插入注释符,例如# 3. 按esc键就会全部注释了 取消多行注释: 1. 进入命令行模式,按ctrl + v进入 visual block模式 2.移动光标上移或者下移,选中多行的开头 3. 按d键就可全部取消注释
13. 使用SCP命令传输文件
从远端复制文件到本地:
sudo scp root@192.168.0.1:remote_path/remote_file .
从本地复制文件到远端:
sudo scp local_file root@192.168.0.1:remote_folder
14. 将远程电脑的文件挂载到本地命令
sudo sshfs -o allow_other,nonempty,reconnect root@192.168.2.33:/image/ ./image/ #将远程电脑(192.168.2.33)的image文件夹挂载到本地image文件夹下
fusermount -u 本地挂载文件夹绝对路径 # 取消挂载
15. 复制文件夹下的前600个文件
ls |head -n 600 | xargs -i cp {} ../temp/ #将当前文件夹下的前600个文件复制到 ../temp文件夹下
ls |tail -n 600 | xargs -i cp {} ../temp/ #将当前文件夹下的后600个文件复制到 ../temp文件夹下
16. 后台tmux使用
https://www.cnblogs.com/lizhang4/p/7325086.html
tmux #打开一个窗口 tmux ls # 查看当前活动的窗口 tmux attach -t 0 #打开之前创建的0号窗口
tmux [new -s 会话名 -n 窗口名] #启动新会话/窗口
tmux at [-t 会话名] #恢复窗口
tmux kill-session -t 会话名 #关闭会话/窗口
tmux ls | grep : | cut -d. -f1 | awk \'{print substr($1, 0, length($1)-1)}\' | xargs kill #关闭所有窗口
tmux的快捷键
1.关闭当前窗口,但是窗口中的程序还在运行 Ctrl+b d //detach当前session(可以认为后台运行) 2.关闭当前窗口,且关闭窗口中的程序 Ctrl+d //关闭窗口,终止session
17. 安装包管理工具
apt-get命令 (Advanced Package Tool)
apt-get,是一条linux命令,适用于deb包管理式的操作系统(例如Ubuntu系统),主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
apt-get update 更新源文件 apt-get install package 安装指定包文件 apt-get install package --only-upgrade 升级指定包 apt-get install package --resintall 重装 apt-get source package 下载包的源代码 apt-cache search package 寻找指定安装包 apt-cache show package 显示包相关信息 apt-cache depends package 显示包的依赖哪些包 apt-get remove package 删除包 apt-get remove package --purge 删除包, 包括删除配置文件等 apt-get autoremove package --purge 删除包,包括其其依赖包和配置文件等(推荐使用)
dpkg命令
dpkg
即 package manager for Debian ,是 Debian 和基于 Debian 的系统中一个主要的包管理工具,可以用来安装、构建、卸载、管理 deb
格式的软件包。
dpkg 主要是用来安装已经下载到本地的 deb 软件包,或者对已经安装好的软件进行管理。而 apt-get 可以直接从远程的软件仓库里下载安装软件。
dpkg -i package 安装指定包 dpkg -l 列出已安装的包 dpkg -L package 查看包的安装位置 dpkg -r package 删除指定包 dpkg -P package 删除指定包及其配置文件
18. ip和端口扫描工具
nmap命令: (https://www.cnblogs.com/LyShark/p/10637507.html)
nmap -sP 192.168.1.100-254 // ping 指定范围内的ip nmap -sP 192.168.2.0/24 // 寻找192.168.2.0-192.168.2.255范围内的在线主机
nmap -PS22,80,443 192.168.1.7 // 采用SYN扫描,探测主机192.168.1.7的22,80,443端口状态
nmap -PU 192.168.1.7 // 采用UDP扫描,探测主机192.168.1.7的开放端口状况