linux下的find文件查找命令与grep文件内容查找命令

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。

区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。

(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。

一、find命令

基本格式:find  path expression

1. 按照文件名查找

(1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找

(2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf

(3) find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件

(4) find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

2. 按照文件特征查找

(1) find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)

(2) find / -atime -2   # 查找在系统中最后48小时访问的文件

(3) find / -empty   # 查找在系统中为空的文件或者文件夹

(4) find / -group cat   # 查找在系统中属于 group为cat的文件

(5) find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)

(6) find / -mtime -1   #查找在系统中最后24小时里修改过的文件

(7) find / -user fred   #查找在系统中属于fred这个用户的文件

(8) find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)

(9) find / -size -1000k   #查找出小于1000KB的文件

3. 使用混合查找方式查找文件

参数有: !,-and(-a),-or(-o)。

(1) find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件

(2) find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件

(3) find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件`

二、grep命令

基本格式:find  expression

1. 主要参数

[options]主要参数:

  • -c:只输出匹配行的计数。

  • -i:不区分大小写

  • -h:查询多文件时不显示文件名。

  • -l:查询多文件时只输出包含匹配字符的文件名。

  • -n:显示匹配行及行号。

  • -s:不显示不存在或无匹配文本的错误信息。

  • -v:显示不包含匹配文本的所有行。

pattern正则表达式主要参数:

  • : 忽略正则表达式中特殊字符的原有含义。

  • ^:匹配正则表达式的开始行。

  • $: 匹配正则表达式的结束行。

  • <:从匹配正则表达 式的行开始。

  • >:到匹配正则表达式的行结束。

  • [ ]:单个字符,如[A]即A符合要求 。

  • [ – ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

  • .:所有的单个字符。

  • * :有字符,长度可以为0。

2. 实例

(1) grep 'test' d*  #显示所有以d开头的文件中包含 test的行

(2) grep ‘test’ aa bb cc    #显示在aa,bb,cc文件中包含test的行

(3) grep ‘[a-z]{5}’ aa   #显示所有包含每行字符串至少有5个连续小写字符的字符串的行

(4) grep magic /usr/src  #显示/usr/src目录下的文件(不含子目录)包含magic的行

(5) grep -r magic /usr/src  #显示/usr/src目录下的文件(包含子目录)包含magic的行

(6) grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)

Linux下MySQL定时自动完整备份(mysqldump+crontab)

一、前言

1、本文目标

  • 实现数据库全量备份
  • 实现定时执行备份
  • 实现定时清理7天之前的备份

2、环境信息

未分类

二、备份

  • 目录准备
mkdir /mysql
mkdir /mysql/backup
mkdir /mysql/backup/scripts
mkdir /mysql/backup/files
mkdir /mysql/backup/logs
  • 备份脚本

新建脚本

vi /mysql/backup/scripts/backup_full.sh

脚本内容

#!/bin/bash

#备份目录
BACKUP_ROOT=/mysql/backup
BACKUP_FILEDIR=$BACKUP_ROOT/files
BACKUP_LOGDIR=$BACKUP_ROOT/logs

#当前日期
DATE=$(date +%Y%m%d)

######备份######

#查询所有数据库
#-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema")
#DATABASES=$(mysql -uroot -p123456 -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('sys','mysql','information_schema','performance_schema');" | grep -v "SCHEMA_NAME","ken.io") 
echo $DATABASES
#循环数据库进行备份
for db in $DATABASES
do
echo
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
mysqldump -uroot -pRoot@1024 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
echo
done

echo "done"

备份测试&验证

#执行备份脚本
sh /mysql/backup/scripts/backup_full.sh

#查看备份文件
ll /mysql/backup/files -h

#解压指定文件({file}自己替换成备份的文件)
gunzip /mysql/backup/files/{file}

三、定时任务

  • 安装crontab
yum install -y crontab

1、定时执行MySQL完整备份

  • 创建定时备份任务
#添加定时任务
crontab -e

#每天凌晨3点执行
00 3 * * * sh /mysql/backup/scripts/backup_full.sh

#查看定时任务
crontab -l

2、定时清理7天以前的备份

  • 创建文件清理脚本
#创建脚本文件
vi /mysql/backup/scripts/backup_full_clean.sh

#写入以下内容
#!/bin/bash
find /mysql/backup/files -mtime +7 -name "*.gz" -exec rm -rf {} ;

创建定时清理任务

#添加定时任务
crontab -e

#每天凌晨1点执行
00 1 * * * sh /mysql/backup/scripts/backup_full_clean.sh

#查看定时任务
crontab -l

四、备注

1、crontab命令示例

未分类

2、本文参考

  • https://blog.csdn.net/zmcyu/article/details/75353245
  • http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html

本文由 ken.io 创作,采用CC BY 3.0 CN协议 进行许可。 可自由转载、引用、甚至修改,但需署名作者且注明出处。

linux命令之htpasswd

htpasswd是Apache的Web服务器内置的工具,用于创建和更新储存用户名和用户基本认证的密码文件

安装

  1. 由于该工具是Apache的Web服务器内置的工具,所以直接安装Apache,在对应的bin目录下可以看到该命令的

  2. 还可以直接安装httpd-tools这个工具包,比如:yum install httpd-tools,安装成功后就可以直接使用该命令

语法

htpasswd (选项) (参数)

选项

  • -c: 创建一个新的密码文件
  • -b: 在命令行中一并输入用户名和密码而不是根据提示输入密码
  • -D: 删除指定的用户
  • -n: 不更新密码文件,只将加密后的用户名密码输出到屏幕上
  • -p: 不对密码进行加密,采用明文的方式
  • -m: 采用MD5算法对密码进行加密(默认的加密方式)
  • -d: 采用CRYPT算法对密码进行加密
  • -s: 采用SHA算法对密码进行加密
  • -B: 采用bcrypt算法对密码进行加密(非常安全)

参数

  • 用户名: 要创建或者更新的用户名
  • 密码: 用户的新密码

实例

1、 新建一个密码文件.passwd并添加一个用户,不提示直接输入用户名密码
htpasswd -bc .passwd jiang wen

2、 在原有的密码文件.passwd下在添加一个用户
htpasswd -b .passwd wen jiang

3、更新用户的密码:有两种方式
第一种,直接添加相同的用户名,就会自动区更新密码:htpasswd -b .passwd wen wen
第二种,先删除需要更新密码的用户名,在添加用户:htpassdw -D .passwd wen & htpasswd -b .passwd wen wen

4、不更新密码文件,只显示加密后的用户名和密码
htpasswd -bn jiang jiang

5、nginx模块 http_auth_basic_module中的使用,用于生成用户密码文件进行认证

不用装双系统,直接在 Windows 上体验 Linux:Windows Subsystem for Linux

「Microsoft Loves Linux!」

说出这句话的不是所谓的 IT 领域那些技术专家或者是意见领袖,而是时任微软 CEO 的萨蒂亚· 纳德拉,在 2015 年的一次活动中,这位第三任微软 CEO 脱口而出的这句话,让这个曾经开源界最大敌人的微软,正式拥抱这个开源世界最大的操作系统:Linux。

未分类

其实在云计算领域,微软很早之前就让其 Azure 支持多个流行的 Linux 发行版,但对于普通消费者而言,真正的变化发生在后面的 Windows 10:微软宣布将会在 Windows 10 内置 Linux,而采用的技术上并非是所谓的「虚拟化」技术——也就是说,这个子系统的 Linux 完全是原生运行在 Windows 10 上的。

未分类
WSL 技术实现原理
而微软给这个 Linux 系统命名为:Windows Subsystem for Linux,而对于有些系统极客而言,这个名字实在太熟悉了,因为在 Windows 7 之前,微软也曾经内置过一个 UNIX 子系统,可以原生运行 UNIX 二进制程序,他的名字叫做:Windows Services for UNIX。

即便如此,对于很多普通用户而言,Windows Subsystem for Linux 也只是尝鲜的玩物罢了,但对于不少软件开发、系统极客而言,无需通过虚拟机以及双系统的形式体验 Linux ,并且可以实现系统级别的文件互操作,实在是太具有吸引力了。而今天我们就一起来体验探索一番。

如何启动 Linux 子系统

微软从 Windows 10 周年更新(build 14393)开始内置 Windows Subsystem for Linux 组件框架,只不过这项功能当时还只能称作是 Beta 版,而在 Windows 秋季创意者更新中,安装 Linux 子系统变的更为简单——可以直接通过 Microsoft Store 来下载子系统,而可选择的发行版也从最初的只有 Ubuntu 变成可以选择 Suse、Ubuntu、Debian、甚至是用来进行网络安全工作 Kail Linux。

未分类
目前 Microsoft Store 有多款 Linux 发行版可供选择

只不过如果你想要体验这些发行版还需要进行一些简单操作,毕竟 Windows Subsystem for Linux 组件框架并非是默认选中的。

首先我们需要确认自己的 Windows 10 版本,以下的操作方法只适用与 Windows 10 秋季创意者更新(Windows 10 build 16299)以上版本,如果你是 Windows 10 周年更新,安装 Linux 子系统的安装办法你可以检索「 Bash on Windows」自行探索安装方法。此外,系统必须是 64 位操作系统。

未分类
开启「适用于 Linux 的 Windows 子系统」

以上均确认后,打开 「控制面板」—> 「程序和功能」,在左边的「启用和关闭 Windows 功能」里面勾选「适用于 Linux 的 Windows 子系统」,然后点击确定(这一步有可能需要重启)。

未分类

接着打开 Microsoft Store,搜索喜欢的 Linux 发行版,这里我选择的是我比较熟悉的 Linux 发行版 Ubuntu,然后点击安装。对于初学者来说,Ubuntu/ Debian 系的发行版具有非常完善的包管理系统,方便新手快速上手。

未分类

安装完毕之后,你就可以在 Windows 开始菜单中找到「Ubuntu」这个应用了!换言之,现在你的 Windows 10 中就已经成功安装发行版为 Ubuntu 的 Linux 子系统。

Ubuntu 子系统设置与基本命令

在开始菜单中打开 Ubuntu 后,Ubuntu 会进行较长时间的安装和初始化,之后会提示你设置 Linux 的用户名和密码,需要注意的是这个用户名和密码和 Windows 并不通用。

未分类

设置密码是非明文的,不会像 Windows 那样使用「*** 」替代,所以你只要盲打点击确认即可,建议密码使用复杂密码,有些发行版会有强制要求。

输入完成之后,系统会提示你如何提权操作,之后会自动以刚才新设置的用户名登录 Ubuntu。

我安装 Linux 第一件事就是查看内核版本以及系统系统版本,在 Ubuntu 下直接输入以下命令来查看内核版本号:

uname -r

这时系统会显示:4.4.0-43-Microsoft,这表示Linux 内核版本为:4.4.0-43。

至于系统版本号,可以使用:sudo lsb_release -a 来查看,系统会输出:

未分类

这表示 Ubuntu 版本为 16.04。为 Ubuntu 的长期支持版本。

更换 Linux 子系统的软件源并更新软件

之前我说过使用 Ubuntu /debian 系最大的好处就是可以使用「软件源」进行软件安装,使用 Ubuntu 自带的 deb 包管理系统安装软件可以减少直接下载源码编译的麻烦,所以这里就要用到「apt-get」系列命令了。

因为默认的软件源是 Ubuntu 的官方源,我们可以选择替换为国内的软件源,比如说阿里云镜像的软件源。

在当前命令行下面输入:

sudo-i

提权后输入密码,使用 root 权限登录。然后接下来备份当前源,输入以下命令:

cp /etc/apt/sources.list /etc/apt/sources.list.old

不难看出管理源的文件就是 sources.list,我们选择编辑它,编辑器我这里选用的是 vim,所以命令是:

vim /etc/apt/sources.list

使用 vim 后会进入命令模式,敲键盘上的 「i」键键入编辑模式,然后复制下面这段代码(拷贝代码,然后在编辑器上鼠标右击就可以复制):

  # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
  deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
  deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
  deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
  deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
  deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
  deb http://mirrors.aliyun.com/ubuntu/ xenial universe
  deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
  deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
  deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
  deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
  deb http://archive.canonical.com/ubuntu xenial partner
  deb-src http://archive.canonical.com/ubuntu xenial partner
  deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
  deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
  deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
  deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

完成之后再敲键盘上的「esc」退出编辑模式,然后再输入:wq点击保存并退出编辑器 vim。

未分类
编辑软件源

紧接着我们更新软件源让编辑的文件生效:

apt-get update

这里我们就将 Ubuntu 的软件源切换到阿里云的源了。

之后再输入:apt-get upgrade 对当前系统的软件和类库进行来更新。如果不出意外系统会自动对现有的软件包进行更新,经过这一系列的操作,目前 Ubuntu 的软件以及类库都是最新的,而系统版本也升级到 Ubuntu 16.04.4 LTS。

启用 SSH 并使用SSH 客户端登录

虽说通过 App 或者应用的形式在 Windows 10 上体验 Linux 是一个不赖的选择,但对于很多软件开发的朋友而言,使用 Windows 内置的 CMD 或者 PowerShell 来操作Linux 依旧有着很多不习惯。而最为关键的是当需要对文件进行操作时,使用交互命令远不如使用 SFTP 来的更为「简单粗暴」。因此只要通过配置 SSH 远程登录,就可以像管理远程服务器那样来操作这个 Linux 系统了。

首先,因为 Ubuntu 系统限制,所以我们需要可以为 root 用户设置新密码,这里输入:

sudo passwd root

配置好之后,未来使用 SSH 客户端或者 SFTP 客户端登录系统时,我们就可以直接使用 root 权限进行登录,就不用使用之前的 sudo -i 提权操作了。

其次按照常规,我们使用cp 命令将 SSH 相关配置文件进行备份:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

之后使用 vim 编辑器编辑 「sshd_config」文件:

sudo vim /etc/ssh/sshd_config

键盘上点击 「i」后进入编辑模式,编辑并调整以下设置项:

 Port 8022(因为 Windows 10 的 SSH 端口已经默认被占用,所以我换成了一个新的端口)
  (去掉前面的 #)ListenAddress 0.0.0.0
  UsePrivilegeSeparation no(原来是 yes 改成 no)
  PermitRootLogin yes(修改成 yes)
  (在前面加上 #)StrictModes yes
  PasswordAuthentication yes(原来是 no,改成 yes)

之后点击 「Esc」退出编辑模式,直接输入 :wq 退出并保存。

未分类
编辑配置文件并启动 SSH

然后输入命令:service ssh start 启动 SSH。

如何验证已经可以访问呢?我们首先打开 SSH 客户端,比如我目前使用 Xshell,选择「新建会话」。

之后在新建的会话设置框的「连接」中添加如下内容:

  名称:WSL(这个随便填)
  协议:SSH
  主机:127.0.0.1(本机环回接口)
  端口号:8022

之后在「用户身份验证」中输入验证方法,方法选择 「Password」,然后在输入用户名:root,密码选择刚才新设置的 root 密码,最后点击确定。

未分类

然后在左侧的会话管理器找到刚才设置的新会话,双击后如果显示如下图所示的界面就算是成功了!

未分类

除了使用 Xshell 这种 SSH 客户端进行服务器操作之外,还可以使用 Xftp 进行文件上传和管理,唯一的区别是在新建会话处,协议选择「SFTP」,端口号和之前 Xshell 使用的端口号一致即可,点击确认之后出现类似 FTP 管理的界面就算是成功了!这样你就可以使用更为直观的工具来访问 WSL 系统的文件目录。新建文件上传文件也变得更为简单。

未分类

开启图形化界面

比起 Windows和 macOS,Linux 很多时候给普通用户都是冰冷的命令行形象,这让很多 Linux 初学者望而却步;但实际上 Linux 是可以使用我们所说的 GUI 图形化界面的,只不过图形化界面并没有默认安装,这里我尝试手动安装一个图形化桌面。

未分类

由于属于 Linux 子系统的限制,因此安装一些比较「重」的图形化界面组件会大量消耗系统资源,因此我选择较为轻量级的图形化桌面组件:MATE,也是 Ubuntu MATE 的默认桌面组件,当然另一个轻量级桌面 xfce 体验也不错。

首先在终端中输入以下命令安装 Mate 桌面:

sudo apt-get install mate-desktop-environment

这一步命令就是安装完整的 MATE 桌面,这个过程相当长,因为 WSL 默认没有桌面环境,对应的相关组件也没有安装,所以安装桌面会将相关的组件以及依赖都一并安装。

未分类
安装图形化界面以及 VNC 服务端

紧接着我们需要安装可以访问图形化界面的软件,这里使用图形化远程访问工具:VNC;你可以理解成 Windows 电脑中的远程访问。当然 VNC 服务端 WSL 也是不会默认安装的,所以需要输入以下命令安装:

sudo apt-get install vnc4server

安装完毕之后需要修改 VNC 的默认启动桌面,这时候输入:

sed -i 's$x-window-manager$mate-session$' ~/.vnc/xstartup

将默认启动桌面改成 Mate 桌面启动,然后输入:vncserver 启动服务端(第一次启动需要设置连接密码)。这里 WSL 端就基本设置完毕了。

之后我们需要在 PC 上安装 VNC 的客户端,我这里选择的是 Realvnc,然后直接选择 Chrome 应用版本,在 Chrome 商店中添加为 Chrome 独立应用。

未分类

打开 realvnc 并在地址栏中输入:127.0.0.1:1 ,点连接并输入连接密码,如果不出意外,你就可以看到安装有 mate 桌面的 Ubuntu 界面了!

未分类

可视化桌面的终端里面,你可以输入 sudo apt-get install firefox 来安装 Firefox 浏览器,不一会儿你可以在左上角菜单栏的「Applications」中的「Internet」中找到 Firefox 浏览器啦!好了,接下来还能做什么就自己去探索吧!

未分类
图形化的 Linux 界面

一起动手做:搭建本地静态网站

经过以上的折腾,其实你应该对 WSL 有了比较清楚的认识了,其实对于很多开发者而言,WSL 最大的好处在于更接近项目生产环境,虽说 Windows 本身有 IIS 网页服务器可供选择。但目前大部分网站服务器系统都采用的是 Linux,而网页服务器也多是使用 Apache,所以在 WSL 在本机完成部署调试后可能会接近实际一些。所以这里我们做一个小实践:将开发好的一个静态网站部署到 WSL 里面并可以直接访问。

首先,我们要确保 WSL 中安装有 Apache 网页服务器,所以尝试安装(使用超级用户权限),在终端中输入:

apt-get install apache2

未分类

安装完毕之后在终端中输入以下命令开启 Apache 网页服务器:

service apache2 start

当终端里面显示诸如「 * Starting Apache httpd web server apache2」之后,打开本机的网页浏览器,访问:http://127.0.0.1 ,当显示以下页面就表示 Apache 网页服务器已经生效!

未分类

接下来我们尝试将自己开发的静态网页项目传到对应的目录中,这里我们打开 Xftp 这个远程文件工具,连接到 WSL 这个站点,然后访问 /var/www/html 这个目录,然后将项目文件夹传到该目录下方。

未分类

例如我现在传过去的网页全景项目名为「xuyi」,那么传好后我打开浏览器,访问:http://127.0.0.1/xuyi 就可以看到做好的网页的效果啦!如果你是使用 chrome 访问的话,Wappalyzer 扩展还可以显示出当前网站项目使用的框架等。

未分类

结语

至此,我们已经较为完整的体验了 Windows Subsystem for Linux 的一些基础玩法,其实在我看来,Windows 10 下的 Linux 子系统更多的是补充原本 Windows 10 在开发领域上的一些不足,让软件开发/网络开发人员可以以较低的成本来实现与生成环境的一致性,也不用再为了开发而安装双系统甚至虚拟机了。当然在本次体验中我并没有更深入的探索,比如说在 WSL 中安装 PHP 环境以及 Mysql 数据库,所以如果你对 Linux 感兴趣,想要在 Windows 10 上探索 Linux,系统原生支持的 WSL 不妨一试。

linux分割文件split命令

分割文件split

  档处理文件时,有时需要将文件做分隔处理,split命令用于分割文件,可以分割文本文件,按指定的行数分隔,每个分隔的文件都包含相同的行数。split可以分隔非文本文件,分割时可以指定每个文件的大小,分隔后的文件有相同的大小。split后的文件可以使用cat命令组装在一起。

      [root@CentOS cmd]# cat src.txt

      [root@CentOS cmd]# split src.txt

      [root@CentOS cmd]# ls

      #split默认按1000行分隔文件

      [root@CentOS cmd]# ls

      [root@CentOS cmd]# wc -l *

      [root@CentOS cmd]# ls -lhtr

      #按每个文件3行分隔文件

      [root@CentOS cmd]# split -l 3 src.txt

      [root@CentOS cmd]# ls

      [root@CentOS cmd]# cat xa*

      #中间结果省略

      [root@CentOS cmd]# cat xaa

      #如文件行数太多,使用默认的2个字符已经不能满足需求

      [root@CentOS cmd]# split -l 3 src.txt

      [root@CentOS cmd]# rm -f xa*

      [root@CentOS cmd]# ls

      #指定分隔前缀的长度

      [root@CentOS cmd]# split -a 5 -l 3 src.txt

      [root@CentOS cmd]# ls

      [root@CentOS cmd]# rm -f xaaaa*

      #使用数字前缀

      [root@CentOS cmd]# split -a 5 -l 3 -d src.txt

      #指定每个文件的大小,默认为字节,可以使用1m类似的参数默认为B,另外有单位b,k,m等

      SIZE可加入单位:b代表512,k代表1k,m代表1Meg

      [root@CentOS cmd]# split -a 5 -b 3 src.txt

      [root@CentOS cmd]# ls -l xaaaaa

      [root@CentOS cmd]# src.txt xaa xaaaaa xaaaab xaaaac xaaaae xaaaaf xaaaag

      [root@CentOS cmd]# cat xa* >dst.txt

      [root@CentOS cmd]# md5sum src.txt dst.txt

      #指定分隔前缀

      [root@CentOS cmd]# split -a 5 -b 3000 src.txt src_

      [root@CentOS cmd]# ls

当把一个大的文件分拆为多个小文件后,如何校验文件的完整性呢,一般通过MD5工具来校验对比。对应的Linux命令为md5sum。

提示:有关md5的校验机制和原理请参考相关文档,本节不再描述。

Linux中crontab定时任务不执行

最近在linux中遇到了个crontab定时任务不执行的case,在这给大家分享一下,避免踩到我遇到的坑。

先贴脚本吧

为了方便展示,把脚本入参,都写死了

#!/usr/bin/env bash
# 1输出文件,到log 例如: bg 
# 2 目标文件目录  不带最后的/ 例如:/opt/flume/home/hdp_lbg_ectech/rawdata/xxx/web_vip_bg
# 3 执行的时候选择前几天的日志  例如:1

LAST_DAY=$(date +"%Y-%m-%d" -d "1 days ago")
LAST_HOUR_DAY=$(date +"%Y%m%d" -d "1 days ago")
#执行jar获取bg日志
 java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar  /opt/script/xxx/vipbg/bg.log

#具体到文件名
SRC_FILE=/opt/script/xxx/vipbg/bg.log

#指定目标目录,按日期创建目录
DEST_DIR_NAME=/opt/flume/home/hdp_lbg_ectech/rawdata/xxx/web_vip_bg/$LAST_HOUR_DAY
DEST_FILE_NAME=$(basename $SRC_FILE)
#FLUME会忽略隐藏文件,所以可直接拷贝过去
TMP_FILE=$DEST_DIR_NAME/.$DEST_FILE_NAME
DEST_FILE=$DEST_DIR_NAME/$DEST_FILE_NAME.$SRC_IP
#判断源文件是否非空,空文件Flume会直接删除的,且目标文件不存在,避免重复拷贝数据
if [ -s "$SRC_FILE" ] && [ ! -f "$DEST_FILE" ];then
    #使Flume具有删除该目录下文件的权限,不然FLUME收集不上去
    mkdir -p $DEST_DIR_NAME && chmod 777 $DEST_DIR_NAME
    #必须先cp到一个临时文件再mv过去,直接cp过去会造成数据丢失
    cp $SRC_FILE $TMP_FILE && mv $TMP_FILE $DEST_FILE
fi
#删除tmp中转文件
rm -rf  /opt/script/xxx/vipbg/bg.log
echo "删除源文件成功"

有些目录用了xxx代表
这个脚本单独考出来可以执行,放到crontab里面就不执行了, 百度了下,大多都说需要使用绝对路径,看了下我们的脚本,就是下面这句有问题:

java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar  /opt/script/xxx/vipbg/bg.log

初步判断是java这需要使用jdk的目录路径,做了两个实验测试了下。

crontab中加上一个 java -jar xxxx.jar的定时任务

代码如下:

10 16 * * *  java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar  /opt/script/xxx/vipbg/bg.log

果然,这个没有执行

crontab中加上一个 jdk目录/bin/java -jar xxxx.jar的定时任务

代码如下:

20 16 * * *  /opt/soft/jdk/jdk1.6.0_45/bin/java -jar /opt/script/xxx/vipbg/vip-bg-job-1.0-SNAPSHOT-shaded.jar  /opt/script/xxx/vipbg/bg.log

这次执行了,没有执行的原因就是执行jar的时候,需要加上jdk的路径

你们是否也遇到了类似的问题,欢迎大家来交流,指出文中一些说错的地方,让我加深认识,分享自己遇到的坑,让大家一起没有bug,谢谢大家!

Linux Centos下Nginx反向代理教程

主机要求:Centos系统,内存64MB及以上、80端口没有被占用

1、升级系统、卸载Apache释放80端口

Yum update -y
Yum remove httpd -y

2、安装EPEL repo

rpm -Uvh http://mirror.ancl.hawaii.edu/linux/epel/6/i386/epel-release-6-8.noarch.rpm

EPEL repo下载地址:https://fedoraproject.org/wiki/EPEL

3、安装Nginx,并设置

安装Nginx

yum install nginx -y

调整Nginx配置

cd /etc/nginx/conf.d
mv default.conf default.conf.disabled

4、创建Nginx反代配置文件

cd /etc/nginx/conf.d
vi yourdomain.com                 

粘贴以下内容:

server {
      listen 80;
      server_name yourdomain.com;   
      access_log off;
      error_log off;
      location / {
      proxy_pass http://需要反代的服务器IP/;
      proxy_redirect off;
      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_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_read_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
   }
} 

然后保存。

5、设置防火墙,允许80端口访问

iptables -I INPUT 5 -m state --state NEW -p tcp --dport 80 -j ACCEPT 
service iptables save 
service iptables restart

6、启动Nginx

service nginx start

如何在Linux中轻松修正拼写错误的Bash命令?

未分类

我知道你可以按下向上箭头来调出你运行过的命令,然后使用左/右键移动到拼写错误的单词,并更正拼写错误的单词,最后按回车键再次运行它,对吗?可是等等。还有一种更简单的方法可以纠正 GNU/Linux 中拼写错误的 Bash 命令。这个教程解释了如何做到这一点。请继续阅读。

在 Linux 中纠正拼写错误的 Bash 命令

你有没有运行过类似于下面的错误输入命令?

$ unme -r
bash: unme: command not found

你注意到了吗?上面的命令中有一个错误。我在 uname 命令缺少了字母 a。

我在很多时候犯过这种愚蠢的错误。在我知道这个技巧之前,我习惯按下向上箭头来调出命令,并转到命令中拼写错误的单词,纠正拼写错误,然后按回车键再次运行该命令。但相信我。下面的技巧非常易于纠正你刚刚运行的命令中的任何拼写错误。

要轻松更正上述拼写错误的命令,只需运行:

$ ^nm^nam^

这会将 uname 命令中将 nm 替换为 nam。很酷,是吗?它不仅纠正错别字,而且还能运行命令。查看下面的截图。

未分类

当你在命令中输入错字时使用这个技巧。请注意,它仅适用于 Bash shell。

额外提示:

你有没有想过在使用 cd 命令时如何自动纠正拼写错误?没有么?没关系!下面的技巧将解释如何做到这一点。

这个技巧只能纠正使用 cd 命令时的拼写错误。

比如说,你想使用命令切换到 Downloads 目录:

$ cd Donloads
bash: cd: Donloads: No such file or directory

哎呀!没有名称为 Donloads 的文件或目录。是的,正确的名称是 Downloads。上面的命令中缺少 w。
要解决此问题并在使用 cd 命令时自动更正错误,请编辑你的 .bashrc 文件:

$ vi ~/.bashrc

最后添加以下行。

[...]
shopt -s cdspell

输入 :wq 保存并退出文件。

最后,运行以下命令更新更改。

$ source ~/.bashrc

现在,如果在使用 cd 命令时路径中存在任何拼写错误,它将自动更正并进入正确的目录。

未分类

正如你在上面的命令中看到的那样,我故意输错(Donloads 而不是 Downloads),但 Bash 自动检测到正确的目录名并 cd 进入它。

Fish 和 Zsh shell 内置的此功能。所以,如果你使用的是它们,那么你不需要这个技巧。

然而,这个技巧有一些局限性。它只适用于使用正确的大小写。在上面的例子中,如果你输入的是 cd donloads 而不是 cd Donloads,它将无法识别正确的路径。另外,如果路径中缺少多个字母,它也不起作用。

Linux命令之sed批量替换字符串操作

使用sed命令可以进行字符串的批量替换操作,以节省大量的时间及人力;

使用的格式如下:

sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`

