分类目录归档:Linux运维

Linux ip命令详解


2019年2月28日 16:41:00   1,774 次浏览

我之前一直都使用ifconfig命令,觉的这个命令挺好用的,后来有次安装Linux发型版本,发现没有了ifconfig这个工具了,无奈之下,到处百度,发现了ip这个命令,一顿学习后,发现ip命令完全可以替代ifconfig命令,而且功能还比ifconfig命令强大,所以,还等什么,借用现在的一个网络流行词:盘它。

命令简介

作为每个Linux网络管理员和所有的Linux使用者们,ip命令是必备工具,这个命令完美的取代了ifconfig命令,所以这篇文章就将全面的总结ip命令,希望通过我的这篇总结,让大家可以更熟悉ip命令。

命令详解

ip常用命令格式如下:

  1. ip [ OPTIONS ] OBJECT { COMMAND | help }

对象OBJECT={ link | addr | addrlabel | route | rule | neigh | ntable | tunnel | maddr | mroute | mrule | monitor | xfrm | token }

选项OPTIONS={ -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size] }

常用对象的取值含义如下:

  • link:网络设备
  • address:设备上的协议(IP或IPv6)地址
  • addrlabel:协议地址选择的标签配置
  • route:路由表条目
  • rule:路由策略数据库中的规则

常用选项的取值含义如下:

  • -V,-Version:显示指令版本信息
  • -s,-stats,statistics:输出详细信息
  • -h,-human,-human-readable:输出人类可读的统计信息和后缀
  • -o,-oneline:将每条记录输出到一行,用‘\’字符替换换行符
使用实例-检查网卡信息

说实话这个ip命令真的好复杂,选项参数有那么多,所以吧,我们不可能每个功能面面俱到。所以呢,我这里就对我们日常工作中经常用到的一些用法进行总结。

  • 命令:ip addr show
    说明:显示网卡及配置的地址信息
    输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.24/24 brd 192.168.0.255 scope global eth0
      valid_lft forever preferred_lft forever

输出内容详解:
首先这个系统有两个接口:loeth0lo是环回接口,而我们重点关注的则是eth0这个普通网络接口;下面在看看每个子项的含义:

  • <BROADCAST,MULTICAST,UP,LOWER_UP>BROADCAST表示该接口支持广播;MULTICAST表示该接口支持多播;UP表示该网络接口已启用;LOWER_UP表示网络电缆已插入,设备已连接至网络
  • mtu 1500:最大传输单位(数据包大小)为1,500字节
  • qdisc pfifo_fast:用于数据包排队
  • state UP:网络接口已启用
  • qlen 1000:传输队列长度
  • link/ether 00:1e:4f:c8:43:fc:接口的MAC(硬件)地址
  • brd ff:ff:ff:ff:ff:ff:广播地址
  • inet 192.168.0.24/24:IPv4地址
  • brd 192.168.0.255:广播地址
  • scope global:全局有效
  • dynamic enp0s25:地址是动态分配的
  • valid_lft forever:IPv4地址的有效使用期限
  • preferred_lft forever:IPv4地址的首选生存期
  • inet6 fe80::2c8e:1de0:a862:14fd/64:IPv6地址
  • scope link:仅在此设备上有效
  • valid_lft forever:IPv6地址的有效使用期限
  • preferred_lft forever:IPv6地址的首选生存期
使用实例-IP管理
  • 命令:ip addr add 192.168.0.123/24 dev eth0
    说明:设置IP
  • 命令:ip add del 192.168.0.123/24 dev eth0
    说明:删除配置的IP
使用实例-启用/禁用网卡
  • 命令:ip link set eth0 up
    说明:启用被禁用的网卡
  • 命令:ip link set eth0 down
    说明:禁用网卡
使用实例-路由配置

命令:ip route show
说明:查看路由信息
输出:

