Linux命令备忘录.md

简书迁移

Posted by thrfox on June 29, 2020

常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ rm -rf dir1 # 删除dir1目录及目录内文件
$ wget # 网络文件
$ curl # 获取url源文件 
$ ls # 列出目录下文件
- -a显示隐藏文件
- -l 同ll,显示目录下文件详细信息

$ ln -s /usr/local/nginx /home/thrza/nginx #创建指向nginx在home内的软连接
$ find / -name *.conf # 查找 / 文件夹下名字为*.conf的文件 
$ ps -ef|grep nginx # 显示nginx进程的属性 
- -e显示所有进程
- -f全格式
- $ ps -a | more # 一行显示不下时换行

$ jobs #  查看当前任务
$ fg 1 #  使任务序号为1的前台运行
$ bg 1 #   使任务序号为1的后台运行
# 运行程序时后加 & :启动时后台运行
$ nohup # 后台运行程序,jobs监控不到

nohup xxxx >/dev/null 2>&1

# 查找文件夹排除config,并且打印文件名(第9列)
ls -l --ignore="config" | grep ^d | awk '{print$9}'

# 使用 grep 找到包含 "TEST-" 的文件,并循环替换
grep -rl "TEST-" /path/to/directory | while read -r file; do
    # 使用 sed 将 "TEST-" 替换为 "UAT-"
    sed -i 's/TEST-/UAT-/g' "$file"
done

#将test.txt文件中的jack字符串替换为tom
sed -i "s/jack/tom/g" test.txt

ps -ef | grep [process_name] | grep -v grep | awk '{print $2}' | xargs kill -9 # 获取进程的pid并杀死

端口连通性测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# centos7安装netcat
yum install netcat -y

# 创建TCP服务器
## -l 监听地址 端口
nc -l 127.0.0.1 8080

# 测试百度的80端口是否畅通
## -v 详细信息
## -w 指定连接超时时间
nc -v -w 2 baidu.com 80

# 创建UDP服务器
## -l 监听地址 端口
## -u 使用udp协议
## -v 显示详情
nc -luv 0.0.0.0 8081

# 客户端以UDP协议连接到服务端
## -u 使用udp协议
## -v 显示详情
nc -uv 目的地IP 8080

密钥相关

配置A、B机器密钥免密访问

1
2
3
ssh-keygen  # A机器生成密钥
cat ~/.ssh/id_rsa.pub # 复制该文件
公钥 >> ~/.ssh/authorized_keys # 到B机器粘贴,则A机器可以ssh免密访问B

centos 创建虚拟内存

1
2
3
4
5
6
7
8
dd  if=/dev/zero  of=/var/swapfile  bs=1M  count=16384  # 创建虚拟内存空间文件16G,备注:空间大小=bs*count
mkswap  /var/swapfile  # 虚拟内存格式化
chmod -R 0600 /var/swapfile # 权限
swapon   /var/swapfile #启用虚拟内存
echo  "/var/swapfile   swap  swap  defaults  0  0" >>  /etc/fstab # 设置开机自启动

swapoff   /var/swapfile #停用虚拟内存
rm /var/swapfile -rf #删除虚拟内存空间