其中,oldstring是待被替换的字符串,newstring是待替换oldstring的新字符串,grep操作主要是按照所给的路径查找oldstring,path是所替换文件的路径;

-i 选项是直接在文件中替换,不在终端输出;

-r 选项是所给的path中的目录递归查找;

-l 选项是输出所有匹配到oldstring的文件;

实例:

1、替换指定文件的字符串

sed -i "s/oldstring/newstring/g" filename

sed -i "s/6/sk/g" ./test01.txt

2、字符串替换批量文件操作

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test`

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test/*.sh`

可将test目录下的所有相关文件都进行字符串替换

参考:

http://blog.163.com/daniel_ao/blog/static/1100988432010722642551/

http://www.jb51.net/LINUXjishu/155122.html

sed -i "" "s/搜索的字符串/替换的字符串/g" grep搜索的字符串 -rl 所在目录

由于mac需要标准输入 所以 -i 后面加上""

linux中NFS服务安全加固实例

概述

NFS 的不安全性,主要体现于以下 4 个方面:

  • 缺少访问控制机制
  • 没有真正的用户验证机制,只针对 RPC/Mount 请求进行过程验证
  • 较早版本的 NFS 可以使未授权用户获得有效的文件句柄
  • 在 RPC 远程调用中, SUID 程序具有超级用户权限

