linux常用命令

man 命令:

man ls、man pwd等linux中的命令可以用man来查看具体使用,如ls -l的作用

================================================================================

help 命令:

命令分为内部命令和外部命令,shell自带的称为内部命令,其他的是外部命令

使用type cd、type shell区分

内部命令使用如: help cd 

外部命令使用如:ls —help

================================================================================

info 命令:

比man命令更加详细的解释

================================================================================

pwd 命令:

显示当前目录名称

================================================================================

cd 命令:

进入目录 cd ../ 进入当前目录的上一级目录 cd ../../进入当前目录的上上级目录

================================================================================

ls 命令:

-l 长格式显示文件,如下

     drwxr-xr-x   8 root  wheel  256  8 31 00:52 share

   -rwxr-xr-x   1 root  wheel  718  8 31 00:52 uninstall.sh

    第一个字符,d代表是文件夹,-代表是文键

    第二到十个字符代表权限

-a 显示隐藏文件

-r 逆序显示,默认按照文件名逆向排序,如果有-t按照时间逆序

-t 按照时间顺序显示

-R 递归显示,当前目录下的所有子目录和文件

-h 如果文件大小达到g,以g的格式显示,如果文件大小达到m,以m的格式显示, k、B同理

-i i节点编号

显示多个目录,如 ls  /usr /var,结果如下

/usr:

X11 X11R6 bin lib libexec local sbin share standalone

/var:

MobileSoftwareUpdate backups folders log mobile personalized_factory run spool

agentx containers install logs msgs protected rwho tmp

at db jabberd ma netboot root select vm

audit empty lib mail networkd rpc sntpd yp

================================================================================

mkdir 命令:

建立新目录,可用mkdir a b c 创建a、b、c三个目录,创建多级目录 mkdir -p a/b/c/d/e/f/g

================================================================================

rmdir 命令:

删除目录,只能删除非空文件夹

================================================================================

rm 命令:

删除文件或文件夹,-r递归删除 -f 不确认是否删除, 千万不要用 rm -rf /,即便你真的吃不上饭了

================================================================================

touch 命令:

创建文件

================================================================================

cp 命令:

复制命令 -a 保留权限,修改时间等信息,-p 保留修改时间

================================================================================

mv 命令:

移动或重命名

================================================================================

cat 命令:

查看全部文本内容

================================================================================

head 命令:

查看文本前n行 head -n

================================================================================

tail 命令:

查看文本后n行 tail -n , 跟踪文本变化 tail -f

================================================================================

wc 命令:

wc -l 查看文件有多少行

================================================================================

more 和 less 命令:

分页查看,使用G跳到最后,使用g跳到开头,使用?向上查找,使用/向下查找,按下n查看下一个,按空格可以看下一屏

================================================================================

tar 命令:

打包 c ,格式为文件 f,使用gzip z,解压 x,相同的名字 v : tar czf /usr/local/a.tar /usr/local/a  前面是目标文件,后面是要打包的文件或文件夹

================================================================================

gzip 命令:

打包,较bzip2更快

================================================================================

bzip2 命令:

打包,较gzip 压缩比例更高

================================================================================

vim 命令:

插入 i,退出 :q, 保存并退出 :wq

1.正常模式,直接使用vim

按h向左,j向下,k向上,l向右

在某一行按下yy,复制这行,在某行按下p键,会换行粘贴复制这一行的内容

在某一行按下3yy,会复制从这行开始的3行,同样按下p,会换行粘贴3行的内容

y$ 复制从光标位置到当前行结尾

剪切当前行,dd,剪切光标到当前行结尾,d$

撤销指令,u, 重做命令:ctrl + r

单个字符的删除,x,单个字符的替换,先按r,再按下要替换为的字符

到当前行的开头^,到当前行的结尾$

2.插入模式,vim进入后使用i,到达光标位置,使用I,到达光标所在位置的开头,使用a,来到光标所在位置的下一个位置,使用A,来到光标所在位置的结尾

使用o,来到光标所在位置的下一行,开辟一个新行,使用O,来到光标所在位置的下一行,开辟一个新行