文件同步相关,rsync/scp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# scp传输文件
scp -r -p -P <remote_port> [host_file_url]/* [remote_username]@[remote_ip]:[remote_path] # 加个*号传文件夹下所有文件
-r 传文件夹
-p 保留权限
-P 若不是22端口,指定ssh端口
#rsync 传输文件
rsync -avz -e 'ssh -p 22' jenkins-2.263.4-x86.tar.gz root@ip:/home/jenkins # 传输文件到ip指定文件夹
rsync -avz -e 'ssh -p 22' root@ip:/home/jenkins /data/jenkins   # 拉取文件到指定文件夹

-a --archive  :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-z        :传输时进行压缩提高效率。

-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)-n --dry-run  :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。**强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
      :检查出mtime不同从而导致增量传输无效。**
-o --owner:保持owner属性(属主)-g --group:保持group属性(属组)-p --perms:保持perms属性(权限,不包括特殊权限)-D        :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs   :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size  :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size  :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude   :指定排除规则来排除不需要传输的文件。
--delete    :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
        :exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e          :指定所要使用的远程shell程序,默认为ssh。
--port      :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传 输更高效。
--existing  :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。

crontab 定时

1
2
3
4
5
6
7
8
9
10
# * * * * *
# 分钟,小时,几日,几月,星期几
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
crontab -e # 编辑当前定时器
crontab -l # 列出定时器
# 注意使用的本机时间,设置时间
date # 查看当前时间
zdump /etc/localtime # 查看当前时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置本机时间
echo 'Asia/Shanghai' > /etc/timezone # 设置本机所属时区

centos 卸载软件

1
2
3
4
5
6
7
8
9
10
11
12
# 下载安装包,和他的全部依赖(离线部署可用)
yum -y install yum-utils
repotrack pure-ftpd
rpm -Uvh --force --nodeps *.rpm # 离线安装

# 查询软件列表
# rpm -qa | grep 软件名
rpm -qa | grep mysql
 
# 卸载软件
# sudo yum remove 软件名
sudo yum remove mysql

安装ftp服务 pure-ftpd

1
2
3
4
5
6
7
8
yum -y install epel-release yum-utils pure-ftpd
useradd -d /data/ftpuser ftpuser # 创建系统ftpuser用户在/data/ftpuser目录
pure-pw useradd ftpuser -u ftpuser -d /data/ftpuser # 创建ftp虚拟用户,绑定到系统ftpuser用户
# Enter password
pure-pw mkdb # 创建数据库
systemctl enable pure-ftpd
systemctl restart pure-ftpd 
vi /etc/pure-ftpd/pure-ftpd.conf # 修改配置

ubuntu更换仓库镜像

1
2
3
  sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
  sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
  apt-get update 

压缩解压文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

# 压缩打包文件
tar -zcvf filename.tar.gz dirname
tar -jcvf filename.tar.bz2 dirname
tar -zcvf filename.tar.gz --exclude=builds/**/directory/** dirname1 dirname2
zip filename.zip dirname
# 解压文件
tar -zxvf filename.tar.gz
tar -jxvf filename.tar.bz2
unzip filename.zip

设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi .bashrc
export PATH=$NODE_MODULE:$PATH
source .bashrc

# 设置java环境变量
mkdir -p /opt/java && cd /opt/java
sudo wget -c http://erp.rjtx.net:14833/s/Apb4dFi9AanZibR/download -O jdk8u181-arm64.tar.gz
tar -zxvf jdk8u181-arm64.tar.gz
vi /etc/profile
# 最后加入
export JAVA_HOME=/opt/java/jdk1.8.0_181
export JRE_HOME=/opt/java/jdk1.8.0_181/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile
java -version

用户和权限相关

1
2
3
4
5
6
7
8
9
10
11
12
13
$ groupadd # 新建用户组
$ useradd -g g1 user1 # 新增用户user1至g1用户组
$ usermod -g root user1 # 更改用户user1至root用户组,拥有root权限
$ userdel -r user1$ 删除用户user1,连用户目录一起删除
$ passwd user1 # 更改用户user1密码
----------------------
$ chown -R user1:g1 /usr/tmp # 更改usr/tmp文件夹下所有文件属于user1  
- -R 文件夹下所有文件

$ chmod a+x nginx #  使所有用户拥有nginx的可执行权限
- -取消权限,+添加权限,=赋予给定权限并取消其他权限 
- a所有用户,g同组用户,o其他用户
- r可读,w可写,x可执行

网络相关

1
2
3
4
5
6
7
8
9
10
$ firewall-cmd --zone=public --add-port=80/tcp --permanent # 防火墙允许端口 (--permanent永久生效,没有此参数重启后失效)
$ netstat -lnp|grep 80 #  查看80端口状态
- -l仅显示listen状态的服务
- -n不显示别名
- -p显示相关链接的程序名
- -t 显示tcp相关
- -u 显示udp相关

# 下载文件重命名
$ wget -c https://gist.github.com/chales/11359952/archive/25f48802442b7986070036d214a2a37b8486282d.zip -O db-connection-test.zip

tcpdump抓包相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-a 将网络地址和广播地址转变成名字;
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;
-e  在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;
-f 将外部的Internet地址以数字的形式打印出来;
-l 使标准输出变为缓冲行形式;
-n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;
-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-t  在输出的每一行不打印时间戳;
-v  输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv 输出详细的报文信息;
-c 在收到指定的包的数目后,tcpdump就会停止;
-F 从指定的文件中读取表达式,忽略其它的表达式;
-i 指定监听的网络接口;
-p:将网卡设置为非混杂模式,不能与host或broadcast一起使用
-r 从指定的文件中读取包(这些包一般通过-w选项产生)-w 直接将包写入文件中,并不分析和打印出来;
-s snaplen   snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)
 -X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时
 是绝对的利器。

# 常用抓包命令
tcpdump -i eth0 port 15060 -w packets_file.pcap -X # 从指定网卡,指定端口中捕获数据包,并显示并写入文件。
tcpdump host 192.168.174.2 # 要获取指定 IP 的数据包,不管是作为源地址还是目的地址。
tcpdump src 192.168.174.128 || dst 192.168.174.2 # 要指定 IP 地址是源地址或是目的地址
# 可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:
tcpdump src 192.168.174.128 && port 22 -w ssh_packets
# “或”会检查是否匹配命令所列条件中的其中一条,像这样:
tcpdump src 192.168.1.174 or dst 192.168.174.2 && port 22 -w ssh_packets 
tcpdump port 443 or 80 -w http_packets
# “非” 当我们想表达不匹配某项条件时可以使用“非”,像这样:
tcpdump -i eth0 src port not 22

创建物理虚拟卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 安装lvm工具
yum install lvm -y  #centOS
apt-get install lvm -y # ubuntu
# 先用fdisk 分区硬盘

# 使用pvcreate创建基于磁盘的物理卷
pvcreate /dev/sda1

# 创建卷组
vgcreate data /dev/sda1

# 将新的物理卷添加到现有卷组:
vgextend data /dev/sdc

# 创建逻辑卷data1,分配100%的空闲空间
lvcreate -l 100%free -n data1 data
lvcreate -L 50G -n data1 data # 只分配50G

# 格式化逻辑卷
mkfs.ext4 /dev/data/data1 

# 挂载mount,并写入/etc/fstab,略
# mount -a 刷新fstab文件的挂载


pvdisplay # 查看物理卷
vgdisplay # 查看卷组
lvdisplay # 查看虚拟卷


挂载硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
df -h # 查看电脑硬盘信息
fdisk -l # 查看电脑所有磁盘信息包括未加载磁盘
lsblk # 检查哪块磁盘为加载和分区
blkid # 查看磁盘UUID

fdisk #  1.1对这块硬盘分区(小于2T)
# 1.fdisk /dev/sdb
# 2.m菜单,n新建分区,p主分区,%num,大小,w保存
# 3.mkfs.ext4 /dev/sdb1               ext4格式化
parted # 1.2分区大于2T的硬盘
# parted /dev/sdb       (用part命令对3T硬盘进行分区处理)
# mklabel gpt              (用gpt格式可以将3TB弄在一个分区里)
# unit TB                     (设置单位为TB)
# mkpart primary 0 3   (设置为一个主分区,大小为3TB,开始是0,结束是3)
# print                         (显示设置的分区大小)
# quit                         (退出parted程序)
# mkfs.ext4 /dev/sdb1 ext4格式化

# 2.mount /dev/sdb1 /mnt/sdb1_newdisk/ 挂载目录
# 3.vi /etc/fstab 修改开机自启挂载
#     硬盘路径         文件路径(挂载点)  文件系统类型  设备的自定义选项  是否转存  fsck的顺序
# 4.1 /dev/sdb1                           /mnt/sdb1_newdisk   ext4      defaults       0      0
# 4.2 UUID=${blkid查出来的磁盘UUID}        /mnt/sdb1_newdisk   ext4      defaults       0      0
# 附,将新文件夹挂载到文件夹
#     /data                               /mnt/sdb1_newdisk/data      none          bind              0          0
# 4.3 mount -a 刷新fstab文件的挂载

Centos更新内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 检查当前 CentOS 系统内核版本
uname -sr
# 导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo repo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 仓库启用后,列出可用的内核相关包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available 
# 安装 LT 版本
yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y
# 查看默认内核
grub2-editenv list
# 查看现有内核启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
# 修改默认启动项
grub2-set-default 0

开启防火墙端口脚本(centos)

用法 sh firewall-util.sh open 22

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash
echo "执行开启防火墙端口.."

if [ "inactive" == `systemctl status firewalld | grep Active | awk '{print $2}'` ]; then
  echo "防火墙已关闭,跳过"
  exit 0
fi

# 开启端口
openPort () {
        if [ ! $1 ]; then
                echo '请输入需要开启的端口,请检查'
                exit 1
        fi
        portStatus=$(firewall-cmd --query-port="$1"/tcp)
        if [ $portStatus = 'no' ]; then
                sudo firewall-cmd --add-port=$1/tcp --permanent
                firewall-cmd --reload
                sleep 1s
                echo "端口【$1】已成功开启"
        else 
                echo "端口【$1】已开启,无需重复开启"
        fi
}

# 关闭端口
closePort () {
        if [ ! $1 ]; then
                echo "请输入需要关闭的端口,请检查"
                exit 1
        fi
        portStatus=$(firewall-cmd --query-port="$1"/tcp)
        if [ $portStatus = 'yes' ]; then
                firewall-cmd --permanent --remove-port=$1/tcp
                firewall-cmd --reload
                sleep 1s
                echo "端口【$1】已成功关闭"
        else
                echo "端口【$1】已关闭,无需重复关闭"
        fi
}

# 查看端口是否开启关闭
checkPort () {
        if [ ! $1 ]; then
                echo '请输入需要检查的端口,请检查'
                exit 1
        fi
        portStatus=$(firewall-cmd --query-port="$1"/tcp)
        echo "端口【$1】状态:$portStatus"
}

# 查看系统中开放的端口
listPort () {
        openPortInfo=$( firewall-cmd --list-all | grep ports | awk  'NR==1{for(i=2;i<=NF;i++) print $i}'  | sort -nk 1 -t '/')
        echo "系统中对外开启的端口"
        echo "$openPortInfo"
}

case $1 in
open)
        openPort $2
        ;;
close)
        closePort $2
        ;;
check|status)
        checkPort $2
        ;;
list)
        listPort
        ;;
*)
        echo '参数错误:请输入第一个参数open|close|check|status|list 中的任何一个、第二个参数【可选】端口号' 
esac

自启动配置

1.配置为systemd服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#这是frp内网穿透的客户端自启动服务配置,放到/lib/systemd/system目录下
#使用方式
#systemctl daemon-reload
#systemctl enable rjgf-frpc #设置开机自动启动
#systemctl disable rjgf-frpc #取消开机自动启动
#systemctl start rjgf-frpc #开启frpc服务
#systemctl stop rjgf-frpc #关闭frpc服务
#systemctl restart rjgf-frpc #重启frpc服务
[Unit]
Description=rjgf frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
Restart=always #当程序退出时,自动重启。
#最好使用非root用户启动
#User=frp
#Group=frp
#启动服务的命令(此处写你的frpc的实际安装目录)
ExecStart=/home/frp/frpc -c /home/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target

2.使用chkconfig配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
#1.cd /etc/init.d/ 进入目录
#2.创建文件canal,把下面内容粘贴进去,修改java路径和canal安装路径。
#------------
#!/bin/bash
#
#chkconfig: 345 63 37
#description: canal
#processname: canal

export JAVA_HOME=/usr/local/jdk1.8.0_271
export PATH=$JAVA_HOME/bin:$PATH

CANAL_HOME=/usr/local/canal

case $1 in
  start)
    sh $CANAL_HOME/bin/startup.sh
    echo "canal is started"
    ;;
  stop)
    sh $CANAL_HOME/bin/stop.sh
    echo "canal is stop"
    ;;
  restart)
    sh $CANAL_HOME/bin/stop.sh
    sh $CANAL_HOME/bin/startup.sh
    echo "canal is started"
    ;;
  *)
    echo "start|stop|restart"
    ;;
esac
exit 0
#-------------
#3.给脚本添加权限chmod 755 canal
#4.添加服务到开机项 chkconfig --add canal
#5.设置为开机启动 chkconfig canal on
#6. systemctl start canal

window 添加host 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off

set "raw=185.199.108.133 raw.githubusercontent.com"
set "gist=140.82.112.4 gist.github.com"
set "api=140.82.112.6 api.github.com"

call :add
call :add "# ==============Add by Azukin===================="
call :add "%raw%"
call :add "%gist%"
call :add "%api%"

goto :eof
:add
findstr /i /c:"%~1" C:\Windows\System32\Drivers\etc\hosts
if errorlevel 1 (
    >>C:\Windows\System32\Drivers\etc\hosts echo,%~1
)