加固方案

为有效应对以上安全隐患,推荐您使用下述加固方案。

配置共享目录(/etc/exports)
使用 anonuid,anongid 配置共享目录,这样可以使挂载到 NFS 服务器的客户机仅具有最小权限。不要使用 no_root_squash。

使用网络访问控制
使用 安全组策略 或 iptable 防火墙限制能够连接到 NFS 服务器的机器范围。

iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

账号验证

使用 Kerberos V5 作为登录验证系统,要求所有访问人员使用账号登录,提高安全性。

设置 NFSD 的 COPY 数目
在 Linux 中,NFSD 的 COPY 数目定义在启动文件 /etc/rc.d/init.d/nfs 中,默认值为 8。

最佳的 COPY 数目一般取决于可能的客户机数目。您可以通过测试来找到 COPY 数目的近似最佳值,并手动设置该参数。

选择传输协议
对于不同的网络情况,有针对地选择 UDP 或 TCP 传输协议。传输协议可以自动选择,也可以手动设置。

mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR

UDP 协议传输速度快,非连接传输时便捷,但其传输稳定性不如 TCP,当网络不稳定或者黑客入侵时很容易使 NFS 性能大幅降低,甚至导致网络瘫痪。一般情况下,使用 TCP 的 NFS 比较稳定,使用 UDP 的 NFS 速度较快。