3.命令模式,:进入命令,使用q,不保存并退出,q!,强制退出,wq,保存并退出,! + 命令,查看某些信息,比如!ifconfig,查看ip地址,按回车再回到vim,这样就可以在修改文件的时候不用退出去看了; s/old/new, 替换old为new,这个命令只针对光标所在的一行,想替换全部行,使用%s/old/new,想替换3-5行,使用3,5s/old/new,以上的命令只替换行中遇到的第一个old,如果要全部替换一行的全部old,使用s/old/new/g. 显示行号 set nu,就可以看到行号了,如果想每次打开都显示行号,那么修改/etc/vimrc,在最后一行添加,set nu;

4.可视模式,v 字符可视模式,V 可视行模式,ctrl + v,可视块模式

================================================================================

用户与权限管理命令:

useradd 新建用户, 会在home目录下创建一个用户同名文件,在etc/passwd下添加一个用户同名文件,在etc/shadow文件中添加一行,存储用户密码。使用id 用户名,可以看到uid,gid,groups

userdel 删除用户

passwd 用户名,设置指定用户的密码,修改自己的密码,直接使用passwd

usermod 用户名,修改用户账号信息, 使用man查看帮助,如修改用户组, usermod -g group1 user1

chage 修改用户周期,使用man查看帮助

groupadd 新建用户组

groupdel 删除用户组

su - user1 切换用户

sudo 以其他用户身份执行命令, visodu 设置需要使用sudo的用户(组)

/etc/passwd 文件,用户配置:

user:x:1001:1001:desc:/home/user:/bin/bash

用:分割开每个值,以下是每个值的含义

1:表示用户名,

2:表示是否需要密码,

3:表示用户ID

4:表示组ID

5:表示注释

6:表示用户的家目录位置

7:表示用户登录的命令解释器

etc/shadow文件,存储用户和用户密码

user:password:…

etc/group文件,用户组:

root:x:组gid:用户名

第一个是组名,第二个是 是否需要密码,第三个是组gid,第四个表示用户名,这个用户也属于这个组

查看文件权限的方法:

ls -l

drwxr-xr-x   3 wangyang  staff    96  1 11 22:45 logs

第一个字符有

-普通文件

d普通文件

b块特殊文件

c字符特殊文件

l符号链接

f命名管道

s套接字文件

三个rwx(r=4,w=2,x=1),表示文件所属用户、所属用户组,其他用户对文件的权限

chmod命令:

修改文件、目录权限

chmod u+x  /temp/testfile

chmod g=rwx /temp/testfile

chmod 777 /temp/testfile

u,g,o,a 分别代表设置所属用户权限,设置所属用户组权限,设置其他用户权限,设置所有用户权限

+代表增加权限,-代表去掉权限,=代表等于权限

只用数字代表设置三个位置的权限,创建文件默认为644

chown命令:

chown user /file 改变文件所属用户

chown :group1 /file 改变文件所属用户组

================================================================================

> 命令:

echo 123 > file 将123输出到file

================================================================================

>>命令:

echo 123 >> file 将123以追加的方式输出到file

================================================================================

网络管理命令:

ifconfig 命令,网络状态查看 

eth0,第一块网卡

第一个网卡也可能叫下面的名字:

eno1 板载网卡

ens33 PCI-E 网卡 

enp0s3 无法获取屋里信息的PCI-E 网卡

CentOS7使用了一致性网络设备命名,以上都不匹配使用eth0

网卡命名规则受biosdevname和net.ifnames两个参数影响

编辑/etc/default/grub文件,增加biosdevname=0,net.ifnames=0

更新grub:grub2-mkconfig -o /boot/grub2/grub.cfg

重启:reboot

0 1代表ens33

1 0代表em1

0 0代表eth0

ifup命令 ifup加接口,开启网卡

ifdown命令 ifdown加接口,关闭网卡

route 命令,简化版的网络信息, route -n 显示主机名

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         10.0.24.1       0.0.0.0         UG    100    0        0 eth0