default via 172.17.175.253 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.160.0/20 dev eth0 proto kernel scope link src 172.17.169.20
  • 输出内容详解:
    • 输出内容第一条是默认的路由,我们可以根据我们的需要改动它
    • metric 1002:跳跃计数,确定网关的优先级,默认20,数值越小优先级越高
    • proto kernel:该路由的协议,主要有redirectkernelbootstaticra等,其中kernel指的是直接由核心判断自动设定
  • 命令:ip route get 119.75.216.20
    说明:通过IP地址查询路由包从哪条路由来
  • 命令:ip route add default via 192.168.0.150/24
    说明:所有的网络数据包都通过192.168.0.150来转发,而不是以前的默认路由
  • 命令:ip route add 172.16.32.32 via 192.168.0.150/24 dev enp0s3
    说明:修改特定网卡的默认路由
  • 命令:ip route del 172.17.160.0/20
    说明:删除路由
  • 命令:ip route flush cache
    说明:刷新路由表
使用实例-显示网络统计数据

这个显示网络统计数据则是ip命令非常重要的一个功能,很多时候,我们都依靠该功能来进行排除网络故障。

  • 命令:ip -s link
    说明:显示所有网络接口的统计数据
    输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   RX: bytes  packets  errors  dropped overrun mcast  
   361849729592 174114258 0       0       0       0      
   TX: bytes  packets  errors  dropped carrier collsns
   361849729592 174114258 0       0       0       0      

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
   link/ether 00:16:3e:08:08:55 brd ff:ff:ff:ff:ff:ff
   RX: bytes  packets  errors  dropped overrun mcast  
   32345193376 115901261 0       0       0       0      
   TX: bytes  packets  errors  dropped carrier collsns
   139742200499 114451909 0       0       0       0
  • 输出重点内容详解:
    • RX:表示接收
    • TX:表示发送
    • bytes:接收/发送的字节数
    • packets:接收/发送的包数
    • errors:接收/发送的带有错误的包总数
    • dropped:由于处理资源不足导致接收/发送的丢弃的包数
    • overrun:因接收溢出(环形缓冲区)导致丢失的包;通常如果接口溢出,则表示内核中存在严重问题,或者说服务器上该网络设备的处理设备太慢
    • mcast:接收到的多播包数
    • carrier:因数据链路错误导致发送失败的包数
    • collsns:因在网络上发送冲突而导致的失败数
  • 命令:ip -s -s link ls eth0
    说明:获取一个特定网络接口的信息;在网络接口名字后面添加选项ls即可。使用多个选项-s会输出指定接口详细的信息;特别是在排除网络连接故障时,这会非常有用。
    输出:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
   link/ether 00:16:3e:08:08:55 brd ff:ff:ff:ff:ff:ff
   RX: bytes  packets  errors  dropped overrun mcast  
   32469801665 116402997 0       0       0       0      
   RX errors: length   crc     frame   fifo    missed
              0        0       0       0       0      
   TX: bytes  packets  errors  dropped carrier collsns
   140235841575 115066014 0       0       0       0      
   TX errors: aborted  fifo   window heartbeat transns
              0        0       0       0       2

 

 

线上Redis 内存分析方法


2019年1月09日 14:31:00   1,714 次浏览

吃过午饭正准备午睡会呢,结果收到了redis内存不足的告警通知,第一时间登录监控平台查看详情,内存使用率居然上升了80%究竟是什么原因导致的呢?接下来便开始分析问题原因。

线上经常遇到用户想知道自己 Redis 实例中数据的内存分布情况。为了不影响线上实例的使用,我们一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析。总的来说,整个分析的过程简单而实用,是每一个使用 Redis 的用户都非常值得掌握的一个方法。

生成内存快照

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。主要有以下三个功能:

  • 生成内存快照
  • 转储成 json 格式
  • 使用标准的 diff 工具比较两个 dump 文件

redis-rdb-tools 安装

redis-rdb-tools 有两种安装方式,任选其一即可。

使用 PYPI 安装

pip install rdbtools

从源码安装

git clone https://github.com/sripathikrishnan/redis-rdb-tools