在机器较少,网络状况较好的情况下,使用 UDP 协议能带来较好的性能。

当机器较多,网络情况复杂时,推荐使用 TCP 协议(V2 只支持 UDP 协议)。

在局域网中使用 UDP 协议较好,因为局域网有比较稳定的网络保证,使用 UDP 可以带来更好的性能。

在广域网中推荐使用 TCP 协议,TCP 协议能让 NFS 在复杂的网络环境中保持最好的传输稳定性。

限制客户机数量
修改 /etc/hosts.allow 和 /etc /hosts.deny 来限制客户机数量。

/etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow

/etc/hosts.deny

portmap: ALL : deny

改变默认的 NFS 端口
NFS 默认使用的是 111 端口,使用 port 参数可以改变这个端口值。改变默认端口值能够在一定程度上增强安全性。

配置 nosuid 和 noexec
SUID (Set User ID) 或 SGID (Set Group ID) 程序可以让普通用户以超过自己权限来执行。很多 SUID/SGID 可执行程序是必须的,但也可能被一些恶意的本地用户利用,获取本不应有的权限。

尽量减少所有者是 root,或是在 root 组中却拥有 SUID/SGID 属性的文件。您可以删除这样的文件或更改其属性,如:
使用 nosuid 选项禁止 set-UID 程序在 NFS 服务器上运行,可以在 /etc/exports 加入一行:

/www www.abc.com(rw, root_squash, nosuid)

使用 noexec 禁止直接执行其中的二进制文件。