作者新方向,感谢支持
初衷(Original Intention)
- 整理下自己所学。但是比较随意,所以很多地方不够严谨,所以请带着批评的思维阅读。
- 带动更多的人进入 Linux 世界,特别是做 Java 开发的人
- Github 项目地址,欢迎
Fork、Star: - 文章中用到的一些安装包归纳整理:
- Gitbook 在线阅读地址:
- 学得越多越是明白一个人的力量是不够的,我只是起了一个引子,希望你能一起参与,真心希望!!!(鞠躬)
优秀同行推荐
目录(Contents)
- Linux 介绍
- Ubuntu 介绍
- Ubuntu 安装
- Ubuntu 设置(目录)
- Kali Linux 介绍和设置(目录)
- CentOS 介绍
- CentOS 6 安装
- CentOS 7 安装
- CentOS 6 和 CentOS 7 差异
- CentOS 设置(目录)
- Ubuntu 安装 VMware
- VMware 克隆 CentOS 后网卡信息修改
- Vim 安装、配置、快捷键列表
- SSH 免密登录
- Bash 命令
- Bash 其他常用命令
- 安装的 rm(删除)
- Sed 命令
- Linux 下常用压缩文件的解压、压缩
- Yum 下载安装包及对应依赖包
- Zsh 入门
Linux
Linux 介绍
Linux 这个名字
Linux 的 Wiki 介绍:
Linux 也称:GNU/Linux,而其中 GNU 的全称又是:Gnu’s Not Unix。
其中 GNU 放前面是有原因的,GNU 介绍:
对于 Linux 和 GNU/Linux 的两种叫法是有争议,可以看下面文章:
其实我们可以认为:Linux 本质是指 Linux 内核,而称 GNU/Linux 则代表这是一个系统,所以我认为 Debian 的这个叫法是合理的,但是确实有点不好念和记忆。所以普遍大家直接称作 Linux。
通过上面的全称和资料其实我们也就了解到,Linux 本质来源不是 Unix,但是它借鉴了 Unix 的设计思想,所以在系统业界上把这种和 Unix 是一致设计思想的系统归为:类 Unix 系统。
类 Unix 系统的介绍:
类 Unix 系统,除了我们今天要讲的 Linux,还有大家熟知的 Mac OS X、FreeBSD(这两个是直接从 Unix 系发展过来的,所以相对 Linux 是比较地道的类 Unix 系统)
- FreeBSD 介绍:
- Mac OS X 介绍:
Linux 的发行版本
Linux 的 Wiki 中有这句话:
通常情况下,Linux 被打包成供个人计算机和服务器使用的 Linux 发行版,一些流行的主流 Linux 发布版,包括 Debian(及其派生版本 Ubuntu、Linux Mint)、Fedora(及其相关版本 Red Hat Enterprise Linux、CentOS)和 openSUSE、ArchLinux(这个是我补充的)等。
通过上面这句话我做了总结,我个人觉得应该这样分:
- Fedora、RHEL、Centos 是一个系,他们的区别:
- Debian、Ubuntu 是一个系的,他们的区别直接看 Ubuntu 的 Wiki 就可以得知:
- ArchLinux 自己一个系:
- openSUSE 自己一个系:
根据用途可以再总结:
- Fedora 系业界一般用于做服务器
- Debian 系业界一般用于桌面,移动端,TV这一类
- ArchLinux 系,很轻量的Linux,适合有一定Linux基础,并且爱折腾的人使用,用它做桌面或是服务器都行。
- OpenSuse 系,嘛,嗯…人气相对比较差,一般是服务器。
其实 Linux 的发行版本有太多了,我也只是简单说下常见的而已,具体可以看:
Linux 作用
为什么要用 Linux 系统?大家常看到的说法是这样的:
Linux 是一个开源的,有潜力,安全,免费的操作系统
我觉得这几个点都比较虚, 特别是免费这东西,在景德镇应该算是最不值钱的东西。作为系统的上层使用者来讲,我们之所以喜欢某个操作系统就是因为它可以加快的你生产效率,提高产能。我推荐 Linux 也只是因为它适合常见的编程语言做开发环境,仅此一点。
所有,对此我的总结就是:
如果你是某种语言的开发者,你从事这个行业,不管你怎么学习下去,Linux 永远绕不开。从简单的各种语言开发,到后期的服务器部署,分布式,集群环境,数据库相关等,Linux 都在等着你。如果你是新手程序员可能还不太懂我这句话,但是我这里可以这样提示:你可以认真去看下各个语言的官网、对应的开发组件官网,看下他们的下载和新手上路相关页面,都会有 Linux 系统对应的介绍,但是不一定有会 Windows。(P.S:微软系、美工等设计系是唯一这个总结之外的人)
在认识 Linux 作用上我以下面这边文章为结尾。Linux 和 Mac OS X 都是类 Unix 系统,所以这篇文章中基本上的理由都可以用到 Linux 上的。
为什么国外程序员爱用 Mac?
推荐的发行版本
Ubuntu:适用于开发机
推荐版本:Ubuntu kylin 15.10
- Ubuntu kylin 官网:
- Ubuntu 英文官网:
- Ubuntu 中文官网:
- 网易镜像:
- 阿里云镜像:
- Ubuntu kylin 15.10 64 位镜像地址:
推荐理由:
我们是要在上面做开发的,不是要把他变成生活用机的,所以你认为自己尝试安装各种中文输入法很爽吗?自己尝试让国际 Ubuntu 版变成又一个符合国情的 kylin 很爽吗?真心别折腾这些没用的东西。就像我以前说的,大学老师让 Java 新手使用记事本写代码就是一种非常 shit 行为,不断地在 Windows 上用 cmd > javac 是毫无意义的。
CentOS:适用于服务器机
推荐版本:6.7
- CentOS 官网:
- 网易镜像:
- 阿里云镜像:
- CentOS 6.7 64 位镜像地址:
推荐理由:
Fedora(CentOS、RHEL) 系,是在国内外,作为企业服务器的系统最多,没有之一。我在 Quora 和知乎上也搜索了下,基本上大家都是赞同这个观点的。
Ubuntu
Ubuntu 介绍
- Ubuntu 母公司 Canonical:
- Ubuntu 百科:
- Ubuntu Wiki:
- Ubuntu 英文官网:
- Ubuntu 中文官网:
- Ubuntu kylin 官网:
- Ubuntu 标准桌面版下载:
- Ubuntu 官网回答社区:
- Ubuntu 正式衍生版本:
- Ubuntu 非正式衍生版本:
- Unity 桌面介绍:
- GNOME 桌面介绍:
- KDE 桌面介绍:
Ubuntu 原型系统:Debian
- Debian Wiki:
- Debian 百科:
- Debian 官网:
- Debian 自我介绍:
- 关键字:
- [Debian 社群契约](https://www.debian.org/social_contract)
- [何谓自由 (Free)? 或者说,何谓自由软件 (Free Software)?](https://www.debian.org/intro/free)
- [什么是自由软件?](http://www.gnu.org/philosophy/free-sw)
- [Debian 历史](https://www.debian.org/doc/manuals/project-history/)
- Debian 的发行版介绍:
- Debian 官网稳定版下载 1:
- Debian 官网稳定版下载 2:
- Debian 中国镜像 1:
- Debian 中国镜像 2:
- Debian 中国镜像 3:
- Debian 中文安装手册:
- Debian 软件列表:
Ubuntu Install
Ubuntu 安装和分区
- 先下载该系列教程(提取码:8qfg):

- 找到如图箭头目录上的两个视频,并看完,你对 Ubuntu 的安装就有了一个大概的了解,视频中 Ubuntu 虽然版本较早 13.04 的, 但是没关系,对于 Ubuntu 来讲新旧版本安装基本都一样的,所以别担心,驱动的问题也别担心,我们不是要在 Ubuntu 打游戏的,所以常见驱动系统是已经帮我们集成的不会影响使用。但是分区这一块的话,我个人建议是手工分区,视频中没有最终执行手动分区,只是演示了一下又返回了。 我个人是要求你手动分区的。
- 但是再讲分区之前,用什么设备安装是第一前提,我这里推荐用 U 盘,你准备一个 4 G 以上的 U 盘,把 Ubuntu 系统进行格式化到里面,用这个 U 盘作为安装盘进行安装。这个过程不难,具体看如下文章:
- http://www.Ubuntukylin.com/ask/index.php?qa=jc_1
- http://www.wubantu.com/36bc2075036fab76.html
- http://tieba.baidu.com/p/2795415868
- http://www.Ubuntukylin.com/public/pdf/UK1410install.pdf
- 好了假设你现在已经格式化好 U 盘,现在可以开始讲分区了。这里特别说明的是有多个硬盘的,多块硬盘分区方案就没视频中那么简单,特别是 Linux 的盘符不了解的就更加难了,所以看下图:

- 以我这边为例:我这边机子的硬盘是:一个 128 G 固态 + 500 G 的机械,我给一个分区方案给你们参考。下面的内容需要你先看过视频才能看懂:
- Linux 一般可分 3 个分区,分别是
boot 分区、swap 分区和根分区(根分区也就是斜杠/) boot 是主分区类型,swap 是是逻辑分区,/ 是逻辑分区,其他如果你还想划分的也都是逻辑分区。 最近年代生产的的主板,可能还需要分出一个 EFI 分区启动。EFI 的选择和 swap 一样,都在那个下拉菜单中。 怎么判断你要不要分出一个 EFI 呢?如果你根据我的要求分了 boot,swap,根之后,点击下一步报错,有提示 EFI 相关的错误信息,那就分一个给它,我这边就是有报错的。
- 120 G 固态硬盘:
- `/boot` == 1G(主分区),这里为boot单独挂载是有必要的。系统崩溃的时候,损坏的是这个分区。我们重装系统之后,其他分区我们保留下来,重新挂载上去就可以用了。
- `/EFI` == 100M(主分区)(我有提示报错需要分这个,我就分了)
- `/swap` == 12G(逻辑分区)一般大家的说法这个大小是跟你机子的内存大小相关的,也有说法内存大不需要这个,但是还是建议分,我内存是12G,所以我分12G。
- `/` == 100G(逻辑分区)
- 500 G 机械硬盘:
- `/home` == 500G(逻辑分区)
- 分区后的安装都是下一步的,而且 Ubuntu kylin 还是中文的说明,所以没啥难度。 到此假设你给自己的电脑安装了 Ubuntu,那下一讲我将讲 Ubuntu 的相关设置。
- 如果你想用 VMware 虚拟机安装,这个教程推荐给你,讲得很详细。
- [http://www.jikexueyuan.com/course/1583.html](http://www.jikexueyuan.com/course/1583.html)
CentOS Install
CentOS 安装
概括
- 本教程中主要演示了 VirtualBox 和 VMware Workstation 下安装
CentOS 6.6的过程。 - VirtualBox 是免费开源,我个人在使用经历中遇到过很多次崩溃、安装有问题等,所以它不是我主推的虚拟机
- VMware Workstation 是商业软件,很好用,一些辅助功能也很到位,主推该虚拟机。
- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及下载这个软件:USBWriter(提取码:5aa2)
- USBWriter 的使用很简单,如下图即可制作一个 CentOS 系统盘
VirtualBox 下安装 CentOS 过程
- VirtualBox 的介绍和下载
- 官网:
- wiki:
- 百度 wiki:
- 百度云下载(32 位和 64 位一体):
- 官网下载:
VirtualBox 安装细节开始:

- 如上图标注 1 所示:点击
新建一个虚拟机。 - 如上图标注 2 所示:在填写
名称的时候,输入CentOS相关字眼的时候,下面的版本类型会跟着变化,自动识别为Red Hat 
- 如上图标注 1 所示:我们装的是 64 位系统,如果你本机内存足够大,建议可以给 2 ~ 4 G 的容量




- 如上图所示,命名最好规范,最好要带上系统版本号,硬盘大小建议在 8 ~ 20 G

- 如上图 gif 演示,当我们创建好虚拟机之后,需要选择模拟光驱进行系统镜像安装


- 如上图箭头所示,我们这里选择
Skip,跳过对镜像的检查,这个一般需要检查很久,而且我们用 iso 文件安装的,一般没这个必要 

- 如上图标注 1 所示,建议 Linux 纯新手使用简体中文环境



- 如上图标注 1 所示,因为我们是用全新的虚拟机,虚拟出来的硬盘都是空的,所以这里可以忽略所有数据



- 再次强调下,root 账号也就是图上所说的
根账号,它是最顶级账号,密码最好别忘记了 

- 如上图标注 1 所示,因为我们是用全新的虚拟机,所以这里选择
使用所有空间,然后 CentOS 会按它默认的方式进行分区 

Desktop代表:图形界面版,会默认安装很多软件,建议新手选择此模式,我后面其他文章的讲解都是基于此系统下,如果你不是此模式的系统可能在安装某些软件的时候会出现某些依赖包没有安装的情况basic sever代表:命令行界面,有良好基础的基本都会喜欢这个
- 上一步我选择的是
Desktop所以有很多软件需要安装,这个过程大概需要 5 ~ 10 分钟 
- 安装完成
- 安装完成后一定要把盘片删除,防止系统启动的时候去读盘,重新进入安装系统模式
VMware 下安装 CentOS 过程
- VMware Workstation 的介绍和下载
- 官网:
- wiki:
- 百度 wiki:
- 百度云下载(64 位):
- 官网下载:
VMware 安装细节开始:

- 默认 VMware 选择的是
典型我不推荐,我下面的步骤是选择自定义(高级)。如果你非常了解 Linux 系统倒是可以考虑选择典型,在它默认安装完的系统上可以很好地按你的需求进行修改 

- 牢记:不要在这一步就选择镜像文件,不然也会直接进入
典型模式,直接按它的规则进行系统安装 




- 桥接模式:(建议选择此模式)创建一个独立的虚拟主机,在桥接模式下的虚拟主机网络一般要为其配 IP 地址、子网掩码、默认网关(虚拟机ip地址要与主机ip地址处于同网段)
- NAT 模式:把物理主机作为路由器进行访问互联网,优势:联网简单,劣势:虚拟主机无法与物理主机通讯
- 主机模式:把虚拟主机网络与真实网络隔开,但是各个虚拟机之间可以互相连接,虚拟机和物理机也可以连接
- > 上面解释来源:

- Buslogic 和 LSIlogic 都是虚拟硬盘 SCSI 设备的类型,旧版本的 OS 默认的是 Buslogic,LSIlogic 类型的硬盘改进了性能,对于小文件的读取速度有提高,支持非 SCSI 硬盘比较好。
- > 上面解释来源:



- 强烈建议至少要给 20 G,不然装不了多少软件的



- 如上图 gif 所示,在创建完虚拟机之后,我们要加载系统镜像,然后启动虚拟机进行安装,接下来的安装步骤跟上面使用 VirtualBox 安装细节基本一样,不一样的地方是我这里选择的是自定义分区,不再是选择默认分区方式

- 如上图箭头所示,这里我们选择自定义分区方式

- 如上图 gif 所示,我只把最基本的区分出来,如果你有自己的需求可以自己设置
- 简单分区方案:
/boot== 500 M(主分区)/swap== 2 G(逻辑分区)一般大家的说法这个大小是跟你机子的内存大小相关的,也有说法内存大不需要这个,但是还是建议分,虚拟机内存 2 G,所以我分 2 G/== 剩余容量(逻辑分区)剩余的空间都给了根分区









CentOS 7 Install
CentOS 7 安装
概括
- 本教程中主要演示了 VMware Workstation 下安装
CentOS 7.3的过程。 - VMware 的使用细节可以看这篇:CentOS 6 安装
- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及 Windows 下载这个软件:USBWriter(提取码:5aa2)
- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及 macOS 下载这个软件:balenaEtcher(提取码:oqp9)
- USBWriter 的使用很简单,如下图即可制作一个 CentOS 系统盘
VMware 下安装 CentOS 过程
- VMware Workstation 的介绍和下载
- 官网:
- wiki:
- 百度 wiki:
- 百度云下载(64 位):
- 官网下载:
- 安装细节开始:




- 如上图,默认是最小安装,点击进去,选择桌面安装。
- 如上图,默认是自动分区,如果懂得分区,点击进去,进行手动分区,CentOS 7 少了主分区,逻辑分区的选择了。

- 如上图,root 密码必须设置,我习惯测试的时候是:123456
- 我没有创建用户,喜欢用 root


- 如上图,许可证必须点击进去勾选同意相关协议。
- 如上图,网络可以稍后在设置,主机名可以现在先填写




- 如上图右上角,一般我们都选择跳过




- 到此完成,其他该做啥就做啥
CentOS6 and CentOS7
CentOS 6 和 CentOS 7 介绍
总体差异
想装回过去的一些工具
- 安装:
yum install -y tree net-tools bind-utils tree sysstat vim-en* lrzsz NetworkManager-tui ntp ntpdate iftop tcpdump telnet traceroute
查看版本号/主机名
cat /etc/redhat-releasecat /etc/hostname
常用配置差异
systemctl 的用法
- 相当于 CentOS 6 的:service nginx stop
systemctl is-enabled iptables.service#查询服务是否开机启动systemctl enable iptables.service#开机运行服务systemctl disable iptables.service#取消开机运行systemctl start iptables.service#启动服务systemctl stop iptables.service#停止服务systemctl restart iptables.service#重启服务systemctl reload iptables.service#重新加载服务配置文件systemctl status iptables.service#查询服务运行状态systemctl --failed#显示启动失败的服务systemctl list-units --type=service#查看所有服务systemctl is-enabled httpd#查看httpd服务是否开机启动- 对于启动脚本的存放位置,也不再是
/etc/init.d/(这个目录也是存在的),而是/usr/lib/systemd/system/
开放端口
- 一般设置软件端口有一个原则:
- 0 ~ 1024 系统保留,一般不要用到
- 1024 ~ 65535(2^16) 可以随意用
- 添加单个端口:
firewall-cmd --zone=public --add-port=8883/tcp --permanent - 添加范围端口:
firewall-cmd --zone=public --add-port=8883-8885/tcp --permanent - 删除端口:
firewall-cmd --zone=public --remove-port=8883/tcp --permanent - 重启防火墙:
firewall-cmd --reload
- 命令解释:
- `--zone` #作用域
- `--add-port=80/tcp` #添加端口,格式为:端口/通讯协议
- `--permanent` #永久生效,没有此参数重启后失效
- 列出所有端口列表:
firewall-cmd --list-all
关闭 firewall 使用 iptables
- 关闭 firewall
- `systemctl stop firewalld.service` #停止firewall
- `systemctl disable firewalld.service` #禁止firewall开机启动
- 安装 iptables
- `yum install -y iptables-services`
- 启动 iptables
- `systemctl restart iptables.service` #最后重启防火墙使配置生效
- `systemctl enable iptables.service` #设置防火墙开机启动
- 其他使用照旧
ifconfig 没有了
- 查看网络配置:
ip a - 装回 ifconfig:
yum install -y net-tools
设置时区
timedatectl set-timezone Asia/Shanghaitimedatectl status
资料
Ubuntu Install VMware
Ubuntu 安装 VMware
- 我个人习惯使用 VMware,在一些个性化和兼容性上,我觉得 VMware 比 box 好很多
安装说明
- 下载:VMware-Workstation-Full-10.0.4-2249910.x86_64.bundle
- 下载地址(rzb0):<http://pan.baidu.com/s/1dFuLD2D>
- 安装组件:
`` nginx
命令:sudo apt-get update
命令:sudo apt-get install build-essential linux-headers-uname -r`
- 进入软件下载后目录,比如我在 /opt/setups 下
- `cd /opt/setups`
- `chmod +x VMware*.bundle`
- `sudo ./VMware*.bundle`
- 接下来会弹出图形界面,则效果跟 Windows 一样,那就没啥好说了。
## 资料
- [How To Install VMware Workstation 11 On Ubuntu 14.10](https://www.liberiangeek.net/2014/12/install-vmware-workstation-11-ubuntu-14-10/)
---
## CentOS Virtual Machine Copy Settings
# VMware 克隆 CentOS 后网卡信息修改
## 概述
- 在我们需要多台 CentOS 虚拟机的时候,对已有虚拟机的系统进行克隆或是复制。但是这样做又有一个问题,克隆出来的虚拟机启动的时候你输入命令:`ifconfig`,eth0 网卡信息没了,只有一个 eth1。 对于处女座的人来讲这是不允许的。所以我们需要改动下。
- 复制虚拟机后,首次打开该会提示如下内容,一般选择 copy 这个配置。
- 
## CentOS 6 修改方法
- 设置 hostname:`hostnamectl --static set-hostname linux02`
- 命令:`sudo vim /etc/udev/rules.d/70-persistent-net.rules`
- 该文件中正常此时应该有两行信息
- 在文件中把 NAME="eth0″ 的这一行注释掉
- 对于另一行,把 NAME=”eth1″ 的这一行,把 NAME=”eth1″ 改为 NAME=”eth0″,并且把该行:ATTRS{address}=="00:0c:29:4c:46:01″ 这个属性信息记下来,每台机子都不一样,我这段信息只是例子,你不要直接复制我的。
- 命令:`sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0`
- 修改 IP 地址
- 把 HWADDR 的值改为上面要求记下来的:00:0c:29:4c:46:01
- 命令:`nmcli con > /opt/info.txt`
- 如果显示两行 UUID 的信息的话,复制不是 System eth0 的那个 UUID 值,下面有用。
- 编辑:`sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0`
- 把文件中的 UUID 值 改为上面要求复制的 UUID 值。
- 保存配置文件,重启系统,正常应该是可以了。
## CentOS 7 修改方法
- 在 VMware 15 Pro 的情况下,直接 copy 进行后,直接修改网卡配置即可
- 编辑该文件:`vim /etc/sysconfig/network-scripts/ifcfg-ens33`
- 把 ip 地址修改即可
---
## Vim Install And Settings
# Vim 安装和配置、优化
## Vim 介绍
- Vim 官网:<http://www.vim.org/>
## Vim 安装
- CentOS:`sudo yum install -y vim`
- Ubuntu:`sudo apt-get install -y vim`
- Windows GVim 下载:<http://www.xiazaiba.com/html/3347.html>
## Vim 配置(CentOS 环境)
- 编辑配置文件是:`sudo vim /etc/vimrc`
## Vim 基础快捷键
- 注意
- 严格区分字母大小写
- 含有 `Ctrl` 字眼都表示 Ctrl 键盘按钮
- 特定符号需要配合 Shift 键,比如字母键盘区上面的数字区:!@#%%^&*()
- 要按出冒号键 `:` 也是需要 Shift 的
- 移动
- `j`,下
- `k`,上
- `h`,左
- `l`,右
- `v`,按 v 之后按方向键可以选中你要选中的文字
- `gg`,跳到第 1 行
- `G`,跳到最后一行
- `16G` 或 `:16`,跳到第 16 行
- `$`,到本行 **行尾**
- `0`,到本行 **行头**
- `w`,到下一个单词的 **开头**
- `e`,到下一个单词的 **结尾**
- `Ctrl + u`,向文件 **首翻** 半屏
- `Ctrl + d`,向文件 **尾翻** 半屏
- `Ctrl + f`,向文件 **尾翻** 一屏
- `Ctrl + b`,向文件 **首翻** 一屏
- `*`,匹配光标当前所在的单词,移动光标到 **下一个** 匹配单词
- `#`,匹配光标当前所在的单词,移动光标到 **上一个** 匹配单词
- `^`,到本行第一个单词头
- `g_`,到本行最后一个单词尾巴
- `%`,匹配括号移动,包括 **(、{、[**
- 插入
- `I`,在当前 **行首** 插入
- `A`,在当前 **行尾** 插入
- `i`,在当前字符的 **左边** 插入
- `a`,在当前字符的 **右边** 插入
- `o`,在当前行 **下面** 插入一个新行
- `O`,在当前行 **上面** 插入一个新行
- 编辑
- 删除
- `x`,删除 **光标后** 的 1 个字符
- `2x`,删除 **光标后** 的 2 个字符
- `X`,删除 **光标前** 的 1 个字符
- `2X`,删除 **光标前** 的 2 个字符
- `dd`,删除当前行
- `cc`,删除当前行后进入 insert 模式
- `dw`,删除当前光标下的单词/空格
- `d$`,删除光标至 **行尾** 所有字符
- `dG`,删除光标至 **文件尾** 所有字符
- `3dd`,从当前光标开始,删掉 3 行
- `echo > aa.txt`,从 bash 角度清空文件内容,这个比较高效
- 复制
- `y`,复制光标所选字符
- `yw`,复制光标后单词
- `yy`,复制当前行
- `4yy`,复制当前行及下面 4 行
- `y$`,复制光标位置至 **行尾** 的内容
- `y^`,复制光标位置至 **行首** 的内容
- 粘贴
- `p`,将粘贴板中内容复制到 **光标之后**
- `P`,将粘贴板中内容复制到 **光标之前**
- 其他
- `ddp`,交换当前光标所在行和下一行的位置
- `u`,撤销
- `:wq`,退出并 **保存**
- `:q!`,退出并 **不保存**
- `Ctrl + v`,进入 Vim 列编辑
- `guu`,把当前行的字母全部转换成 **小写**
- `gUU`,把当前行的字母全部转换成 **大写**
- `g~~`,把当前行的字母是大写的转换成小写,是小写的转换成大写
- `:saveas /opt/setups/text.txt`,另存到 /opt/setups/text.txt
- 搜索
- `/YouMeek`,从光标开始处向文件尾搜索 YouMeek 字符,按 `n` 继续向下找,按 `N` 继续向上找
- `?YouMeek`,从光标开始处向文件首搜索 YouMeek 字符,按 `n` 继续向下找,按 `N` 继续向上找
- 替换
- `:%s/YouMeek/Judasn/g`,把文件中所有 YouMeek 替换为:Judasn
- `:%s/YouMeek/Judasn/`,把文件中所有行中第一个 YouMeek 替换为:Judasn
- `:s/YouMeek/Judasn/`,把光标当前行第一个 YouMeek 替换为 Judasn
- `:s/YouMeek/Judasn/g`,把光标当前行所有 YouMeek 替换为 Judasn
- `:s#YouMeek/#Judasn/#`,除了使用斜杠作为分隔符之外,还可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符,该命令表示:把光标当前行第一个 YouMeek/ 替换为 Judasn/
- `:10,31s/YouMeek/Judasn/g`,把第 10 行到 31 行之间所有 YouMeek 替换为 Judasn
## Vim 的特殊复制、黏贴
- Vim 提供了 12 个剪贴板,分别是:`0,1,2,3,4,5,6,7,8,9,a,"`,默认采用的是 `"`,也就是双引号,可能你初读感觉很奇怪。你可以用 Vim 编辑某个文件,然后输入:`:reg`。你可以看到如下内容:
- 
- 复制到某个剪切板的命令:`"7y`,表示使用 7 号剪切板。
- 黏贴某个剪切板内容:`"7p`,表示使用 7 号剪切板内容进行黏贴
## Vim 配置
- 我个人本地不使用 Vim 的,基本上都是在操作服务器的时候使用,所以这里推荐这个配置文件
- [vim-for-server](https://github.com/wklken/vim-for-server)
- 在假设你已经备份好你的 Vim 配置文件后,使用该配置文件:`curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc`
- 效果如下:
- 
- 需要特别注意的是,如果你平时粘贴内容到终端 Vim 出现缩进错乱,一般需要这样做:
- 进入 vim 后,按 `F5`,然后 `shift + insert` 进行粘贴。这种事就不会错乱了。
- 原因是:`vim ~/.vimrc` 中有一行这样的设置:`set pastetoggle=<F5>`
## 其他常用命令
- 对两个文件进行对比:`vimdiff /opt/1.txt /opt/2.txt`
## 资料
- [vim几个小技巧(批量替换,列编辑)](http://blogread.cn/it/article/1010?f=sa)
- [最佳vim技巧](http://www.2maomao.com/blog/wp-content/uploads/vim_tips.txt)
- [简明 Vim 练级攻略](http://coolshell.cn/articles/5426.html)
- [vim 批量查找替换](http://blog.csdn.net/wangchong0/article/details/6801956)
---
## SSH login without password
# SSH 免密登录
## 环境说明
- CentOS 7.3
## 关键点
- 免密登录的关键点在于理解谁登录谁。
- A 生成的公钥给 B,也给 C、D,则 A 可以直接免密 SSH 登录 B、C、D
## A 生成密钥
- 在 A 机器上输入命令:`ssh-keygen`
- 根据提示回车,共有三次交互提示,都回车即可。
- 生成的密钥目录在:**/root/.ssh**
- 写入:`cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys`
- 测试:`ssh localhost`
## 把 A 的公钥发给 B
- 假设 B 机器的 ip:`192.168.1.105`
- 则在 A 机器上输入:`ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@192.168.1.105`,根据提示输入 B 机器的 root 密码,成功会有相应提示
## 测试 A 免密登录到 B
- 在 A 机器上输入命令:`ssh -p 22 root@192.168.1.105`,则会相应登录成功的提示
-------------------------------------------------------------------
## 如果是用 pem 登录的话,用 ssh-copy-id 是无法使用的
- 先保存 A 的 pub 到本地:`sz /root/.ssh/id_rsa.pub`
- 登录 B 机子:`cd /root/.ssh/`
- 如果 B 机子没有 authorized_keys 文件则创建:`touch /root/.ssh/authorized_keys`
- 设置权限:`chmod 600 /root/.ssh/authorized_keys `
- 上传 pub 文件到 B 机子,并在 B 机子上执行:`cd /root/.ssh/ && cat id_rsa.pub >> authorized_keys`
---
## Bash
# Bash 常用命令
## 基础常用命令
- `某个命令 --h`,对这个命令进行解释
- `某个命令 --help`,解释这个命令(更详细)
- `man某个命令`,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索)
- `Ctrl + c`,结束命令
- `TAB键`,自动补全命令(按一次自动补全,连续按两次,提示所有以输入开头字母的所有命令)
- `键盘上下键`,输入临近的历史命令
- `history`,查看所有的历史命令
- `Ctrl + r`,进入历史命令的搜索功能模式
- `clear`,清除屏幕里面的所有命令
- `pwd`,显示当前目录路径(常用)
- `firefox&`,最后后面的 **&** 符号,表示使用后台方式打开 Firefox,然后显示该进程的 PID 值
- `jobs`,查看后台运行的程序列表
- `ifconfig`,查看内网 IP 等信息(常用)
- `curl ifconfig.me`,查看外网 IP 信息
- `curl ip.cn`,查看外网 IP 信息
- `locate 搜索关键字`,快速搜索系统文件/文件夹(类似 Windows 上的 everything 索引式搜索)(常用)
- `updatedb`,配合上面的 locate,给 locate 的索引更新(locate 默认是一天更新一次索引)(常用)
- `date`,查看系统时间(常用)
- `date -s20080103`,设置日期(常用)
- `date -s18:24`,设置时间,如果要同时更改 BIOS 时间,再执行 `hwclock --systohc`(常用)
- `cal`,在终端中查看日历,肯定没有农历显示的
- `uptime`,查看系统已经运行了多久,当前有几个用户等信息(常用)
- `cat 文件路名`,显示文件内容(属于打印语句)
- `cat -n 文件名`,显示文件,并每一行内容都编号
- `more 文件名`,用分页的方式查看文件内容(按 space 翻下一页,按 *Ctrl + B* 返回上页)
- `less`文件名,用分页的方式查看文件内容(带上下翻页)
- 按 **j** 向下移动,按 **k** 向上移动
- 按 **/** 后,输入要查找的字符串内容,可以对文件进行向下查询,如果存在多个结果可以按 **n** 调到下一个结果出
- 按 **?** 后,输入要查找的字符串内容,可以对文件进行向上查询,如果存在多个结果可以按 **n** 调到下一个结果出
- `shutdown`
- `shutdown -hnow`,立即关机
- `shutdown -h+10`,10 分钟后关机
- `shutdown -h23:30`,23:30 关机
- `shutdown -rnew`,立即重启
- `poweroff`,立即关机(常用)
- `reboot`,立即重启(常用)
- `zip mytest.zip /opt/test/`,把 /opt 目录下的 test/ 目录进行压缩,压缩成一个名叫 mytest 的 zip 文件
- `unzip mytest.zip`,对 mytest.zip 这个文件进行解压,解压到当前所在目录
- `unzip mytest.zip -d /opt/setups/`,对 mytest.zip 这个文件进行解压,解压到 /opt/setups/ 目录下
- `tar -cvf mytest.tar mytest/`,对 mytest/ 目录进行归档处理(归档和压缩不一样)
- `tar -xvf mytest.tar`,释放 mytest.tar 这个归档文件,释放到当前目录
- `tar -xvf mytest.tar -C /opt/setups/`,释放 mytest.tar 这个归档文件,释放到 /opt/setups/ 目录下
- `last`,显示最近登录的帐户及时间
- `lastlog`,显示系统所有用户各自在最近登录的记录,如果没有登录过的用户会显示 **从未登陆过**
- `ls`,列出当前目录下的所有没有隐藏的文件 / 文件夹。
- `ls -a`,列出包括以.号开头的隐藏文件 / 文件夹(也就是所有文件)
- `ls -R`,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,不显示隐藏的文件)
- `ls -a -R`,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,显示隐藏的文件)
- `ls -al`,列出目录下所有文件(包含隐藏)的权限、所有者、文件大小、修改时间及名称(也就是显示详细信息)
- `ls -ld 目录名`,显示该目录的基本信息
- `ls -t`,依照文件最后修改时间的顺序列出文件名。
- `ls -F`,列出当前目录下的文件名及其类型。以 **/** 结尾表示为目录名,以 **\*** 结尾表示为可执行文件,以 **@** 结尾表示为符号连接
- `ls -lg`,同上,并显示出文件的所有者工作组名。
- `ls -lh`,查看文件夹类文件详细信息,文件大小,文件修改时间
- `ls /opt | head -5`,显示 opt 目录下前 5 条记录
- `ls -l | grep '.jar'`,查找当前目录下所有 jar 文件
- `ls -l /opt |grep "^-"|wc -l`,统计 opt 目录下文件的个数,不会递归统计
- `ls -lR /opt |grep "^-"|wc -l`,统计 opt 目录下文件的个数,会递归统计
- `ls -l /opt |grep "^d"|wc -l`,统计 opt 目录下目录的个数,不会递归统计
- `ls -lR /opt |grep "^d"|wc -l`,统计 opt 目录下目录的个数,会递归统计
- `ls -lR /opt |grep "js"|wc -l`,统计 opt 目录下 js 文件的个数,会递归统计
- `ls -l`,列出目录下所有文件的权限、所有者、文件大小、修改时间及名称(也就是显示详细信息,不显示隐藏文件)。显示出来的效果如下:
nginx -rwxr-xr-x. 1 root root 4096 3月 26 10:57,其中最前面的 - 表示这是一个普通文件 lrwxrwxrwx. 1 root root 4096 3月 26 10:57,其中最前面的 l 表示这是一个链接文件,类似 Windows 的快捷方式 drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是一个目录
- `cd`,目录切换
- `cd ..`,改变目录位置至当前目录的父目录(上级目录)。
- `cd ~`,改变目录位置至用户登录时的工作目录。
- `cd 回车`,回到家目录
- `cd -`,上一个工作目录
- `cd dir1/`,改变目录位置至 dir1 目录下。
- `cd ~user`,改变目录位置至用户的工作目录。
- `cd ../user`,改变目录位置至相对路径user的目录下。
- `cd /../..`,改变目录位置至绝对路径的目录位置下。
- `cp 源文件 目标文件`,复制文件
- `cp -r 源文件夹 目标文件夹`,复制文件夹
- `cp -r -v 源文件夹 目标文件夹`,复制文件夹(显示详细信息,一般用于文件夹很大,需要查看复制进度的时候)
- `cp /usr/share/easy-rsa/2.0/keys/{ca.crt,server.{crt,key},dh2048.pem,ta.key} /etc/openvpn/keys/`,复制同目录下花括号中的文件
- `tar cpf - . | tar xpf - -C /opt`,复制当前所有文件到 /opt 目录下,一般如果文件夹文件多的情况下用这个更好,用 cp 比较容易出问题
- `mv 文件 目标文件夹`,移动文件到目标文件夹
- `mv 文件`,不指定目录重命名后的名字,用来重命名文件
- `touch 文件名`,创建一个空白文件/更新已有文件的时间(后者少用)
- `mkdir 文件夹名`,创建文件夹
- `mkdir -p /opt/setups/nginx/conf/`,创建一个名为 conf 文件夹,如果它的上级目录 nginx 没有也会跟着一起生成,如果有则跳过
- `rmdir 文件夹名`,删除文件夹(只能删除文件夹里面是没有东西的文件夹)
- `rm 文件`,删除文件
- `rm -r 文件夹`,删除文件夹
- `rm -r -i 文件夹`,在删除文件夹里的文件会提示(要的话,在提示后面输入yes)
- `rm -r -f 文件夹`,强制删除
- `rm -r -f 文件夹1/ 文件夹2/ 文件夹3/`删除多个
- `find`,高级查找
- `find . -name *lin*`,其中 . 代表在当前目录找,-name 表示匹配文件名 / 文件夹名,\*lin\* 用通配符搜索含有lin的文件或是文件夹
- `find . -iname *lin*`,其中 . 代表在当前目录找,-iname 表示匹配文件名 / 文件夹名(忽略大小写差异),\*lin\* 用通配符搜索含有lin的文件或是文件夹
- `find / -name *.conf`,其中 / 代表根目录查找,*.conf代表搜索后缀会.conf的文件
- `find /opt -name .oh-my-zsh`,其中 /opt 代表目录名,.oh-my-zsh 代表搜索的是隐藏文件 / 文件夹名字为 oh-my-zsh 的
- `find /opt -type f -iname .oh-my-zsh`,其中 /opt 代表目录名,-type f 代表只找文件,.oh-my-zsh 代表搜索的是隐藏文件名字为 oh-my-zsh 的
- `find /opt -type d -iname .oh-my-zsh`,其中 /opt 代表目录名,-type d 代表只找目录,.oh-my-zsh 代表搜索的是隐藏文件夹名字为 oh-my-zsh 的
- `find . -name "lin*" -exec ls -l {} \;`,当前目录搜索lin开头的文件,然后用其搜索后的结果集,再执行ls -l的命令(这个命令可变,其他命令也可以),其中 -exec 和 {} \; 都是固定格式
- `find /opt -type f -size +800M -print0 | xargs -0 du -h | sort -nr`,找出 /opt 目录下大于 800 M 的文件
- `find / -name "*tower*" -exec rm {} \;`,找到文件并删除
- `find / -name "*tower*" -exec mv {} /opt \;`,找到文件并移到 opt 目录
- `find . -name "*" |xargs grep "youmeek"`,递归查找当前文件夹下所有文件内容中包含 youmeek 的文件
- `find . -size 0 | xargs rm -f &`,删除当前目录下文件大小为0的文件
- `du -hm --max-depth=2 | sort -nr | head -12`,找出系统中占用容量最大的前 12 个目录
- `cat /etc/resolv.conf`,查看 DNS 设置
- `netstat -tlunp`,查看当前运行的服务,同时可以查看到:运行的程序已使用端口情况
- `env`,查看所有系统变量
- `export`,查看所有系统变量
- `echo`
- `echo $JAVA_HOME`,查看指定系统变量的值,这里查看的是自己配置的 JAVA_HOME。
- `echo "字符串内容"`,输出 "字符串内容"
- `echo > aa.txt`,清空 aa.txt 文件内容(类似的还有:`: > aa.txt`,其中 : 是一个占位符, 不产生任何输出)
- `unset $JAVA_HOME`,删除指定的环境变量
- `ln -s /opt/data /opt/logs/data`,表示给 /opt/logs 目录下创建一个名为 data 的软链接,该软链接指向到 /opt/data
- `grep`
- `shell grep -H '安装' *.sh`,查找当前目录下所有 sh 类型文件中,文件内容包含 `安装` 的当前行内容
- `grep 'test' java*`,显示当前目录下所有以 java 开头的文件中包含 test 的行
- `grep 'test' spring.ini docker.sh`,显示当前目录下 spring.ini docker.sh 两个文件中匹配 test 的行
- `ps`
- `ps –ef|grep java`,查看当前系统中有关 java 的所有进程
- `ps -ef|grep --color java`,高亮显示当前系统中有关 java 的所有进程
- `kill`
- `kill 1234`,结束 pid 为 1234 的进程
- `kill -9 1234`,强制结束 pid 为 1234 的进程(慎重)
- `killall java`,结束同一进程组内的所有为 java 进程
- `ps -ef|grep hadoop|grep -v grep|cut -c 9-15|xargs kill -9`,结束包含关键字 hadoop 的所有进程
- `head`
- `head -n 10 spring.ini`,查看当前文件的前 10 行内容
- `tail`
- `tail -n 10 spring.ini`,查看当前文件的后 10 行内容
- `tail -200f 文件名`,查看文件被更新的新内容尾 200 行,如果文件还有在新增可以动态查看到(一般用于查看日记文件)
## 用户、权限-相关命令
- 使用 pem 证书登录:`ssh -i /opt/mykey.pem root@192.168.0.70`
- 证书权限不能太大,不然无法使用:`chmod 600 mykey.pem`
- `hostname`,查看当前登陆用户全名
- `cat /etc/group`,查看所有组
- `cat /etc/passwd`,查看所有用户
- `groups youmeek`,查看 youmeek 用户属于哪个组
- `useradd youmeek -g judasn`,添加用户并绑定到 judasn 组下
- `userdel -r youmeek`,删除名字为 youmeek 的用户
- 参数:`-r`,表示删除用户的时候连同用户的家目录一起删除
- 修改普通用户 youmeek 的权限跟 root 权限一样:
- 常用方法(原理是把该用户加到可以直接使用 sudo 的一个权限状态而已):
- 编辑配置文件:`vim /etc/sudoers`
- 找到 98 行(预估),有一个:`root ALL=(ALL) ALL`,在这一行下面再增加一行,效果如下:
nginx
root ALL=(ALL) ALL
youmeek ALL=(ALL) ALL
- 另一种方法:
- 编辑系统用户的配置文件:`vim /etc/passwd`,找到 **root** 和 **youmeek** 各自开头的那一行,比如 root 是:`root:x:0:0:root:/root:/bin/zsh`,这个代表的含义为:*用户名:密码:UserId:GroupId:描述:家目录:登录使用的 shell*
- 通过这两行对比,我们可以直接修改 youmeek 所在行的 UserId 值 和 GroupId 值,都改为 0。
- `groupadd judasn`,添加一个名为 judasn 的用户组
- `groupdel judasn`,删除一个名为 judasn 的用户组(前提:先删除组下面的所有用户)
- `usermod 用户名 -g 组名`,把用户修改到其他组下
- `passwd youmeek`,修改 youmeek 用户的密码(前提:只有 root 用户才有修改其他用户的权限,其他用户只能修改自己的)
- `chmod 777 文件名/目录`,给指定文件增加最高权限,系统中的所有人都可以进行读写。
- linux 的权限分为 rwx。r 代表:可读,w 代表:可写,x 代表:可执行
- 这三个权限都可以转换成数值表示,r = 4,w = 2,x = 1,- = 0,所以总和是 7,也就是最大权限。第一个 7 是所属主(user)的权限,第二个 7 是所属组(group)的权限,最后一位 7 是非本群组用户(others)的权限。
- `chmod -R 777 目录` 表示递归目录下的所有文件夹,都赋予 777 权限
- `chown myUsername:myGroupName myFile` 表示修改文件所属用户、组
- `chown -R myUsername:myGroupName myFolder` 表示递归修改指定目录下的所有文件权限
- `su`:切换到 root 用户,终端目录还是原来的地方(常用)
- `su -`:切换到 root 用户,其中 **-** 号另起一个终端并切换账号
- `su 用户名`,切换指定用户帐号登陆,终端目录还是原来地方。
- `su - 用户名`,切换到指定用户帐号登陆,其中 **-** 号另起一个终端并切换账号
- `exit`,注销当前用户(常用)
- `sudo 某个命令`,使用管理员权限使用命令,使用 sudo 回车之后需要输入当前登录账号的密码。(常用)
- `passwd`,修改当前用户密码(常用)
- 添加临时账号,并指定用户根目录,并只有可读权限方法
- 添加账号并指定根目录(用户名 tempuser):`useradd -d /data/logs -m tempuser`
- 设置密码:`passwd tempuser` 回车设置密码
- 删除用户(该用户必须退出 SSH 才能删除成功),也会同时删除组:`userdel tempuser`
## 磁盘管理
- `df -h`,自动以合适的磁盘容量单位查看磁盘大小和使用空间
- `df -k`,以磁盘容量单位 K 为数值结果查看磁盘使用情况
- `df -m`,以磁盘容量单位 M 为数值结果查看磁盘使用情况
- `du -sh /opt`,查看 opt 这个文件夹大小 (h 的意思 human-readable 用人类可读性较好方式显示,系统会自动调节单位,显示合适大小的单位)
- `du -sh ./*`,查看当前目录下所有文件夹大小 (h 的意思 human-readable 用人类可读性较好方式显示,系统会自动调节单位,显示合适大小的单位)
- `du -sh /opt/setups/`,显示 /opt/setups/ 目录所占硬盘空间大小(s 表示 –summarize 仅显示总计,即当前目录的大小。h 表示 –human-readable 以 KB,MB,GB 为单位,提高信息的可读性)
- `mount /dev/sdb5 /newDir/`,把分区 sdb5 挂载在根目录下的一个名为 newDir 的空目录下,需要注意的是:这个目录最好为空,不然已有的那些文件将看不到,除非卸载挂载。
- 挂载好之后,通过:`df -h`,查看挂载情况。
- `umount /newDir/`,卸载挂载,用目录名
- 如果这样卸载不了可以使用:`umount -l /newDir/`
- `umount /dev/sdb5`,卸载挂载,用分区名
## wget 下载文件
- 常规下载:`wget http://www.gitnavi.com/index.html`
- 自动断点下载:`wget -c http://www.gitnavi.com/index.html`
- 后台下载:`wget -b http://www.gitnavi.com/index.html`
- 伪装代理名称下载:`wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.gitnavi.com/index.html`
- 限速下载:`wget --limit-rate=300k http://www.gitnavi.com/index.html`
- 批量下载:`wget -i /opt/download.txt`,一个下载地址一行
- 后台批量下载:`wget -b -c -i /opt/download.txt`,一个下载地址一行
## 资料
- <http://wenku.baidu.com/view/1ad19bd226fff705cc170af3.html>
- <http://blog.csdn.net/nzing/article/details/9166057>
- <http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/wget.html>
---
## Bash Other Bash
# Bash 其他常用命令
## 其他常用命令
- 编辑 hosts 文件:`vim /etc/hosts`,添加内容格式:`127.0.0.1 www.youmeek.com`
- RPM 文件操作命令:
- 安装
- `rpm -i example.rpm`,安装 example.rpm 包
- `rpm -iv example.rpm`,安装 example.rpm 包并在安装过程中显示正在安装的文件信息
- `rpm -ivh example.rpm`,安装 example.rpm 包并在安装过程中显示正在安装的文件信息及安装进度
- 查询
- `rpm -qa | grep jdk`,查看 jdk 是否被安装
- `rpm -ql jdk`,查看 jdk 是否被安装
- 卸载
- `rpm -e jdk`,卸载 jdk(一般卸载的时候都要先用 rpm -qa 看下整个软件的全名)
- YUM 软件管理:
- `yum install -y httpd`,安装 apache
- `yum remove -y httpd`,卸载 apache
- `yum info -y httpd`,查看 apache 版本信息
- `yum list --showduplicates httpd`,查看可以安装的版本
- `yum install httpd-查询到的版本号`,安装指定版本
- 更多命令可以看:<http://man.linuxde.net/yum>
- 查看某个配置文件,排除掉里面以 # 开头的注释内容:
- `grep '^[^#]' /etc/openvpn/server.conf`
- 查看某个配置文件,排除掉里面以 # 开头和 ; 开头的注释内容:
- `grep '^[^#;]' /etc/openvpn/server.conf`
## 资料
- <https://www.jianshu.com/p/180fb11a5b96>
---
## shell safe rm
# 安装的 rm(删除)
## 由来
- 我们都知道 `rm -rf` 是一个危险的操作,所以我们应该尽可能养成一个不要 rm 的习惯,而是 mv。
## 设置
- 创建一个用来存放要被我们删除的文件夹存放地:`cd $home && mkdir .trash`
- 赋予最高权限(个人习惯):`chmod 777 .trash`
- 如果你使用 bash,你需要修改你的 home 目录下的:`.bashrc`
- 我使用的是 zsh,所以我修改:`vim .zshrc`,在文件的最后面增加下面内容:
rm transform
function rm() {
# garbage collect
now=$(date +%s)
for s in $(ls --indicator-style=none $HOME/.trash/) ;do
dir_name=${s//_/-}
dir_time=$(date +%s -d $dir_name)
# if big than one month then delete
if [[ 0 -eq dir_time || $(($now - $dir_time)) -gt 2592000 ]] ;then
echo "Trash " $dir_name " has Gone "
/bin/rm $s -rf
fi
done
# add new folder
prefix=$(date +%Y_%m_%d)
hour=$(date +%H)
mkdir -p $HOME/.trash/$prefix/$hour
if [[ -z $1 ]] ;then
echo 'Missing Args'
return
fi
echo "Hi, Trashing" $1 "to /root/.trash"
mv $1 $HOME/.trash/$prefix/$hour
}
- 刷新配置:`source ~/.zshrc`
- 然后断开终端,重新连接
- 此时如果你使用:`rm -rf a.txt` 会出现这样的提示:
Hi, Trashing -rf to /root/.trash mv: invalid option -- 'r' Try 'mv --help' for more information.
- 现在我们删除一个测试文件:`rm a.txt`,会事显示:`Hi, Trashing a.txt to /root/.trash`
- 因为我们上面的 shell 每次触发 rm 明白的时候都会去删除一个月前的目录,所以就不需要定时器来删除 .trash 里面的文件了。
- 如果你要强制删除,清空 .trash 目录,可以使用真正的 rm 命令:`/usr/bin/rm -rf ~/.trash/*`
## 资料
- <http://www.linuxde.net/2013/02/11915.html>
---
## Sed
# Sed 常用命令
- 轻量级流编辑器,一般用来处理文本类文件
- **sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上**
- **用 sed -i 会实际写入**,下面为了演示,都没加该参数,有需要可以自行添加。
## 基础例子
- 有一个文件:/opt/log4j2.properties
ini status = error
log action execution errors for easier debugging
logger.action.name = org.elasticsearch.action logger.action.level = debug
appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n
appender.rolling.type = RollingFile appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true
rootLogger.level = info rootLogger.appenderRef.console.ref = console rootLogger.appenderRef.rolling.ref = rolling
- `p` 参数表示打印,一般配合 -n(安静模式)进行使用
- `sed -n '7,10p' /opt/log4j2.properties`:显示第 7 ~ 10 行内容
- `sed -n '7p' /opt/log4j2.properties`:显示第 7 行内容
- `d` 删除
- `cat -n /opt/log4j2.properties |sed '7,10d'`:剔除 7 ~ 10 行内容,然后显示文件所有内容出来(实际文件是未删除的)
- `a` 追加
- `cat -n /opt/log4j2.properties |sed '1a GitNavi.com'`:追加 GitNavi.com 内容(追加在下一行展示),然后显示文件所有内容出来
- `c` 替换
- `cat -n /opt/log4j2.properties |sed '1,4c GitNavi.com'`:将 1 ~ 4 行内容替换成 GitNavi.com
- `s`: 搜索并替换
- `sed 's/time/timeing/g' /opt/log4j2.properties`:将文件中所有 time 替换成 timeing 并展示
- `sed 's/^#*//g' /opt/log4j2.properties`:将文件中每一行以 # 开头的都替换掉空字符并展示
- `sed 's/^#[ ]*//g' /opt/log4j2.properties`:将文件中每一行以 # 开头的,并且后面的一个空格,都替换掉空字符并展示
- `sed 's/^[ ]*//g' /opt/log4j2.properties`:将文件中每一行以空格开头,都替换掉空字符并展示
- `sed 's/^[0-9][0-9]*//g' /opt/log4j2.properties`:将文件中每一行以数字开头,都替换掉空字符并展示
- `sed '4,6s/^/#/g' /opt/log4j2.properties`:将文件中 4 ~ 6 行添加 # 开头
- `sed '4,6s/^#//g' /opt/log4j2.properties`:将文件中 4 ~ 6 行 # 开头去掉
## 实用例子
- `ifconfig eth0 |grep 'inet addr' |sed 's/^.*addr://g' |sed 's/Bcast.*$//g'`:CentOS 6 只显示 IP
- `ifconfig ens33 |grep 'inet' |sed 's/^.*inet//g' |sed 's/netmask.*$//g' |sed -n '1p'`:CentOS 7.3 只显示 IP。先用 grep 筛选中包含 inet 的数据。
- `s` 参数开头表示的是搜索替换,`/^.*inet` 表示从开头到 inet 之间,`//` 为空内容,`/g`,表示处理这一行所有匹配的内容。`/netmask.*$` 表示从 netmask 到这一行结束的内容
## 资料
- 《构建高可用 Linux服务器》
- <http://www.cnblogs.com/edwardlost/archive/2010/09/17/1829145.html>
---
## File Extract Compress
# Linux 下常用压缩文件的解压、压缩
## 常用压缩包--解压--令整理
- Linux 后缀为 `.war` 格式的文件(一般用在部署 Tomcat 项目的时候)
- 命令:`unzip -oq XXXXXX.war -d ROOT`
- 如果没有 ROOT 目录会自动创建 ROOT 目录。
- Linux 后缀为 `.tar.gz` 格式的文件-解压
- 命令:`tar zxvf XXXXXX.tar.gz`
- Linux 后缀为 `.bz2` 格式的文件-解压
- 命令:`bzip2 -d XXXXXX.bz2`
- Linux 后缀为 `.tar.bz2` 格式的文件-解压
- 命令:`tar jxvf XXXXXX.tar.bz2`
- Linux 后缀为 `.tar` 格式的文件-解压
- 命令:`tar zxvf XXXXXX.tar`
- Linux 后缀为 `.gz` 格式的文件-解压
- 命令:`gunzip XXXXXX.gz`
- Linux 后缀为 `.zip` 格式的文件-解压
- 命令:`unzip XXXXXX.zip`
- 命令:`unzip XXXXXX.zip -d /opt/`,解压到指定目录
- Linux 后缀为 `.7z` 格式的文件-解压
- 命令:`7za x XXXXXX.7z`
- Linux 后缀为 `.tar.xz` 格式的文件-解压,解压出来是tar,再对tar进行解压
- 命令:`tar xf XXXXXX.tar.xz`
-----------------------------------------------------------
## 常用文件进行--压缩--命令整理
- Linux 压缩文件夹为后缀 `.war` 格式的文件(最好不要对根目录进行压缩,不然会多出一级目录)
- 命令:`jar -cvfM0 cas.war /opt/cas/META-INF /opt/cas/WEB-INF /opt/cas/index.jsp`
- 或者命令:`cd 项目根目录 ; jar -cvfM0 cas.war ./*`
- Linux 压缩文件为后缀 `.tar` 格式的文件
- 命令:`tar -zcvf test11.tar test11`
- Linux 压缩文件为后缀 `.tar.gz` 格式的文件
- 命令:`tar -zcvf test11.tar.gz test11`
- Linux 压缩文件为后缀 `.bz2` 格式的文件
- 命令:`bzip2 -v test.txt`
- Linux 压缩文件为后缀 `.tar.bz2` 格式的文件
- 命令:`tar -jcvf test11.tar.gz test11`
- Linux 压缩文件为后缀 `.zip` 格式的文件
- 命令:`zip -r test1.zip /opt/test1/`
- Linux 压缩文件为后缀 `.7z` 格式的文件
- 命令:`7za a test1.7z /opt/test1/`
## 分卷压缩
- 分卷压缩:`zip -s 100M myFile.zip --out newFile.zip`
- 最终效果:
newFile.z01 newFile.z02 newFile.z03 newFile.z04 newFile.zip ```
特殊格式
- 7z
- 7z 的安装:
- 访问官网下载解压包:<http://sourceforge.net/projects/p7zip/files/p7zip/>
- 解压压缩包:`tar jxvf p7zip_15.14_src_all.tar.bz2`
- 进入目录:`cd p7zip_15.14`
- 执行安装:`sh install.sh`
- rar
- rar 的安装:
- 下载:`wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz`
- 解压下载下来的压缩包:`tar zxvf rarlinux-3.8.0.tar.gz`
- 进入解压后目录:`cd rar`
- 编译:`make`
- 安装:`make install`
- rar 解压:`rar x 文件名.rar`
jar 包操作
修改 jar 包配置文件
- 命令:
vim mytest.jar,这时候会展示 jar 中所有层级目录下的所有文件 - 输入:
/log4j2.xml回车,光标定位到该文件,然后再回车,进入编辑该文件状态 - 此时可以修改配置文件了,修改后
:wq保存退出,接着:q退出 jar 编辑状态
更新 Jar 包中的文件
- 替换(新增)jar 根目录下的文件:
jar uvf mytest.jar ClassToAdd.class - 一般 class 文件都是在多层目录里面的,需要这样做:
jar uvf mytest.jar com/youmeek/ClassToAdd.class
- 需要在 jar 所在的文件夹下创建:`mkdir -p ./com/youmeek`,该目录必须和原 jar 里面的层级目录结构一致