cd redis-rdb-tools

sudo python setup.py install

使用 redis-rdb-tools 生成内存快照

生成内存快照的命令为:

rdb -c memory dump.rdb > memory.csv

生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值。memory.csv 例子:

$head memory.csv

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,string,"orderAt:377671748",96,string,8,8
0,string,"orderAt:413052773",96,string,8,8
0,sortedset,"Artical:Comments:7386",81740,skiplist,479,41
0,sortedset,"pay:id:18029",2443,ziplist,84,16
0,string,"orderAt:452389458",96,string,8,8

打开生成的memory.csv文件,找出占用内存最大的key,可以发现很多的key都没有设置过期时间,然后找开发确认把相应的key设置过期时间以减少内存使用率。

开发确认后表明有些key并未设置过期时间,需要手动清除缓存。清除之后内存使用率从80%下降到40%, 后续让开发优化业务代码,合理设置过期时间。

 

MySQL连接异常java.sql.SQLException: Value ‘0000-00-00’ can not be represen


2018年12月19日 11:30:00   1,504 次浏览

最近准备上线新业务,业务代码使用的是spring框架,将开发提供的代码仓库地址git clone到测试环境机器进行mvn打包部署到另外的测试机器中,在启动服务是报异常

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date

gg查了一下相关资料,原来是因为实际的字段在数据库中为空,其默认值为“0000-00-0000:00:00”,在mysql中作为一个特殊值存在。但是在java项目编译的时候会被视为不合法的值,被JVM认为格式不正确。

解决方法: 在jdbc url加上zeroDateTimeBehavior=convertToNull参数,重新启动服务后正常。

配置 Nginx 反向代理 WebSocket


2018年11月29日 18:46:33   1,686 次浏览

一般设置代理只需按以下来设置是没有问题的,但是今天我们要操作的websockt

 

server {
    location / {
        proxy_pass http://127.0.0.1:10086;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_http_version 1.1;
        proxy_read_timeout 300s;
    }
}

 

nginx -t一下

会出现如下错误:
nginx: [emerg] unknown "connection_upgrade" variable

就是这里出现了个坑

其中涉及到了一个nginx的设计问题 End-to-end and Hop-by-hop Headers
我在这里还是不过多赘述了,以免误人子弟

map在nginx中是为一个或多个变量设置映射表

 

