2017年11月

一、编译安装

Redis官网地址:redis官网,官网可能会打不开,可以在github的发布页中下载:Release-redis

当前最新版6.0-rc1,下载redis:

https://github.com/antirez/redis/archive/6.0-rc1.tar.gz
编译redis6.0需要GCC5以上版本,低版本会报错,如果GCC版本低于5,只能使用redis5.x版本。

解压源码文件编译:

tar -zxvf 6.0-rc1.tar.gz && mv 6.0-rc1 redis-6.0-rc1
cd redis-6.0-rc1
make MALLOC=libc

注意make的时候要添加MALLOC=libc参数,否则可能出现以下报错:

zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
                               ^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/redis-5.0.5/src'
make: *** [all] Error 2

这个参数的用处是指定redis使用的malloc函数为libc中的,默认情况下redis使用的是jmalloc,大部分系统默认没有安装,会报错。

编译完成后,安装redis到/usr/local/redis-6.0-rc1

sudo make PREFIX=/usr/local/redis-6.0-rc1 install

给安装目录创建软链接并添加到PATH路径下:

sudo ln -s /usr/local/redis-6.0-rc1/ /usr/local/redis
# 添加路径到PATH环境变量中
REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin

执行完成后,直接运行redis-server 就能启动redis了,可以加上--port 参数指定运行端口。

二、服务配置

默认的配置文件在安装目录下:redis.conf ,复制到/etc/redis/ 目录下:

mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf
6379是redis的默认监听端口,根据不同端口来命名配置文件可以使主机同时运行多个redis实例,方便管理。

配置文件中的一些参数说明:

port 6379  # 默认的端口
dir ./  # 持久化文件存放路径
daemonize  no  # 是否以守护进程启动
pidfile /var/run/redis_6379.pid # pid文件路径
logfile ""  # 日志文件路径

添加redis用户:

useradd -M -s /sbin/nologin redis

设置目录权限:

chown redis.redis -R /usr/local/redis

三、添加服务

3.1 services服务

安装目录下的utils 默认有一个redis_init_script 脚本,复制到/etc/ini.d 目录下:

cp utils/redis_init_script /etc/init.d/redis_6379  # 6379是redis监听的端口号

里面需要修改的内容:

REDISPORT=6379  # 默认监听端口6379
EXEC=/usr/local/redis/bin/redis-server  # 服务端程序路径
CLIEXEC=/usr/local/redis/bin/redis-cli  # 客户端程序路径
PIDFILE=/var/run/redis_${REDISPORT}.pid  # pid文件路径
CONF="/etc/redis/${REDISPORT}.conf"  # 配置文件路径

启动和关闭redis:

/etc/init.d/redis_6379 start  # 启动
/etc/init.d/redis_6379 stop  # 关闭

3.2 systemd服务

使用systemd服务时,注意redis不能以守护进程启动:

daemonize no

复制以下内容到/etc/systemd/system/redis_6379.service

[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/redis-server /etc/redis/redis_6379.conf         
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

然后执行systemctl start redis_6379即可启动服务。

3.2 luanchd服务

luanchd服务是mac系统下的后台管理程序,把以下配置保存到文件homebrew.mxcl.redis.plist,然后放到~/Library/LaunchAgents/路径下(注意修改程序和日志文件路径):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <dict>
      <key>SuccessfulExit</key>
      <false/>
    </dict>
    <key>Label</key>
    <string>homebrew.mxcl.redis</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/redis/bin/redis-server</string>
      <string>/etc/redis/redis.conf</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>WorkingDirectory</key>
    <string>/usr/local/redis</string>
    <key>StandardErrorPath</key>
    <string>/appdata/redis/redis.log</string>
    <key>StandardOutPath</key>
    <string>/appdata/redis/redis.log</string>
  </dict>
</plist>

编辑完成后,载入redis服务:

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

启动和关闭redis:

launchctl start ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl stop ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

上面的配置中没有设置开机自启,如果希望开机自启,要把18行的<false/>改成<true>

四、其他

4.1 低版本GCC编译redis-6.x报错问题

使用GCC4编译redis-6.0,会报错:

cd src && make all
make[1]: 进入目录“/data/software/redis-6.0-rc1/src”
    CC server.o
In file included from server.c:30:0:
server.h:1022:5: 错误:expected specifier-qualifier-list before ‘_Atomic’
     _Atomic unsigned int lruclock; /* Clock for LRU eviction */
     ^
server.c: 在函数‘serverLogRaw’中:
server.c:1020:31: 错误:‘struct redisServer’没有名为‘logfile’的成员
     int log_to_stdout = server.logfile[0] == '\0';

问题原因:

In old gcc version like 4.7/8, there is a bug that miss the macro like [STDC_NO_ATOMICS]

低版本的GCC例如4.7和4.8,有一个缺少类似[STDC_NO_ATOMICS]宏定义的BUG。

可参考fix: old gcc without atomic support compile failed

解决方案是升级GCC5或以上

一、概述

几乎所有的数据包都是通过以太网来传输,所以使用wireshark抓取以太网数据包非常容易,这里我们以DNS数据包为例。

二、抓包

1. 准备数据

打开wireshark,在筛选栏输入dns,点击开始抓包,然后打开命令提示符,输入ping www.baidu.com ,此时wireshark将会抓到以下数据:

- 阅读剩余部分 -

一、概述

xmlrpc.php  是wordpress默认就有的一个离线发布模块,我们可以使用诸如windows live writer  之类的软件进行离线发布,在发布的过程中会验证wordpress帐号的密码,不管帐号密码正确失败,都会给予相应的回复。对于攻击者来说,这就是一个漏洞,因为他们知道每一次尝试登陆的结果,于是就可以无限制利用这个文件进行暴力密码破解,直到得到一次正确的返回——即尝试到了一个正确的账户密码。

- 阅读剩余部分 -

# 未定义的参数标记
Hello
World


要注意的一些点是:

- 短标记和长标记后可以跟空格和等号再接参数,短标记也可以省略这两个符号直接加参数
- 不管长标记短标记后面都不能跟多个值

![](https://i.maqian.xin/2017/11/args.png)

年纪越来越大,记忆越来越差,笔记这个东西也是越来越有用了。最开始的时候都是用手机的便签本记笔记,由于一次刷机导致便签app没有了,也是搞笑。

后来自己搭了一个云笔记服务,用了一段时间之后由于服务器总是被攻击,为了安全起见还是放弃了使用,转投有道云。有道云好用是好用,就是广告太多了,这对于一个强迫症患者来说简直就是噩梦,也算是突发奇想百度了一下去广告,没想到还真有。

- 阅读剩余部分 -

一、概述

su 命令用来用来切换用户身份,例如:su root 切换到root 用户,su www 切换到www 用户。

su - 命令同样也是用来切换用户身份的,和su 命令不同的是,su - 在切换用户的同时也会切换shell ,这样就导致了用户的环境变量也会变化。

- 阅读剩余部分 -