10.0.24.0       0.0.0.0         255.255.252.0   U     100    0        0 eth0

172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

添加网关:route add 0.0.0.1 gw 10.0.24.1

删除网关:route del 0.0.0.1 gw 10.0.24.1

访问10.0.0.1的时候使用geteway10.0.24.2:route add -host 10.0.0.1 gw 10.0.24.2

访问192.168.0.0网段的时候使用geteway10.0.24.3:route add -net 192.168.0.0 gw 10.0.24.3

网络故障排除命令:

ping 检测能否连接

traceroute 检测连接质量

mtr 检测数据包丢失

nslookup 域名到DNS的路径,通过域名得到ip

telnet 检测能否连接端口

tcpdump 检测数据包 -i any 所有网卡 -n 域名转化为ip,host 10.0.0.1 只抓这个ip, and port 80 只抓80端口,-w /temp/filename 抓取的内容存到制定文件

netstat 查看进程监听端口 -n 显示ip,t只截取tcp形式的截取(udp的就不显示了),p显示进程,l 监听

ss 更详细的netstat,使用参数相同

网络服务管理:

网络服务管理程序分为两种,分别为SysV和systemd

service network stat|stop|restart

chkconfig -list network

systemctl list-unit-files NetworkManager.service

systemctl start|stop|restart NetworkManager

systemctl enable|disable NetworkManager

网卡配置文件名称:ifcfg-eth0 位置/etc/sysconfig/network-scripts/ifcfg-eth0

BOOTPROTO=dhcp #ip为动态还是静态,静态设置为none,设置IPADDR为自己的静态ip,设置自己的GATEWAY,设置DNS,最后service network restart重启网络

DEVICE=eth0 #网卡

DHCPV6C=yes

HWADDR=52:54:00:25:4d:00

IPV6INIT=yes

ONBOOT=yes #开机时网卡是否启用

PERSISTENT_DHCLIENT=yes

TYPE=Ethernet

USERCTL=no

网络常用参数配置:/etc/hosts

hostname主机名,使用hostname wy把主机名临时改为wy

hostnamectl set-hostname wy 永久生效,需要修改/etc/hosts , 不然可能找不到主机

================================================================================

软件安装命令:

软件包管理器:

CentOS/RedHat使用yum包管理器,软件安装包格式为rpm

Debian/Ubuntu使用apt包管理器,软件安装包格式为deb

rpm格式,vim-common-7.4.el7.x86_64.rpm 软件名称(vim-common)-版本(7.4)-系统版本(el7)-平台(x86_64)

rpm命令常用参数

-q 查询软件包 后面跟软件包名,-qa查看所有,可以用less查找

-i 安装软件包 后面跟本地rpm包,会检测依赖,使用yum会自动解决依赖关系

-e 卸载软件包 后面跟软件包

yum命令:

修改镜像源:/etc/yum.repos.d/CentOS-Base.repo 具体搜索引擎查,可以去阿里巴巴开源镜像站寻找包:opsx.alibaba.com, 除了这个,还有很多其他东西,且有帮助文档

常用选项

install 安装软件包

remove 卸载软件包,会提示卸载引用的软件包

list | grouplist 查看软件包

update 升级软件包

makecache 清空缓存,从新的yum源获取安装包列表

可能用rpm包和yum安装都找不到最新的软件版本,对于一些开源软件,可以用源代码编译安装

编代码编译安装的基本流程

wget https://openresty.org/download/openresty-1.15.8.1.tar.gz

tar -zxf openresty-VERSION.tar.gz

cd openresty-VERSION

./configure —prefix=/usr/local/openresty(默认安装路很可能在把文件配置在各个目录,很混乱,使用--prefix可以配置安装路路径。自动配置环境,比如匹配gcc)

make -j2 (编译,-j2是用两个逻辑的CPU来编译,加快编译速度)

make install(安装,将软件安装到--prefix指定的目录,删除软件可以直接删除该目录;如果没有指定,可能在多个目录,删除很麻烦)