下面是需要添加的几项配置:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        location / {
            #…
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

 

阿里云SLB配置https证书


2018年8月02日 17:27:26   2,271 次浏览

nginx配置了https证书,现在想把博客放到slb负载均衡上面,由于证书是 crt和key类型,已经转换成Pem ,访问网站的时候报502,通过绑定本地Hosts去测试正常,唯独浏览器不行。

在阿里云help看到slb 配置https 证书的话,后端ecs不需要监听 443 端口,查看对应 443 监听后端ecs 服务器健康检查是异常的。 登陆对应后端服务器,执行下

echo -e “HEAD / HTTP/1.0\r\n” |nc -t 内网IP 端口

七层的监听健康检查的判断依据是 head 请求获取到的状态码判断健康检查是否正常,查看之前提供的截图是 400 状态码,在健康检查配置中 4xx 勾选上,或者是设置健康检查路径为一个 head 请求 返回 200 页面文件,再查看是否正常

 

后端n’ginx是否需要配置强制https?

答:如果没有http 强制 跳转https 的需求,或者是slb 已经配置了跳转,后端ecs 是不会配置的。

 

1、没有开启强制https,页面出现样式乱掉

2、配置了一个正常页面test.html健康检查200, 会出现502

3、后端开启强制https则会出现502

 

关于样式乱的问题,您通过谷歌的F12 访问

访问样式改变的问题,查看下是否是https 的页面中的相关资源是通过http 的方式调用的导致显示不正常。

502问题:

测试是重定向过多,在ecs 上配置http 强制跳转,需要配置以下对应监听。 SLB 443 -> ECS 80(nginx) SLB 80 -> ECS 81(nginx) 后端ecs81端口专门做重定向,重定向到SLB的443端口上,80端口提供网站服务即可。可以新建一个站点监听该端口,这个站点是用来做重定向的。

 

SLB 80 -> ECS 81(nginx) 的话,其它的站点没有https会不会受到影响?

如果后端已经配置了HTTPS了,那么SLB使用TCP 443监听好了,这样不需要调整后端的ECS的设置。 如果需要有跳转,可以使用 SLB 80监听对应后端http站点,后端HTTP设置跳转, 跳转到SLB 443端口 注意:HTTP站点上跳转时不能使用$server 一定要写SLB的地址

高效Linux bash快捷键及alias总结


2017年12月31日 10:18:59   1,636 次浏览

bash快捷键

习惯使用编辑的快捷键可以大大提高效率,记忆学习过程要有意识的忽略功能键、方向键和数字小键盘。以下快捷键适用在bash处于默认的Emacs模式下,是由一个名为Readline的库实现的,用户可以通过命令bind添加新快捷键,或者修改系统中已经存在的快捷键。(如果你有set -o vi,就处于 vi 模式就不适用了)

另外下面的内容并不包含所有快捷键,只是我个人适用频率最高的几种,但相信已经可以大大提高工作效率了。以下所有 Alt 键可以以 Esc 键代替。

  • Ctrl + l :清除屏幕,同clear
  • Ctrl + a :将光标定位到命令的开头
  • Ctrl + e :与上一个快捷键相反,将光标定位到命令的结尾
  • Ctrl + u :剪切光标之前的内容,在输错命令或密码
  • Ctrl + k :与上一个快捷键相反,剪切光标之后的内容
  • Ctrl + y :粘贴以上两个快捷键所剪切的内容。Alt+y粘贴更早的内容
  • Ctrl + w :删除光标左边的参数(选项)或内容(实际是以空格为单位向前剪切一个word)
  • Ctrl + / :撤销,同Ctrl+x + Ctrl+u
  • Ctrl + f :按字符前移(右向),同→
  • Ctrl + b :按字符后移(左向),同←
  • Alt + f :按单词前移,标点等特殊字符与空格一样分隔单词(右向),同Ctrl+→
  • Alt + b :按单词后移(左向),同Ctrl+←
  • Alt + d :从光标处删除至字尾。可以Ctrl+y粘贴回来
  • Alt + \ :删除当前光标前面所有的空白字符
  • Ctrl + d :删除光标处的字符,同Del键。没有命令是表示注销用户
  • Ctrl + h :删除光标前的字符
  • Ctrl + r :逆向搜索命令历史,比history好用
  • Ctrl + g :从历史搜索模式退出,同ESC
  • Ctrl + p :历史中的上一条命令,同↑
  • Ctrl + n :历史中的下一条命令,同↓
  • Alt + .:同!$,输出上一个命令的最后一个参数(选项or单词)。
    还有如Alt+0 Alt+. Alt+.,表示输出上上一条命令的的第一个单词(即命令)。
    另外有一种写法 !:n,表示上一命令的第n个参数,如你刚备份一个配置文件,马上编辑它:cp nginx.conf nginx.confvi !:1,同vi !^!^表示命令的第一个参数,!$最后一个参数(一般是使用Alt + .代替)。

这里提一下按字符或字符串,向左向后搜索字符串的命令:

  • Ctrl + ] c :从当前光标处向定位到字符 c 处
  • Esc Ctrl + ] c :从当前光标向定位到字符 c 处。( bind -P 可以看到绑定信息)
  • Ctrl + r str :可以搜索历史,也可以当前光标处向定位到字符串 str,Esc后可定位继续编辑
  • Ctrl -s str :从当前光标处向定位到字符串 str 处,Esc 退出。注意,Ctrl + S默认被用户控制 XON/XOFF ,需要在终端里执行stty -ixon或加入profile。

