Linux一级目录介绍

  • /bin:存放所有用户常用的命令,系统必不可少的命令,如:ls、chmod等
  • /boot:存放启动引导文件,比如bootloader以及内核
  • /dev:设备文件
  • /etc:系统配置文件
  • /home:普通用户目录。相对windows的Document and settings目录
  • /initrd:特殊的块设备,文件加载到内存
  • /lib:库函数以及内核模块
  • /lost+found:这个目录一般是空,只有当系统不正常关机后,会存放一些恢复出来的文件裁片
  • /misc:磁带机挂载目录
  • /media: 光盘挂载目录
  • /mnt:移动设备挂目录
  • /opt:另外安装的应用程序存放目录
  • /proc:当前内核映射,一个虚拟的文件系统
  • /root:管理员root的主目录,相当于windows的Administrator目录
  • /sbin:管理员命令,系统命令,如shutdown、reboot,用于启动系统,修复系统。只有管理员可以执行
  • /sys: 硬件设备驱动程序信息
  • /tmp:临时文件夹,可以操作
  • /usr:应用程序存放目录,相当于window的program files目录
  • /usr/bin: 后期安装的一些软件运行脚本
  • /usr/bin: 用户安装的系统管理的必备程序
  • /var:日志及系统文件

    常用操作命令

    查看磁盘分配情况

    1. $ df -h
    2. 文件系统 容量 已用 可用 已用% 挂载点
    3. devtmpfs 908M 0 908M 0% /dev
    4. tmpfs 919M 48K 919M 1% /dev/shm
    5. tmpfs 919M 840K 919M 1% /run
    6. tmpfs 919M 0 919M 0% /sys/fs/cgroup
    7. /dev/vda1 50G 11G 37G 23% /
    8. tmpfs 184M 0 184M 0% /run/user/0
    9. overlay 50G 11G 37G 23% /var/lib/docker/overlay2/6740dee82148297e8decfca9475aeaeaa45392b15b93cee6974bbebca425cc46/merged

    查看当前文件下各文件情况

    1. $ du -sh /usr/* |sort -h
  • du -sh :文件分配情况

  • /usr/* :usr文件夹下各个文件夹
  • |sort -h :按照文件大小排序

    01-文件操作命令

  • 查看文件目录 ls

  • 移动或重命名文件 mv
  • 拷贝文件 cp
  • 删除文件 rm
  • 创建新文件或者更新文件时间 touch

    查看目录 ls,list的缩写

    参数:
    -a :显示所有文件,包含隐藏文件
    -l : 显示详细信息
    -d : 查看目录本身的属性而非子文件ls
    -h :人性化的方式显示文件大小
    -i :显示inode节点
    1. ls -l #列出当前目录下所有文件详细信息,文件权限、所有者、大小、修改时间及名称
    2. ls -R #列出当前目录及所有子目录的文件名
    3. ls -t #依照文件最后修改时间的顺序列出文件名

    移动文件或重命名文件 mv,move的缩写

    将一个文件移动到另外一个位置,相当于剪切,移动的过程中可以修改文件的名字,当目标文件和源文件名不一致时,mv就是重命名的作用
    mv [参数] 源文件 目标文件
    参数:
    -f :强制覆盖已有文件
    -i : 在覆盖已有文件前提示用户
    -u : 目标文件的更新时间比源文件还新,不覆盖目标文件
    -v :在移动文件时输出相关信息
    1. mv file1 file2 #将file1更名为file2
    2. mv file1 dir1 #将file1移动到dir1目录下,名称仍未file1
    3. mv dir1 dir2 #将目录dir1更改为dir2

    拷贝文件 cp

    cp [源文件(被复制的文件)] [目标文件(复制后的文件)]
    参数:
    -a:将源文件的状态、权限等属性都进行复制
    -r:如果源文件中是目录,则将目录下的文件都进行拷贝
    -p:连带文件属性进行复制
    -f:如果已经存在同名目标文件,在复制前先进行删除在进行复制
    1. cp file1 file2 # 将file1复制为file2
    2. cp file1 dir1 #将file1复制到目录dir1下,名称仍未file1
    3. cp -r dir1 dir2 #将dir1目录下的文件全部复制到dir2
    4. cp /temp/file1 file2 #将temp目录下的file1文件,复制到当前目录下,名称为file2

    scp 本地和远程服务器传输文件

    1.从服务器复制文件到本地:scp root@47.96.0.230:/code/hello.js /home/myfile/
    root是目标服务器(有你需要拷贝文件的服务器)的用户名,
    47.96.0.230是远程服务器IP地址,如192.168.1.100,后面紧跟的:不要忘记
    /code/hello.js是目标服务器中你要拷贝文件的地址,接一个空格,后面的/home/myfile/是本地接收文件的地址【绝对地址以/开头,相对地址不用加/】。

2.从服务器复制文件夹到本地:
scp -r root@47.96.0.230:/code/ /home/myfile/
只需在前面加-r即可,就可以拷贝整个文件夹。

3.从本地复制文件到服务器:
scp /home/myfile/test.txt root@47.96.0.230:/code/

4.从本地复制文件夹到服务器:
scp -r /home/myfile/ root@47.96.0.230:/code/

删除文件 rm

  1. rm file1 #删除文件名file1文件
  2. rm x* #删除文件名以x开头的文件
  3. rm /temp/* #删除temp目录下的所有文件

touch

创建一个空文件,如果创建的文件已经存在,则会把这个文件的修改时间更新为当前系统时间

  1. touch file1 #创建file1文件
  2. touch /tmp/file2 #在目录tmp下创建file2文件

02-目录命令

  • pwd 查看当前路径
  • cd 切换当前路径
  • mkdir 创建新目录
  • rmdir 删除目录
  • rm -r 删除非空目录

    查看当前路径 pwd

    pwd是print name of current/Working Directory的缩写。显示当前用户的绝对路径。

    切换路径 cd

    cd之后以/开头的都是绝对路径。进入系统时~,表示在root目录下。
    切换绝对路径必须以/开头。也可以是..表示切换到上级目录。
    cd - :表示回到最后一次切换目录前的目录
    工作中要常用TAB按键,按一下TAB会自动补全匹配到的文件名称,如果路径只有一个,那么会自动补全。如果有多个匹配到的结果按第二下,会出现多个可能的结果。

    创建目录 mkdir

    使用 -p 参数来创建多级文件夹

    1. mkdir -p test01/test02/test03 #如果不加-p,只能创建一层目录

    mkdir -m:创建目录时,并设置权限【如:664, 744】

    1. mkdir -p -m 664 d1/d2/d3/d4
    2. mkdir -m 744 card

    关于权限说明

    1. -rw------- (600) 只有拥有者有读写权限
    2. -rw-r--r-- (644) 只有拥有者有读写权限,其他用户只有读的权限
    3. -rwx------ (700) 只有拥有者有读/写/执行权限
    4. -rwxr-xr-x (755) 拥有者有读/写/执行权限,其他用户只有读/执行权限
    5. -rwx--x--x (711) 拥有者有读/写/执行权限,其他用户只有执行权限
    6. -rw-rw-rw- (666) 所有用户都有文件的读写权限
    7. -rwxrwxrwx (777) 所有用户都有文件的读/写/执行权限

    删除目录 rm

    rm -r:删除非空目录,如果希望直接删除可以使用rm -rf

    03-文本显示的命令

  • echo 显示内容

  • cat 查看文件内容
  • more 或less 逐屏查看文件内容,类似cat但可以分页显示
  • head 用来显示开头某个数量的文字区块,head -5 hello.txt,显示文件的前5行
  • tail 查看文件内容,使用参数-f常用于查阅正在改变的日志文件
  • vi编辑文件
    • 按下i进入编辑状态, 使用/进行搜索,使用n来进行查找下一个
    • 按下ESC退出编辑,在按下:wq保存退出
    • 按下:q!,不保存退出。如果没修改文本,直接使用:q就可退出

      vi的模式

  1. 命令模式(默认):vi启动时,开始就是命令模式,可以在文件中移动,剪切、复制和粘贴文本等。
  2. 文本编辑模式
  3. 命令行模式:文本编辑完成,输入:键可以进入命令行模式,等待用户输入命令。多数文件管理命令都是在此模式下进行。命令执行完毕后,vi会回到命令模式。

    命令模式

    光标:

    • h 光标左移
    • l 光标右移
    • j 光标下移
    • k 光标上移

翻页

  • ctrl + f 向下翻页 【f,front】
  • ctrl + b 向上翻页 【b,back】
  • ctrl + d 向下翻半页
  • ctrl + u 向上翻半页

vi文本编辑时的快捷键

  • i :【常用】光标在当前位置进入文本输入模式
  • I :【常用】从行首 进入文本输入模式
  • a:光标后退一格 进入文本输入模式
  • A: 【常用】 从行尾 进入文本输入模式
  • o:光标所在行下新起一行 进入文本输入模式
  • O:光标所在行上新起一行 进入文本输入模式
  • s:删除光标所在的字符,当前选择的字符 进入文本输入模式
  • S:【常用】删除光标所在的行 进入文本输入模式

    命令行模式

  • :w 把写入保存

  • :q 退出当前vi编辑器打开的文件
  • :! 强制保存
  • :n 搜索时的下一个
  • :N 搜索时的下一个
  • :行号 快速定位到当前文件第几行
  • /123 从光标位置开始向后搜索123内容
  • ?123 从光标位置开始向前搜索123内容
  • :set number 显示行号
  • shift + % 匹配到对应的括号
  • shift + $ 光标移到行尾 | 快速跳转到n行 | 1: 输入:n
    2: nG | | —- | —- | | 快速到行首 | 1: 数字0
    2: shift + ^ | | 快速到行尾 | shift + $ | | 快速跳转文本第一行开头 | gg | | 快速跳转最后一行开头 | shift+g即大写G | | 删除当前行 | dd | | 删除所有行 | dG | | 删除范围行 | :2,5d | | 删除当前行之前的所有行 | :1,.-1d | | 删除当前行之后的所有行 | :.+1,$d | | 删除以#开头的注释行 | :g/^#/d | | 撤销上步操作 | u |

image.png

04-文件搜索命令

1:locate文件

通过后台数据库按照文件名搜索,速度很快
数据保存在/var/lib/mlocate后台数据库
可以updatedb命令立即更新数据库
只能搜索文件名

2:whereis

搜索命令所在的路径以及帮助文档所在位置
whereis ls

3:which

可以查看到命令别名 which ls,能看到的都是外部安装的命令,shell自带的命令无法查看

4:find文件搜索命令

find [搜索范围] [搜索条件]
按名称搜索

  1. find / -name hello.txt

find搜索文件的内容
  1. // 按照文件搜索
  2. find . -name package.json
  3. // 搜索文件的内容
  4. // 查找目录下的所有文件中是否含有某个字符串
  5. find .|xargs grep -ri "IBM"
  6. // 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名
  7. find .|xargs grep -ri "IBM" -l

通配符搜索

    • 匹配任意内容
  • ? 匹配任意一个字符
  • [] 匹配中括号内的任意一个字符

    1. find /dev -name "ab[cde]"

    按时间搜索

  • atime 文件访问时间

  • ctime 改变文件属性
  • mtime 修改文件内容

    1. find /nginx/access.log -mtime +5

    参考文档

    05-alias别名的使用

    可以配置快捷键。

    1. alias ll='ls -l' #定义ll为ls -l的别名
    2. alias la='ls -A' #la显示所有文件,包括以.开头的
    3. alias lr='ls -R' #lr显示目录下以及子目录的所有文件

    注意:如果推出shell编辑,再次登录时alias的设置失效。如果希望一直保留,可以在/root/.bashrc中进行配置。配置之后执行

    1. source .bashrc
    2. # 或者
    3. . .bashrc

    使配置的命令生效

    取消别名 unalias

    06-man帮助命令

    基本用法

    man命令获取指定命令的帮助
    man ls 查看ls 的帮助
    image.png

    07压缩与解压缩命令

    .zip .gz .bz2 .tar.gz .bar.bz2

    zip压缩格式

  • 压缩文件:zip压缩文件名.zip 源文件

  • 压缩目录:zip -r压缩目录名 .zip 源文件
  • 解压 unzip压缩目录名.zip
    1. mkdir book
    2. touch book/book1.txt
    3. touch book/book2.txt
    4. zip -r book.zip book
    5. ls
    6. # book book.zip
    7. mv book boox
    8. unzip book.zip
    9. # book book.zip boox

    gzip高压缩,可以把文件压缩的更小,不能压缩目录,只能压缩文件

    | 命令 | 示例 | 含义 | | —- | —- | —- | | gzip 源文件 | gzip x.txt | 压缩为.gz格式的压缩文件,源文件会消失 | | gzip -c 源文件 > 压缩文件 | gzip -c yum.txt > yum.txt.gz | 压缩为.gz格式的压缩文件,源文件不会消失 | | gzip -r 目录 | gzip -r book | 把目录下的所有子文件都变成压缩包,并删除源文件,当前目录无变化 | | gzip -d 压缩文件 | gzip -d yum.txt.gz | 解压缩文件,不保留压缩包 | | gunzip 压缩文件 | gunzip yum.txt.gz | 解压缩文件,不保留压缩包 |
  1. ls
  2. # book1.txt book2.txt book3.txt
  3. gzip book3.txt
  4. ls
  5. # book1.txt book2.txt book3.txt.gz
  6. gzip -c book2.txt > book2.txt.gz && ls
  7. # book1.txt book2.txt book2.txt.gz
  8. gzip -r book
  9. #book1.txt.gz book2.txt.gz book3.txt.gz

.bz2格式压缩

bzip2是压缩能力更强的压缩程序,不能压缩目录

命令 示例 含义
bzip 源文件 bzip2 book1.txt 压缩为.bz2格式的文件,不保留源文件
bzip -k 源文件 bzip2 -k book1.txt 压缩为.bz2格式的文件,保留源文件
bzip2 -d 压缩文件名 bzip2 -d book1.txt.bz2 解压缩文件,不保留源文件
bunzip2 压缩文件名 bunzip2 book1.txt.bz2 解压缩文件,不保留源文件

tar打包文件,只打包不压缩

tar -cvf 打包文件名 源文件

  • -c 打包
  • -v 显示过程
  • -f 指定打包后的文件名

    1. tar -cvf book.tar book
  • x 解打包

    1. tar -xvf book.tar

    tar.gz压缩格式

  • zip可以压缩目录但效率不高,gzip和bzip2压缩效率高,但不支持目录

  • 可以先打包为.tar格式,再压缩.gz格式, -z压缩为.tar.gz格式 -x解压缩.tar.gz格式 | 命令 | 示例 | 含义 | | —- | —- | —- | | tar -zcvf 压缩名.tar.gz 源文件 | tar -zcvf book.tar.gz book | 可以先打包为.tar格式,再压缩为.gz格式 | | tar -zxvf 压缩名.tar.gz | tar -zxvf book.tar.gz | 解压缩tar.gz压缩包 |

08关机和重启命令

关机shutdown

  • -c 取消前一个关机命令
  • -h关机
  • -r 重启

    1. shutdown -r 06:00
    2. shutdown -c

    init

  • init 0 关机

  • init 6 重启

    logout退出登录

    09查看登录用户信息

  • w

  • who:查看登录用户信息

其它linux操作

检查端口被哪个进程占用使用netstat或者lsof

  1. netstat -lnp|grep 88 #88请换为你需要的端口,如:80
  2. lsof -i:3000

杀掉编号为1777的进程

  1. # 杀掉编号为1777的进程(请根据实际情况输入)
  2. kill -9 1777

添加用户 更改密码

  • useradd:useradd sam 添加了一个sam的用户
  • passwd:更改用户密码
  • su:切换用户
    • su - sam :切换到sam用户
    • su :切换至root用户

      用户user

      新建用户

      ```shell

      useradd 用户名

      useradd web

      可通过以下命令查看创建的和用户相关数据

      grep “web” /etc/passwd

      查看和用户相关的密码数据

      grep “web” /etc/shadow

      在/etc/group中创建一行和web一样的群组

      grep “web” /etc/group

      在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息

      grep “web” /etc/gshadow

修改用户密码

passwd web 然后输入两次相同的密码 passwd -S web # 查看web用户密码状态

  1. <a name="nGpUN"></a>
  2. ### 编辑用户
  3. ```shell
  4. # 锁定用户 -l
  5. passwd -l web
  6. # 查看用户状态 passwd -S web
  7. # 解锁用户-u
  8. passwd -u web
  9. # usermod修改用户信息
  10. # 可以使用man usermod查看命令是否可用
  11. usermod -G root web #把web用户加入root组
  12. # change修改用户信息,该命令可以设置用户第一次登录时必须修改登录密码

删除用户

  1. # userdel删除用户信息
  2. userdel -r web

切换用户

root用户切换其它任意用户可以直接切换,不需要密码。
其它用户之间切换需要密码

  1. # root切换至其他用户,不需要密码
  2. su - web
  3. # 其它用户切换至root, 需要密码
  4. su - root

查看当前用户

  • whoami : 用来打印当前执行操作的用户名
  • who am i : 用来打印登录当前Linux系统的用户名

    在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的. 使用 su 命令切换用户身份后,使用 whoami 命令打印的是切换后的用户名,而 who am i 命令打印的仍旧是登陆系统时所用的用户名。

用户组

添加用户组

  1. groupadd group1
  2. # 查看添加的用户组详情
  3. grep "group1" /etc/group

修改用户组

  1. # 把group1组重名名为grouptest
  2. groupmod -n grouptest group1
  3. # 查看grouptest的用户组详情
  4. grep "grouptest" /etc/group

删除用户组

groupdel用于删除用户组,注意不要使用groupdel随意删除群组。如果群组中有某一用户,则无法删除。

  1. groupdel grouptest

把用户添加进组或从组中删除 gpasswd

为了避免系统管理员root太繁忙,无法及时管理群组,可以使用gpasswd命令给群组设置一个群组管理员,代替root完成将用户加入或移出群组操作。

  1. # 创建group1群组
  2. [root@VM-0-11-centos ~]# groupadd group1
  3. # 设置密码
  4. [root@VM-0-11-centos ~]# gpasswd group1
  5. # 新建hello用户
  6. [root@VM-0-11-centos ~]# useradd hello
  7. # 设置用户hello密码
  8. [root@VM-0-11-centos ~]# passwd hello
  9. # 把用户hello设置为group1的管理员
  10. [root@VM-0-11-centos ~]# gpasswd -A hello group1

使用hello用户进行登录

  1. # 将hello用户添加到group1群组
  2. [hello@VM-0-11-centos ~]$ gpasswd -a hello group1
  3. # 将web用户添加到group1群组
  4. [hello@VM-0-11-centos ~]$ gpasswd -a web group1
  5. # 查看group1群组中的信息,可以看到包含了hello,web用户
  6. [hello@VM-0-11-centos ~]$ grep "group1" /etc/group
  7. group1:x:1002:hello,web

gpasswd 命令及选项参数含义

-A user, … 将群组的控制权交给user,仅root用户可用
-M user 将user用户加入到群组,仅root用户可用
-r 移除群组的密码,仅root用户可用
-R 让群组的密码失效,仅root用户可用
-a user 将user用户添加到群组
-d user 将user用户从群组移除

群组中删除用户

  1. # 从group1中移除web用户
  2. [hello@VM-0-11-centos ~]$ gpasswd -d web group1
  3. # 查看group1群组信息
  4. [hello@VM-0-11-centos ~]$ grep "group1" /etc/group

权限管理

shell命令

shell基础

  • shell是一个命令行解释器,它为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序
  • 用户可以用shell来启动、挂起、停止或编写程序
  • shell是解释性的脚本语言,在shell中可以直接调用linux系统命令

    echo

  • 输出命令

  • —e 支持反斜线控制的字符转换(缩写-e) | 控制字符 | 作用 | | —- | —- | | \a | 输出警告音 | | \n | 换行符 | | \r | 回车键 | | \t | 制表符 | | \v | 垂直制表符 |
  1. echo -e "\a"
  2. echo -e "afdaf\n123"
  3. echo -e "afdaf\r23"
  4. echo -e "afdaf\tkl23"
  5. echo -e "afdaf\vkl23"
  6. echo -e "\e[1;31m warning \e[0m"

|符号|颜色 |30m|黑色 |31m|红色 |32m|绿色 |33m|黄色 |34m|蓝色
30m-47m表示颜色

编写执行shell脚本

编写hello.sh脚本

  1. #!/bin/bash
  2. echo hello world

执行脚本的两种方式
第一: sh hello.sh
第二: ./hello.sh 直接使用相对路径命令。这个方法执行,需要修改文件的权限,查看默认权限是

  1. ll ./hello.sh
  2. # -rw-r--r-- 1 root root 43 Jun 5 23:46 hello.sh

需要将用户添加可执行权限x,执行命令

  1. chmod u+x ./hello.sh
  2. # -rwxr--r-- 1 root root 43 Jun 5 23:46 hello.sh

然后就可使用相对路径执行命令

命令生效顺序

  • 绝对路径或相对路径
  • 别名
  • bash内部命令
  • 按照$PATH环境变量定义的目录查找

    命令快捷键

    | 命令 | 含义 | | —- | —- | | ctrl + c | 强制终止当前命令 | | ctrl + l | 清屏 | | ctrl + a | 光标移动到命令行首 | | ctrl + e | 光标移动到行尾 | | ctrl + u | 从光标所在位置删除到行首 | | ctrl + z | 把命令放后台执行 | | ctrl + r | 在历史命令中搜索 |

history历史命令

  • -c 清除历史
  • -w 把缓存中的历史命令写入历史命令保存文件~/.bash_history

    变量

    定义变量

    1. #中间不能有空格
    2. x=1
    3. y=2
    4. z=$x+$y
    5. echo $z
    1. #set查找变量
    2. set | grep shuai
    3. # 删除变量
    4. unset name

    自定义环境变量

  • 环境变量是全局变量,自定义变量是局部变量,自定义的局部变量在当前shell生效,环境变量在当前shell及子shell中生效

  • 环境变量主要保存些和系统操作相关的数据

    1. #自定义环境变量 export 变量名=value
    2. export envname=prod
    3. #查看环境变量
    4. echo $envname

    位置参数变量

    主要用来向脚本传递参数或数据,变量名不能自定义,变量的作用是固定的。
    $n参数的实例,n表示1-9数字,$0表示命令本身,10以上的参数需要用大括号包起来,${16}

    1. touch loc.sh
    2. vi loc.sh
    3. ###loc.sh 内容开始
    4. #!/bin/bash
    5. num1=$1
    6. num2=$2
    7. sum=$((num1+num2))
    8. echo $sum
    9. ###loc.sh 内容结束
    10. sh loc.sh 1 2

    image.png
    多个参数表示,$@:表示命令后的所有参数,并把每个参数进行区分

    1. touch locnum.sh
    2. vi locnum.sh
    3. ###locnum.sh 内容开始
    4. !/bin/bash
    5. sum=0
    6. for i in "$@"
    7. do
    8. echo "i=$i"
    9. sum=$((sum+$i))
    10. done
    11. echo ${sum}
    12. ###locnum.sh 内容结束
    13. sh locnum.sh 1 3 5

    image.png
    设置-x可以查看执行步骤 sh -x locnum.sh 2 3 4
    image.png
    $#:表示命令行中所有参数的个数

    read,交互式参数

  • -p 后面跟提示信息,即在输入前打印提示信息。

  • -n 后跟一个数字,定义输入文本的长度,很实用。
  • -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
  • -t 后面跟秒数,定义输入字符的等待时间。

    1. #!/bin/bash
    2. read -t 10 -p '请输入你的用户名' username
    3. echo -e "\n"
    4. read -n 1 -p '请输入性别[m/f]' gender
    5. echo -e "\n"
    6. read -s -p '请输入密码' password
    7. echo "你的用户名是${username},你的密码是${password},性别是${gender}"

    运算符

    declare命令

    declare [+/-][rxia][变量名称=设置值]
    参数说明

  • +/- “-“可用来指定变量的属性,”+”则是取消变量所设的属性。

  • -r 将变量设置为只读。
  • -x 指定的变量会成为环境变量,可供shell以外的程序来使用。
  • -i [设置值]可以是数值,字符串或运算式。
  • -a 将变量声明为数组类型
  • -p 显示被声明变量的类型
    1. #声明为整型 -i
    2. a=1
    3. b=2
    4. c=$a+$b
    5. echo $c
    6. declare -i c=$a+$b
    7. echo $c
    8. declare +i c=$a+$b
    9. echo $c
    10. declare -p c
    image.png
    1. #声明环境变量-x
    2. declare -x glo=1
    3. bash
    4. set | grep glo
    5. # export gao=1 声明环境变量效果一样
    6. export gao=1
    7. echo $gao
    1. #只读变量-r
    2. declare -r r=100
    3. echo $r
    4. r=200
    5. # bash: rx: readonly variable
    6. declare +r r=100
    1. #数组 -a
    2. names[0]=zs
    3. names[1]=ls
    4. declare -a names
    5. echo ${names}
    6. echo ${names[*]}
    7. echo ${names[1]}

    数值运算的方法

    ```shell

    数值运算的三种方法

    num1=1 num2=2 sum=$(expr $num1 + $num2) echo $sum sum=$(($num1 + $num2)) echo $sum sum=$[$num1 + $num2] echo $sum

显示日期

d=$(date) echo $d

Sun Jun 6 16:21:16 CST 2021

  1. <a name="CZ6x2"></a>
  2. #### 运算符优先级
  3. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/737887/1622962482794-2e866d97-927b-4080-bb77-7b50f631fa6f.png#clientId=u5a7370f6-e91f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=641&id=u6ce14236&margin=%5Bobject%20Object%5D&name=image.png&originHeight=641&originWidth=1427&originalType=binary&ratio=1&rotation=0&showTitle=false&size=262177&status=done&style=none&taskId=u0aad35b0-e93b-4a75-bdd0-0a1c6d1f2e5&title=&width=1427)
  4. <a name="f6jOQ"></a>
  5. ### 环境变量配置文件
  6. <a name="bYaTl"></a>
  7. #### source命令
  8. - 修改配置文件后,使用source 配置文件名,配置内容才能生效
  9. - 或者使用 . 配置文件
  10. <a name="gqX9U"></a>
  11. #### cat命令
  12. 用来提取文本中的一部分文本<br />-f:列号,用来指定要提取的列<br />-d:分隔符,按照指定分隔符分隔列,默认是TAB制表符
  13. ```shell
  14. cat /etc/passwd | grep /bin/bash | cut -f 2,5 -d :

流程控制

按照文件类型判断

  1. # 判断文件是否存在, $?查看上次, 1表示不存在,0表示存在
  2. test -e 1.txt
  3. echo $?
  4. #或者使用[ ]
  5. [ -e 1.txt ] && echo yes || echo no
选项参数 含义
-d 文件是否存在,并且是目录
-e 文件是否存在
-f 文件是否存在并且是普通文件
-L 文件是否存在并且是链接文件
-p 文件是否存在并且是管道文件
-s 文件是否存在并且是否为非空
-S 文件是否存在并且是套接字文件

按照文件权限判断

-r 是否有读权限
-w 是否有写权限
-x 是否有执行权限
  1. echo read > read.txt
  2. echo write > write.txt
  3. echo execute > execute.txt
  4. chmod u+w write.txt
  5. chmod u+x execute.txt
  6. [ -r read.txt ] && echo "read yes" || echo "no"
  7. [ -w write.txt ] && echo "write yes" || echo "no"
  8. [ -x execute.txt ] && echo "execute yes" || echo "no"

if语句控制

  1. #!/bin/bash
  2. if [ 2 -gt 1 ]
  3. then
  4. echo yes
  5. else
  6. echo no
  7. fi

也可通过传入参数进行判断

  1. #!/bin/bash
  2. if [ $1 -gt $2 ]
  3. then
  4. echo yes
  5. elif
  6. echo equal
  7. else
  8. echo no
  9. fi

然后执行命令sh compare.sh 2 3

case语句控制

  1. #!/bin/bash
  2. case $choose in
  3. "yes")
  4. echo "yes"
  5. ;;
  6. "no")
  7. echo "no"
  8. ;;
  9. *)
  10. echo other
  11. ;;
  12. esac

for语句控制

  1. #!/bin/bash
  2. for i in 1 2 3
  3. do
  4. echo $i
  5. done
  1. #!/bin/bash
  2. for((i=1;i<=10;i++));
  3. do
  4. echo $(($i));
  5. done

while语句

  1. #!/bin/bash
  2. i=1
  3. result=0
  4. while [ $i -le 100 ]
  5. do
  6. result=$(($result+i))
  7. i=$(($+1))
  8. done
  9. echo $result

函数

简单函数

  1. #!/bin/bash
  2. start(){
  3. echo start
  4. }
  5. start

在函数体内部使用local定义的是局部变量。直接定义的是全局变量

  1. function sum1(){
  2. > local result=0
  3. > result=$(($1+$2))
  4. > echo $result
  5. > return $result
  6. > }
  7. #执行代码
  8. sum1 3 8

参数说明

本地连接远程服务器

ssh -p 端口 用户名@服务器IP

  1. ssh -p 22 root@47.96.0.230
  2. # 接下来输入密码、
  3. root@47.96.0.230's password:

生成公钥,免密登录服务器

首先确保本地已经执行ssh-keygen -t rsa。生成rsa证书。
image.png
然后执行连接需要登录的服务

  1. ssh-copy-id 47.96.0.230

image.png
设置成功,以后就可以免密码登录服务器。

开启或关闭linux系统实例的防火墙

防火墙是可以帮助计算机在内部网络和外部网络之间构建一道相对隔绝的保护屏障,从而保护数据信息的一种技术。如果服务器开启了防火墙,并设置了屏蔽外界访问的规则,那么在远程连接该服务器时,可能会导致访问失败。

CentOS 5/CentOS 6

在CentOS 5和CentOS 6系统中,关于如何开启防火墙、关闭防火墙、查看防火墙运行状态

  • 开启防火墙 service iptables start
  • 关闭防火墙 service iptables stop
  • 查看防火墙状态 service iptables status

CentOS 7/Red Hat 7/Alibaba Cloud Linux 2

开启防火墙、关闭防火墙、查看防火墙运行状态

  • 开启防火墙 systemctl start firewalld.service
  • 关闭防火墙 systemctl stop firewalld.service
  • 查看防火墙运行状态 firewall-cmd —state
  • 查看监听(Listen)的端口 netstat -lntp
  • 检查端口被哪个进程占用 netstat -lnp|grep 8080

    打开或关闭某个端口

    1. firewall-cmd --zone=public --add-port=3306/tcp --permanent // 开放3306端口
    2. firewall-cmd --zone=public --remove-port=3306/tcp --permanent //关闭3306

    开启Linux服务器防火墙状态: systemctl start firewalld
    停止Linux服务器防火墙状态: systemctl stop firewalld
    查询Linux服务器防火墙所有开放端口: firewall-cmd —list-ports
    重启Linux服务器防火墙: firewall-cmd —reload
    含义:
    —zone #作用域
    —add-port=80/tcp #添加端口,格式为:端口/通讯协议
    —permanent #永久生效

    Ubuntu

  • 开启防火墙ufw enable

  • 关闭防火墙ufw disable
  • 查看防火墙运行状态ufw status
  • 设置默认为禁用 sudo ufw default deny

    打开或关闭某个端口

    1. sudo ufw allow smtp  #允许所有的外部IP访问本机的25/tcp (smtp)端口
    2. sudo ufw allow 22/tcp #允许所有的外部IP访问本机的22/tcp (ssh)端口
    3. sudo ufw allow 53 #允许外部访问53端口(tcp/udp)
    4. sudo ufw allow from 192.168.1.100 #允许此IP访问所有的本机端口
    5. sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53
    6. sudo ufw deny smtp #禁止外部访问smtp服务
    7. sudo ufw delete allow smtp #删除上面建立的某条规则

    Debian

    在Debian系统中,默认没有安装防火墙,可以通过清空防火墙策略,删除相关屏蔽规则。
    注意:清空策略前,请务必备份防火墙策略。
  1. 依次执行以下命令,备份防火墙策略。touch [$Iptables]
    iptables-save > [$Iptables]说明:[$Iptables]为防火墙策略的备份文件地址。
  2. 执行以下命令,清空防火墙策略。iptables -F