warning:使用编译安装可能有很多依赖缺失,可以使用yum安装相关依赖,或者也用源码包安装。可能会提示使用gmake,gmake install (跨平台安装)

内核升级命令:

rpm格式内核,

查看内核版本:uname -r

升级内核版本:yum install kernel, 会找到仓库里的最新版本,kernel-*** 安装制定版本的内核

使用yum update 会更新内核和所有可更新的软件

源代码编译安装内核,

首先检查依赖yum install  gcc gcc-c++ make ncurses-devel openssl-devel elfutils-libelf-devel

下载并解压缩内核 https://www.kernel.org(stable为稳定版本,longterm为长期稳定版本长期支持,[EOL]表示此版本不再更新,mainline为尝鲜版本,线上不要用)

tar xvf linux-5.1.10.tar.xz -C /usr/src/kernels (xz也是一种压缩格式,参考gz)

配置内核参数,

cd /usr/src/kernels/linux-5.1.10/

make menuconfig | allyesconfig | allnoconfig(选择内核需要安装功能 ,linux-5.1.10/.config有一些配置,可以选择一些搭配)

使用当前系统内核配置(/boot下有当前版本的config,可以cp改名为config-kernelversion.platform,再执行下面的命令)

cp /boot/config-kernelversion.platform /usr/src/kernels/linux-5.1.10/.config

编译,

make -j2 all(all代表使用所有cpu,cpu核数可用lscpu查)

安装内核,

make modules_install

make install

epel仓库,拓展yum仓库

yum install epel-release -y

df命令:

查看硬盘信息

grub配置文件:

启动项

/etc/default/grub

/etc/grub.d

/boot/grub2/grub.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg

使用单用户进入系统(忘记root密码) 

================================================================================

进程管理命令:

进程的概念:

    进程—运行中的程序,从程序开始运行到终止的整个生命周期是可管理的

        C程序的启动是从main函数开始的

            int mian(int argc, char *argv[])

            终止的方式并不唯一,分为正常终止和异常终止

                正常终止也分为从main返回、调用exit等方式

                异常终止分为调用abort、接收信号等

进程查看:

UID   PID    PPID  C STIME TTY   TIME CMD

用户id 进程id 父进程id

ps: 查看进程 常用参数-e、-ef(加了UID、命令的完整路径)、-elf(加了线程信息)

pstree:查看进程树(父子进程)

top:查看进程的运行状态

top - 18:02:29 up 7 days, 20:32,  2 users,  load average: 1.21, 0.51, 0.23

Tasks:  99 total,   1 running,  98 sleeping,   0 stopped,   0 zombie

%Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 98.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st

MiB Mem :   1827.0 total,    166.8 free,    701.2 used,    958.9 buff/cache

MiB Swap:      0.0 total,      0.0 free,      0.0 used.    944.0 avail Mem

上面参数的含义

top - 当前时间 up启动时间,两个用户登录,平均负载:1分钟内、5分钟内、15分钟内(1为满负载)

Tasks:进程总数,运行进程数,休眠进程数,停止进程数,僵尸进程数

%Cpu(s): 用户空间占用,内核空间占用,用户进程空间内改变过优先级的进程占用,空闲CPU、等待IO的CPU时间百分比,硬中断占用CPU百分比,软中断占用CPU百分比

MiB Mem: 屋里内存总量,空闲内存总量,已使用内存总量,用作内核缓存的总量

MiB Swap:交换区总量,空闲交换区总量,已使用交换区总量,可用于进程下一次分配的物理内存数量

top后按1查看每个逻辑CPU状况、按b高亮、按y打开和关闭运行态进程的加亮效果、按x打开排序效果(默认按cpu占用排序,使用<或>用左右边参数排序)、按f可以选择top显示的字段、按s加快变动时间

进程的优先级调整:nice 范围-20到19,值越小优先级越高,抢占资源就越多;renice重新设置优先级

进程的作业控制:

jobs,可以查看后台运行的任务

&符号, 命令最后加&,后台运行

================================================================================

$符号:

用法1:

$0:就是该bash文件名