注意上述所有涉及Alt键的实际是Meta键,在xshell中默认是没有勾选“Use Alt key as Meta key”,要充分体验这些键带来的快捷,请在对应的terminal设置。

参考高效操作BashBash (Unix shell) Keyboard shortcutsbash中的命令基本操作

常用alias

以下bash中别名设置我还并没有完全使用,也是个人觉得非常有用的(多了记起来也麻烦),所以收集在一起,习惯就好。
/etc/profile.d/alias.sh

alias wl='ll | wc -l'
alias l='ls -l'
alias lh='ls -lh'
alias grep='grep -i --color' #用颜色标识,更醒目;忽略大小写
alias vi=vim
alias c='clear' # 快速清屏
alias p='pwd'
# 进入目录并列出文件,如 cdl ../conf.d/
cdl() { cd "$@" && pwd ; ls -alF; }
alias ..="cdl .."
alias ...="cd ../.." # 快速进入上上层目录
alias .3="cd ../../.."
alias cd..='cdl ..'
# alias cp="cp -iv" # interactive, verbose
alias rm="rm -i" # interactive
# alias mv="mv -iv" # interactive, verbose
alias psg='\ps aux | grep -v grep | grep --color' # 查看进程信息
alias hg='history|grep'
alias netp='netstat -tulanp' # 查看服务器端口连接信息
alias lvim="vim -c \"normal '0\"" # 编辑vim最近打开的文件
alias tf='tail -f ' # 快速查看文件末尾输出
# 自动在文件末尾加上 .bak-日期 来备份文件,如 bu nginx.conf
bak() { cp "$@" "$@.bak"-`date +%y%m%d`; echo "`date +%Y-%m-%d` backed up $PWD/$@"; }
# 级联创建目录并进入,如 mcd a/b/c
mcd() { mkdir -p $1 && cd $1 && pwd ; }
# 查看去掉#注释和空行的配置文件,如 nocomm /etc/squid/squid.conf
alias nocomm='grep -Ev '\''^(#|$)'\'''
# 快速根据进程号pid杀死进程,如 psid tomcat, 然后 kill9 两个tab键提示要kill的进程号
alias kill9='kill -9';
psid() {
[[ ! -n ${1} ]] && return; # bail if no argument
pro="[${1:0:1}]${1:1}"; # process-name –> [p]rocess-name (makes grep better)
ps axo pid,user,command | grep -v grep |grep -i --color ${pro}; # show matching processes
pids="$(ps axo pid,user,command | grep -v grep | grep -i ${pro} | awk '{print $1}')"; # get pids
complete -W "${pids}" kill9 # make a completion list for kk
}
# 解压所有归档文件工具
function extract {
if [ -z "$1" ]; then
# display usage if no parameters given
echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
else
if [ -f $1 ] ; then
# NAME=${1%.*}
# mkdir $NAME && cd $NAME
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.tar.xz) tar xvJf $1 ;;
*.lzma) unlzma $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x -ad $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*.xz) unxz $1 ;;
*.exe) cabextract $1 ;;
*) echo "extract: '$1' - unknown archive method" ;;
esac
else
echo "$1 - file does not exist"
fi
fi
}
# 其它你自己的命令
alias nginxreload='sudo /usr/local/nginx/sbin/nginx -s reload'


要去掉别名,请用unalias aliasname,或者临时执行不用别名,执行原始命令\alias

vim编辑器技巧备忘(初级-中级)


2017年12月31日 10:10:57   1,620 次浏览

“学习vim并且其会成为你最后一个使用的文本编辑器”
学习建议:

丢弃鼠标和小键盘
具有搭配使用各种按键的意识

 

 

 

1. 初级

1.1 编辑模式(Insert Mode)

编辑模式包括以下动作:

  • insert:i在光标所在字符前插入,I在当前行首第一个非空格字符前插入
  • append:a在光标所在字符后插入,A在行末尾开始插入
  • open:o在下一行插入新行,O在光标所在行的上一行插入新行
  • replace:r将光标处字符替换成r紧接的字符;R一直替换字符串,知道ESC键退出,同windows下的Insert键
  • Ctrl+p:自动提示
  • [ESC]:回到普通模式

 

 

