Shell处理json数据

Shell处理json数据的方法,简单介绍一下,本文基于CentOS 6 64bit。

yum install jq    #需要EPEL源

下面我们有一个config.json文件

{
  "USERNAME": "admin",
  "CLUSTERMAP_HOSTS": {
      "staging":{
          "pc": "10.191.130.70",
          "app": "10.191.76.250",
          "wx": "172.28.172.171"
      },
      "production":{
          "mjq_pc":"172.28.139.30",
          "mjq_app":"172.28.148.150",
          "mjq_weixin":"172.28.149.84",
          "mjq_qq":"172.28.149.77",
          "lf_pc":"172.20.145.51",
          "lf_app":"172.20.145.40",
          "lf_weixin":"172.20.145.86",
          "lf_qq":"172.20.112.150",
          "jos":"172.20.145.50",
          "lf_coupon":"172.20.112.44",
          "mjq_coupon":"172.28.139.48"
      },
      "ab":{
          "mjq_pc":"172.28.175.36",
          "lf_app":"172.20.121.107"
      }
  },
  "CLUSTERMAP_BINARY_PATH": "/export/App/jd_search/clustermap/bin"
}

获得分片

$ cat config.json | jq '.CLUSTERMAP_HOSTS.production'
[
  {
    "lf_app": "172.20.121.107",
    "mjq_pc": "172.28.175.36"
  },
  {
    "mjq_coupon": "172.28.139.48",
    "lf_coupon": "172.20.112.44",
    "jos": "172.20.145.50",
    "mjq_pc": "172.28.139.30",
    "mjq_app": "172.28.148.150",
    "mjq_weixin": "172.28.149.84",
    "mjq_qq": "172.28.149.77",
    "lf_pc": "172.20.145.51",
    "lf_app": "172.20.145.40",
    "lf_weixin": "172.20.145.86",
    "lf_qq": "172.20.112.150"
  },
  {
    "wx": "172.28.172.171",
    "app": "10.191.76.250",
    "pc": "10.191.130.70"
  }
]

获得Key列表 继续阅读

解决swapper: page allocation failure. order:4, mode:0x20

一般在小内存的机器上会遇到这样的问题,这里附上解决办法

先看一下系统设置

$ cat /proc/sys/vm/zone_reclaim_mode
0

$ cat /proc/sys/vm/min_free_kbytes
1433

解决办法:

$ sysctl -w vm.zone_reclaim_mode=1
#当区域内存不足时允许使用内存回收,此项默认被禁用,因为对服务器来说,Cache非常重要

$ sysctl -w vm.min_free_kbytes=2048
#告诉内核随时保持2M的内存空闲
#当可用内存低于这个参数时, 系统开始回收Cache内存, 以释放内存, 直到可用内存大于这个值
#值越高, 内核越早开始回收内存, 空闲内存越高
#设定这个参数时请小心, 因为该值过低和过高都有问题
#太低可防止系统重新利用内存, 这可导致系统挂起并让 OOM 杀死多个进程
#将这个参数值设定太高(占系统总内存的 5-10%)会让您的系统很快会内存不足
#Linux 的设计是使用所有可用 RAM 缓存文件系统Cache. 该值设定太高的结果是在该系统中花费太多时间重新利用内存
#默认值:
 * 16MB:    512k 
 * 32MB:    724k 
 * 64MB:    1024k 
 * 128MB:   1448k 
 * 256MB:   2048k 
 * 512MB:   2896k 
 * 1024MB:  4096k 
 * 2048MB:  5792k 
 * 4096MB:  8192k 
 * 8192MB:  11584k 
 * 16384MB: 16384k 

$ echo 'vm.zone_reclaim_mode = 1' >> /etc/sysctl.conf
$ echo 'vm.min_free_kbytes = 2048' >> /etc/sysctl.conf

然后可以确认一下

cat /proc/sys/vm/zone_reclaim_mode
1
cat /proc/sys/vm/min_free_kbytes
2048

参考文档
内核参数Zone_reclaim_mode介绍
内存域水印值:min_free_kbytes

使用命令/脚本增加/删除crontab项

使用命令/脚本增加/删除crontab项,记录一下吧.

一, 删某一项cron任务

方法1(仅适用root,不推荐)
修改/var/spool/cron/root文件

这个方法有以下问题:
1, 只有root用户可以修改,其它用户均没有权限,因为/var/spool/cron这个目录的属主及属组均是root,且目录权限是700, 因此其它用户没有权限进入此目录去修改自己的/var/spool/cron/username文件.

方法2
如果某个用户要删除自己的cron任务, 那么只需要执行

crontab -l

crontab -l | grep -v 'config-edit.163.com/config_dir/newsyn' | crontab -

crontab -l | grep -v 'tomcatRoot/jd_product/data/jd_product.txt' | crontab -

如果root需要删除某个用户的cron任务, 那么

crontab -u USERNAME -l

crontab -u USERNAME -l | grep -v 'config-edit.163.com/config_dir/newsyn'  | crontab -u USERNAME -

crontab -u USERNAME -l | grep -v 'tomcatRoot/jd_product/data/jd_product.txt'  | crontab -u USERNAME -

提示: -u参数仅有root可以调用.

也可以这么做

crontab -l | grep -v 'config-edit.163.com/config_dir/newsyn' > cron.base
crontab cron.base

继续阅读