$*:   第几个参数,个位数的可直接使用数字,但两位数以上,则必须使用 {} 符号来括住,如${10}.特殊的,比如$2为空,希望给一个默认值,使用${2-temp}, 没有第二个参数,那么输出的为temp

$?:是上一指令的返回值,成功是0,不成功是1。一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。一般指令程序倘若执行成功,其回传值为 0;失败为 1。

$@:所有参数。只不过是“$*”返回的是一个字符串,字符串中存在多外空格。 “$@”返回多个字符串。

$#:返回所有脚本参数的个数。

$$ :Shell本身的PID(ProcessID),即当前进程的PID。

$! :Shell最后运行的后台Process的PID

$- :使用Set命令设定的Flag一览

用法2:

获取环境变量 echo $PATH 

用法3:

shell中$(( ))、$( )、``与${ }的区别

说明:

${ }这种形式其实与用法一和二是一样的,属于变量替换的范畴,只不过在变量替换中可以加上大括号,也可以不加大括号。

简而言之:$(( ))属于执行计算公式,等价于$[ ],$( )和` `属于命令替换,${ }属于变量替换

(1)$( )与``(反引号):返回括号中命令的结果

    在bash中,$( )与` `(反引号)都是用来作命令替换的,执行括号或者反引号中的命令。

    命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行

示例:命令:$ echo today is $(date "+%Y-%m-%d"),显示:today is 2014-07-01

    注:在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

        1)``很容易与''搞混乱,尤其对初学者来说。

        2)在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。

   最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

示例:

         1# 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数

               cmd3 $(cmd2 $(cmd1))

         2 # 如果是用反引号,直接引用是不行的,还需要作跳脱处理

          cmd3 `cmd2 \`cmd1\``

(2)${ }变量替换

一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

================================================================================

进程间通信:

信号是进程间通信的方式之一,典型用法是:终端用户输入中断命令,通过信号机制停止一个程序的运行。

使用信号的常用快捷键和命令

kill -l

    SIGINT 通知前台进程组停止进程 ctrl + c

    SIGKILL 立即结束程序,不能被阻塞和处理 kill -9 pid

kill pid 指kill -15 pid,等待程序处理完现有任务后进程终止

================================================================================

守护进程:

使用nohup和&符号配合运行一个命令,如nohup java -jar ****.jar >> *.log 2>&1 &,启动一个JavaWeb工程

    nohup命令使进程忽略hangup(挂起)信号, 即使用户退出进程继续运行

守护进程(daemon)和一般进程有什么差别呢?

守护进程一直在后台运行,一般进程随用户退出而终止

================================================================================

screen命令:

screen进入screen环境

进入screen环境后,输入的任何命令(如tail -f)会以screen子进程的方式保留,使用下面的命令退出,查看ps

ctrl + a d 退出(detached)screen环境

screen -ls 查看screen的会话(找到tail -f的sessionid)

screen -r sessionid 恢复会话 (重新进入tail -f)

在screen界面使用exit退出screen模式

通过上面的过程,模拟出了守护进程的效果

================================================================================

系统日志:

/var/log文件夹下有一些系统日志

================================================================================

服务管理工具systemctl

centos6及以前:

service命令

chkconfig --list查看服务配置

centos7及以后加了systemctl

systemctl start | stop | restart | reload | enable | disable 服务名称

systemctl status 服务名称 查看状态

软件包安装的服务单元 :/usr/lib/systemd/system/

比如该目录下的sshd.service

[Unit]

Description=OpenSSH server daemon

Documentation=man:sshd(8) man:sshd_config(5)

After=network.target sshd-keygen.target #设置在某个服务后启动

Wants=sshd-keygen.target

[Service]

Type=notify

EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config

EnvironmentFile=-/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=multi-user.target

如果要增加自己的服务在sshd.service之前启动,那么加Requires=a.service,且在After中也加上a.service

================================================================================

SELinux

MAC(强制访问控制)与DAC(自主访问控制)

查看SELinux命令

    getenforce

    /usr/sbin/sestaus

    ps -Z and ls -Z and id -Z