1.2 普通模式(Normal Mode)

  • h, j, k, l,分别对应 左← 下↓ 上↑ 右→
  • :q, :q!, :wq 退出 不保存强行退出 保存退出
  • 移动光标到当前行首/非空格,同^,:0
  • $ 移动光标到当前行尾,同:$
  • G 移动光标到文档最后一行首
  • 30G 转到第30行,同 :30
  • 9- 光标向上移动9行,同9k
  • 9+ 光饼向下移动9行,同9[space],9j
  • gg 转到文档第一行(1G)
  • H 移动到屏幕的第一列
  • M 移动到屏幕的中间列
  • L 移动到屏幕的最后列
  • w 移动到下一个单词的首字母,(标点符号认为是一个单词,W表示单词以空格分隔)
  • e 移动到下一个单词的末尾,(E认为单词以空格分隔)
  • b 移动到上一个单词的首字母,(B认为单词以空格分隔)
  • fx 移动到下一个字母是x的位置。Fx向上移动。
  • % 匹配括号移动,包括 (, {, [ ,你需要把光标先移到括号上
  • CTRL+b 向上(前)翻页
  • CTRL+f 向后翻页
  • d 删除开始。其实是放到寄存器中,p或P命令调用。c即change,删完进入编辑模式
  • d$ 删除光标到行尾的所有文字,同D。C指令进入编辑模式
  • dw 删除当前字符到单词尾的所有字符。cw删除光标后的单词并进入插入模式,等同替换
  • dd 删除当前一行
  • 2dd 删除当前两行
  • x 剪切光标处字符,可以p粘贴出来
  • y 复制开始。yank起来,p或P命令调用
  • yy p 复制当前行并粘贴到下一行
  • 5yy p 复制当前行以下5行,在合适的地方粘贴
  • yw p 复制一个单词并粘贴。
  • yi{ 复制光标所在{}中的内容。很容易知道ci{ 和 di “ 的意思。
  • u 撤销
  • CTRL+r 重做
  • . 点号重复做上一个命令
  • `. 移动光标到上一次的修改点
  • Ctrl+g 查看我当前位置

1.3 命令模式

  • /word 向下查找word,n定位到下一个。?word 向上开始查找,同 /word 配合N。* 直接查找光标所在处单词
  • :%s/word1/word2/g 替换所有 word1 为 word2 (^$ [])
  • :set noic 区分大小写 (即set no igorecase,set ic不区分大小写)
  • :set nu 显示行号。:set nonu相反,不显示行号
  • :set paste 设置为粘贴模式,解决Ctrl+Insert粘贴时缩进错乱问题。:set nopaste设置回默认
  • :se ff=unix 设置文本文件的格式为unix,去掉windows系统文件中的^M。
  • :!ls 执行bash下的命令ls,回车后继续回到vi。一般在一个不存在的目录中创建文件时用到
  • :set all 查看vim说有设置属性值
  • :map 查看绑定的快捷键
  • :marks 查看可用标记

熟练上面的命令,已经可以满足日常工作要求,要提高效率可以学习vim的高级用法,如分屏显示、分页、标签功能、代码折叠、键盘映射。

1.4 可视化模式

visual mode多用于用键盘灵活选择文本。vV键进入,可以实现同时编辑多行(如注释)

2. 中级

2.1 高级组合命令

  • :sh 暂时离开vi,进入shell命令行
  • :!ls !表示要执行一个shell命令
  • q: 调出历史命令窗口
  • cc 替换一行,清空一行
  • cw 替换一个单词,进入插入模式
  • ea 在当前单词最后插入
  • vw visual模式选择一个单词
  • VU 全选一行,转换成大写
  • :5,12 co 13 将5至12行复制到第13行下
  • gg=G 自动缩排文件
    % : 匹配括号移动,包括 (, {, [. ,你需要把光标先移到括号上
    *#:匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

当光标在( ), [ ],< >, { }, " ", '' 内时,可以用ci, di, 或yi,加上(, [, <,{, ", '。这样可以改写/删除/复制( )内,[ ]内,< >内,{ }内," "内,' '内的内容

多行注释(块操作)

  1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;
  2. 在行首使用上下键kj选择需要注释的多行;
  3. 按下键盘(大写)I键,进入插入模式;
  4. 然后输入注释符(“//”、“#”等);
  5. 最后按下esc

删除多行开头的一个字符与此类似,删除多个字符也只要左右键,然后使用d。

另外一种多行注释的方式就是替换:

  • :5,9s/^/#/g 添加注释#
  • :5,9s/^#//g 删除注释#
  • :5,9s#^#//#g 添加注释//,同:5,9s/^/\/\/#/g
  • :5,9s#^//##g 删除注释//

多行缩进
[ESC], Ctrl+v 选择行 <或>左右缩进,=自动缩进(gg=G的局部功能)

多行行末尾加上 >> ${log}:Ctrl+v /^echo
>>相当于tab键,一个缩进

多行删除

  1. 首先在命令模式下,输入set nu显示行号;
  2. 通过行号确定你要删除的行;
  3. 命令输入:32,65d,回车键,32-65行就被删除了

自动补全
在Insert模式下,你可以输入一个词的开头,然后按 <C-p>或是<C-n>,自动补齐功能就出现了

2.2 分屏(split)

分割窗口(同时编辑多个文件)

  • vi -o file1 file2 水平分屏,也可以在先打开file1后,使用:sp file2
  • vi -O file1 file2 垂直分屏,也可以在先打开file1后,使用:vsp file2
  • Ctrl+w w 光标切换到另一个屏
  • k 关闭当前窗口,如果有改动则提示要先保存。:wqa!保存退出所有文件
  • Ctrl+w v 左右分割当前打开的文件。Ctrl+w s上下分割显示
  • Ctrl+w H 左移该屏(大写,L右移,K上移—改变vertical为horizontal)
  • :set scb 分屏同步滚动

另外一种不分屏,同时编辑多个文件的方法

vi file1 file2

  • :ls 展示全部打开的文档。其中 % 代表正在打开的文件(buffer),# 代表上一个编辑过的文件,a 代表当前激活的buffer空间,+ 代表有修改过的内容但还未保存
  • :buffer 2 转到打开的第二个文件。或简写为 :b2
  • :bn 转到下一个文件。没有保存不能离开这个文件。:bp 上一个文件
  • :b# 转到上一个编辑过的文件,同 :e #。类似于多屏中Ctrl+w w
  • :e file3 编辑一个新的文件
  • Ctrl+g 显示当前文件名和行号,同 :f

2.3 折叠(fold)

主要应用在复杂脚本的场合,特别是函数比较多,逻辑结构比较复杂的代码。(:help folding
有6种方式来折叠代码

  1. manual //手工定义折叠
  2. indent //用缩进表示折叠
  3. expr  //用表达式来定义折叠
  4. syntax //用语法高亮来定义折叠
  5. diff //对没有更改的文本进行折叠
  6. marker //用标志折叠

indent
:set foldmethod=indent 设置缩进折叠,fdm为简写。只对当前会话有效,要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=indent

  • zc 折叠与当前缩进相同的行
  • zo 打开折叠
  • zj 移到下一个折叠处
  • zk 移到上一个折叠处
  • zm 折叠所有可折叠标记
  • zr 展开所有折叠
  • [z 到当前打开折叠的开始
  • ]z 到当前打开折叠的结束

marker
注意与后文的mark不是同一东西,:set fdm=marker

  • zf 创建marker,默认 # { { {, # } } }
  • Ctrl+v zf 进入可视化模式,选择需要折叠的行,zc执行折叠。会自动加入 # { { { code block # } } }
  • zf9j 创建从当前行起至以下9行的折叠标记,zc进行折叠。同9zf。类似有zf30G,从当前行折叠刀第30行
  • zf% 创建匹配的 {}, [], (), <> 的fold。不用执行zc
  • zd 删除当前行上存在的折叠标记。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效

2.4 标记

标记(mark)是vim提供的精确定位技术,只要你知道标记的名字,就可以使用命令直接跳转到该标记所在的位置。vim中的标记都有一个名字,这个名字用单一的字符表示。大写和小写字母(A-Za-z)都可以做为标记的名字,这些标志的位置可以由用户来设置;而数字标记0-9,以及一些标点符号标记,用户不能进行设置,由vim来自动设置。(:help mark-motions查看更多帮助)

  • ms 定义一个标记s
  • `s 跳转到标记s的地方
  • 's 跳转到调剂s所在行首
  • `. jump to position where last change occurred in current buffer
  • “ jump back (to position in current buffer where jumped from)
  • :delmarks aA 使用 :delmarks! 删除所有小写(a-z)的标记
  • :marks 查看所有标记

 

Centos7 nginx 使用密码认证


2017年10月11日 14:52:45   1,490 次浏览
nginx密码认证场景
1.一些非公开的页面,只想给特定的用户访问,但是又不想写权限控制
2.临时需要请求线上的调试接口,但是这些接口不能直接暴露
nginx启用密码认证(下面是基于centos7)
1.安装一个生成账号密码的小工具
# yum install httpd-tools
2.生成一个账号密码
# htpasswd -bc 生成账号密码文件路径 账号名 密码
(例子:)htpasswd -bc /tmp/t.db root 123456
3.在nginx配置启用密码认证
location / {
     root  /usr/share/nginx/html;
     index  index.html index.htm;
     auth_basic "input password";   # 这里是提示信息
     auth_basic_user_file /tmp/t.db; # 这里填写刚才生成的文件路径
}
4.重新加载配置文件
nginx -s reload
效果图

 

启用验证后需要输入密码的界面

 

如果没有通过验证的时候

通过验证后可以访问网站
如何退出验证呢
通过分析,登录凭证并不是放在cookie而是在header(字段是Authorization)。所以重新打开浏览器的时候就需要重新登录了。

Centos6.5 Git安装


2017年10月10日 14:13:24   1,459 次浏览
一、安装Git
CentOS上
1.1、yum install -y epel-release;yum install -y git

 

Ubuntu上
1.2、sudo apt-get install git

 

Windows上安装msysgit
下载地址https://git-for-windows.github.io
1.3、安装完成后,还需要最后一步设置
git config –global user.name “Your Name” //比如guji

 

git config –global user.email “ylhaxm@126.com” //写你的邮箱

 

配置完成后在用户家目录下有个.gitconfig的隐藏文件
我们通过cat 去查看一下里面都有哪些内容

 

< 3 Keepalived-Master – [root]:~ > # git –version //查看版本

 

git version 1.7.1
二、创建版本仓库并推送文件
mkdir /home/gitroot

 

cd /home/gitroot

 

git init //用这个命令初始化,让这个目录变成git可以管理的仓库

 

ls -a 可以看到多了一个.git的目录
echo -e “123\naaaa\n456\nbbb” >1.txt 创建一个文件1.txt
git add 1.txt //把1.txt添加到时仓库中
git commit -m “add new file 1.txt” //add完了必须要commit才算真正 把文件提交到git仓库里
echo -e “111111\n222222222222” >> 1.txt //更改一下1.txt
git status //查看当前仓库中的状态,比如是否有改动的文件
Git操作回滚
git checkout 1.txt //操作回滚
此时1.txt的内容已经恢复到上一次版本
git diff 1.txt //对比1.txt本次修改了什么内容,相比较仓库里面的版本
+kkkk表示新增的内容,a/1.txt是线上的仓库,b/1.txt是本地的
再进行提交git add 1.txt
git commit -m “描述信息第二次更改”
****更改前使用git status 先查看状态,再进行修改