使用SSH反向隧道进行内网穿透

1,前提条件

环境 系统类型 本地用户 SSH服务端口
A机位于公司的NAT网络 安装在VMware里的Debian 8 64bit虚拟机 userA 22
B机是一台有公网IP的VPS CentOS 6 64bit userVPS 1022
C机位于家庭的NAT网络 Windows系统

实现目的:使得位于家庭NAT网络内的C机,可以SSH访问位于公司NAT网络内的A机。

2,原理分析
这里先讲向SS反向隧道的原理,如果你对原理不感兴趣,可以跳过这一节。

$ ssh -p 22 -qngfNTR 6766:127.0.0.1:22 usera@VPS的IP  #回车以后没有反应是正常的,隧道已经建立

命令解析:
从(位于本地NAT网络里的)本机访问VPS,建立一条SSH隧道(本机的随机端口到VPS的22端口)
同时建立了一条反向隧道,将VPS上的6766端口转发到本机的22端口。

然后,就可以从VPS的6766端口访问本地的22端口了

$ ssh -p 6766 userA@127.0.0.1  #从SSH访问位于NAT网络里的linux机器

从SSH访问位于本地NAT网络里的linux机器,这里的userA当然是本地NAT网络里的linux机器用户啦。

这样做有一个问题,那就是,由本地建立的SSH连接是会超时关闭的,如果连接关闭,隧道无法维持,那么VPS就无法利用反向隧道访问本地NAT网络了,为此我们需要一种方案来提供一条稳定的SSH反向隧道,于是autossh就派上用场了;

另外有个问题是,如果本地的Linux系统重启,那么autossh建立的隧道仍然会失效。所以这里我们采取的做法是:
1,将本地Linux系统的public key发给VPS,建立信任机制,这样,本地Linux系统可以无需VPS的密码而建立一条SSH隧道;
2,将autossh写入系统服务,使之在开机时可以自动建立SSH隧道。 继续阅读

Debian 8 64bit安装teamviewer

Debian 8安装teamviewer的过程, 一波三折. 安装过程中肯定会许多许多的错误, 例如提示不支持i386架构等等, 其实官方都给出了详细的说明.

For 32-bit DEB-systems you need the teamviewer_i386.deb package.

For 64-bit DEB-systems without Multiarch you need the teamviewer_amd64.deb package. Please see note on Multiarch below.

For installing TeamViewer, we recommend using the graphical installer.

If you prefer to use the command line or if there is no graphical installer available you can use either one of these commands as an administrator:

For the 32-bit/64-bit Multiarch package:

dpkg -i teamviewer_11.0.xxxxx_i386.deb

For the 64-bit without Multiarch package:

dpkg -i teamviewer_11.0.xxxxx_amd64.deb

In case “dpkg” indicates missing dependencies, complete the installation by executing the following command:

apt-get install -f

继续阅读

CentOS 6安装部署轻量级批量运维工具Omnitty

CentOS 6安装部署轻量级运维工具Omnitty的过程,本文基于CentOS 6 64bit.

1, 安装
Omnitty的官网介绍了安装方法,因此这里从Omnitty的官网复制过来的。

$ yum install gcc gcc-c++ make ncurses ncurses-devel

#In order to run Omnitty, you will need to download and install libROTE first. 
#Then you can install Omnitty.
$ tar -zxf /path/to/rote-X.Y.Z.tar.gz
$ cd rote-X.Y.Z
$ ./configure
$ make
$ su -c "make install"
$ cd ..

$ tar -zxf /path/to/omnitty-X.Y.Z.tar.gz
$ cd omnitty-X.Y.Z
$ ./configure
$ make
$ su -c "make install"

然后,你就可以运行omnitty了,初次运行该命令的时候,你可能会遇到如下错误
omnitty: error while loading shared libraries: librote.so.0: cannot open shared object file: No such file or directory 继续阅读

Ansible添加用户

本文演示了Ansible批量添加用户zhang3,并将用户的密码设定为12345678的过程。

方法一

$ pip install passlib

#获得采用sha512加密以后的密码串
$ python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('12345678')"
$6$rounds=656000$SJkYJamGImQ/OVZC$.9RslNw5vUhd5bBCO3EkHCl/k0eVDlyRhXPXKUooF4nSQNoFdQw1STHj7WlYnOefXmb4IOZDuL49zYEDmSAHM/

$ vim useradd.yml    #写入如下内容
- hosts: 192.168.34.73
  vars:
    user: zhang3
    #run the command like below to generate crypted passwords.
    #generate crypted passwords: python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('12345678')"
    password: '$6$rounds=656000$SJkYJamGImQ/OVZC$.9RslNw5vUhd5bBCO3EkHCl/k0eVDlyRhXPXKUooF4nSQNoFdQw1STHj7WlYnOefXmb4IOZDuL49zYEDmSAHM/'
  tasks:
  - name: create new user locadm
    user: name={{ user }} shell=/bin/bash group=ndsdevelop groups=sudo password={{ password }} update_password=always append=yes

group表示把用户加入某组,groups表示附属组,update_password表示每次都更新密码(除了可以设定为always以外,还可以设置成on_create表示只为新用户修改密码),append=yes表示是新添加的用户
如果是为已有用户修改密码,去掉append=yes即可。
然后运行之

$ ansible-playbook useradd.yml

继续阅读

第 3 页,共 29 页123456...1020...最旧 »