关闭SELinux

    setenforce 0 临时关闭

    /etc/selinux/sysconfig 修改selinux配置,需要重启服务器

    SELINUX=disabled 建议生产环境用这个,避免对性能造成影响

================================================================================

内存与磁盘管理

内存和磁盘使用率查看:

    free: 查看内存 , 发现Swap已经占用了,说明内存已经不够用了,开始使用硬盘,这时候就要加内存了

                                  total        used        free           shared     buff/cache   available

                Mem:          1.8Gi       713Mi    120Mi       2.0Mi       992Mi       930Mi

                Swap:            0B          0B          0B

    fdisk: 查看磁盘和对磁盘进行分区,在用的机器不要用这条语句,可能搞坏,可以新开测试机测试,然后重装

                -l 查看机器上所有的磁盘,结构如下:

                Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors

                Units: sectors of 1 * 512 = 512 bytes

                Sector size (logical/physical): 512 bytes / 512 bytes

                I/O size (minimum/optimal): 512 bytes / 512 bytes

                Disklabel type: dos

                Disk identifier: 0x89ee0607

                Device     Boot Start       End          Sectors     Size Id Type

                /dev/vda1  *     2048 104857566 104855519  50G 83 Linux

    df -h: 查看分区、占用和挂载到的目录

    ls -lh: 查看文件大小

    du -h / —max-depth=1:查看文件实际大小(带空洞,既空数据库),只查看第一层

ext4文件系统:

    超级块:记录着分区中的文件信息

    超级块副本:对超级块进行还原

    i节点(inode):记录每一个文件的各种信息,只有文件名记录在父目录的i节点里

    数据库(datablock): i节点后面挂着数据块,一个i节点可能跟着多个数据块

磁盘配额的使用:

磁盘的分区与挂载:

交换分区(虚拟内存)的查看与创建:

     增加交换分区的大小:

        mkswap

        swapon

     使用文件制作交换分区:

        dd if=/dev/zero bs=4M count=1024 of=/swapfile

软件RAID的使用:

    RAID 0 ,striping  条带方式,提高单盘吞吐率

    RAID 1,mirroring 镜像方式,提高可靠性

    RAID 5,有奇偶校验

    RAID 10 是RAID 1 与 RAID 0 的结合

逻辑卷管理:

系统综合状态查看:

    sar命令:-u查看cpu,-r查看内存,-b查看IO,-d查看每一块磁盘的读写,-q查看进程

                    sar -u 1 10 查看cpu信息,1s采样一次,采样10次

    iftop命令:查看网络流量

================================================================================

find命令:

    -name: find /etc -name passwd

        模糊查询:find /etc -name passwd*

    -regex:

        正则查找:find /etc -regex .*wd$

    -atime:

        按时间查找:find /etc -atime 8  八天内有更新的文件

    -exec:

        找到后对这些文件执行命令:find *txt -exec rm -v {} \;

================================================================================

grep命令:

    grep -C 5 "aaa" filename 

    -C前后五行

    -B前五行

    -A后五行

================================================================================

cut命令:

    cut -d " " -f 2 filename : 以空格为分割,然后取第二个

    如cut -d ":" -f7 /etc/passwd | sort | uniq -c,查看所有用户的登录状态

================================================================================

sort命令:排序

================================================================================

uniq命令:将相邻的整合为一个组 uniq -c

================================================================================

硬链接与软连接:

    硬链接写法:ln myfile hardfile

    软链接写法:ln -s myfile softfile

    示例:

          echo "line1" > myfile

          ln myfile hard

          ll -i查看,会看到myfile和hard的节点号相同,使用同一个地址

          ln -s myfile soft

          ll -i查看,会看到myfile和soft的节点号不同,soft存储的实际上是myfile的路径

          rm myfile

          ll -i查看,会看到soft标红,hard没变(节点号也没变)

         echo "from soft" > soft

          ll -i查看,会看到myfile重新出现了,只是inode变了,因为写入soft就是写入了             soft指向的路径,重新创建了myfile。此时myfile和hard的硬链接关系已经没有             了

================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值