学习知识分享-个人学习生活分享 - 小技巧
type: channel
link: https://www.pvcreate.com/index.php/tag/小技巧/
items: 安全运维之：Linux系统账户和登录安全
items: 彻底删除微软拼音输入法这个讨厌的家伙
items: linux shell实现随机数多种方法（date,random,uuid)
items: 批量生成secureCrt终端连接
items: RexDeploy-自动发布系统
items: expect定期远程登录Juniper防火墙实现定期重新拨号
items: 生产mongodb 分片与集群 方案
items: Converting slapd.conf to a Directory Based Configu
items: CMD命令下修改和查看ip地址,DNS,网关
items: CMD命令实现批量修改文件名

安全运维之：Linux系统账户和登录安全
type: item
date: 2015-11-09T10:22:00+08:00
description: 一、合理使用Shell历史命令记录功能 在Linux下可通过history命令查看用户所有的历史操作记录，同时shell命令操作记录默认保存在用户目录下的.bash_history文件中，通过这个文件可以查询shell命令的执行历史，有助于运维人员进行系统审计和问题排查，同时，在服务器遭受黑客攻击后，也可以通过这个命令或文件查询黑客登录服务器所执行的历史命令操作，但是有时候黑客在入侵服务器后为了毁灭痕迹，可能会删除.bash_history文件，这就需要合理的保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。 默认的history命令只能查看用户历史操作记录，并不能区分每个用户操作命令的时间，这点对于排查问题十分不便，不过可以通过下面的方法（加入四行内容）让history命令自动记录所有shell命令的执行时间，编辑/etc/bashrc文件： HISTFILESIZE=4000 HISTSIZE=4000 HISTTIMEFORMAT='%F %T' export HISTTIMEFORMAT HISTFILESIZE=4000 HISTSIZE=4000 HISTTIMEFORMAT='%F %T' export HISTTIMEFORMAT 其中，HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数，默认值是1000，这里设置为4000；HISTSIZE定义了history命令输出的记录总数；HISTTIMEFORMAT定义时间显示格式，这里的格式与date命令后的“+"%F %T"”是一致的；HISTTIMEFORMAT作为history的时间变量将值传递给history命令。 通过这样的设置后，执行history命令，就会显示每个历史命令的详细执行时间，例如： [root[@server](http://my.oschina.net/u/2391656) ~\]# history 247 2013-10-05 17:16:28 vi /etc/bashrc 248 2013-10-05 17:16:28 top 249 2013-10-05 17:04:18 vmstat 250 2013-10-05 17:04:24 ps -ef 251 2013-10-05 17:16:29 ls -al 252 2013-10-05 17:16:32 lsattr 253 2013-10-05 17:17:16 vi /etc/profile 254 2013-10-05 17:19:32 date +"%F %T" 255 2013-10-05 17:21:06 lsof 256 2013-10-05 17:21:21 history 为了确保服务器的安全，保留shell命令的执行历史是非常有用的一条技巧。shell虽然有历史功能，但是这个功能并非针对审计目的而设计，因此很容易被黑客篡改或是丢失。下面再介绍一种方法，可以实现详细记录登录过系统的用户、IP地址、shell命令以及详细操作时间等，并将这些信息以文件的形式保存在一个安全的地方，以供系统审计和故障排查。 将下面这段代码添加到/etc/profile文件中，即可实现上述功能。 #history USER_IP=\`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/\[()\]//g'\` HISTDIR=/usr/share/.history if \[ -z $USER_IP \] then USER_IP=\`hostname\` fi if \[ ! -d $HISTDIR \] then mkdir -p $HISTDIR chmod 777 $HISTDIR fi if \[ ! -d $HISTDIR/${LOGNAME} \] then mkdir -p $HISTDIR/${LOGNAME} chmod 300 $HISTDIR/${LOGNAME} fi export HISTSIZE=4000 DT=\`date +%Y%m%d_%H%M%S\` export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT" export HISTTIMEFORMAT="\[%Y.%m.%d %H:%M:%S\]" chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null 这段代码将每个用户的shell命令执行历史以文件的形式保存在/usr/share/.history目录中，每个用户一个文件夹，并且文件夹下的每个文件以IP地址加she…

彻底删除微软拼音输入法这个讨厌的家伙
type: item
date: 2015-09-24T08:56:29+08:00
description: 点点点 文章作者 明哥 文章地址 https://www.pvcreate.com/index.php/archives/24/ 创建时间 2015-09-24 关注订阅 微信订阅号 开源项目 https://gitee.com/lookingdreamer 工具市场 https://gitee.com/lookingdreamer/SPPPOTools

linux shell实现随机数多种方法（date,random,uuid)
type: item
date: 2015-08-24T10:20:23+08:00
description: 在日常生活中，随机数实际上经常遇到，想丢骰子，抓阄，还有抽签。呵呵，非常简单就可以实现。那么在做程序设计，真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api，这些原始参数是获取一些计算机运行原始信息，如内存，电压，物理信号等等，它的值在一个时间段可以保证是唯一的了。好了，废话我就不说了。呵呵。 shell脚本程序我们有那些获得随机数方法呢？ 一、通过时间获得随机数（date) 这个也是我们经常用到的，可以说时间是唯一的，也不会重复的，从这个里面获得同一时间的唯一值。适应所有程序里面了。 例子： [chengmo@centos5 shell]$ date +%s 1287764773 #获得时间戳，当前到：1970-01-01 00:00:00 相隔的秒数 #如果用它做随机数，相同一秒的数据是一样的。在做循环处理，多线程里面基本不能满足要求了。 [chengmo@centos5 shell]$ date +%N 738710457 #获得当前时间的纳秒数据，精确到亿分之一秒。 #这个相当精确了，就算在多cpu，大量循环里面，同一秒里面，也很难出现相同结果，不过不同时间里面还会有大量重复碰撞 [chengmo@centos5 shell]$ date +%s%N 1287764807051101270 #这个可以说比较完美了，加入了时间戳，又加上了纳秒 通过上面说明，用它来做随机数的基数了，接下来我们看怎么样获得一段数据内怎么样获得随机数。 #!/bin/sh #写个随机函数，调用方法random min max #在min 与 max直接获得随机整数 #copyright chengmo QQ:8292669 #获得随机数返回值，shell函数里算出随机数后，更新该值 function random() { min=$1; max=$2-$1; num=$(date +%s+%N); ((retnum=num%max+min)); #进行求余数运算即可 echo $retnum; #这里通过echo 打印出来值，然后获得函数的，stdout就可以获得值 #还有一种返回，定义全价变量，然后函数改下内容，外面读取 } #得到1-10的seq数据项 for i in {1..10}; do out=$(random 2 10000); echo $i,"2-10000",$out; done; 看看运行结果： [chengmo@centos5 shell]\$ sh testrandom.sh\ 1,2-10000,5600 2,2-10000,5295 3,2-10000,3432 4,2-10000,3148 5,2-10000,9041 6,2-10000,4290 7,2-10000,2380 8,2-10000,9009 9,2-10000,5474 10,2-10000,3664 一个循环里面，得到值各不相同。 这个是我们常用方法，适应各种语言，是一个通用算法，就算服务器不提供，某时刻相同唯一数据标记，我们也可以通过这种方法，做自己的伪随机数。下面还有更简单方法呢，不要我们自己做了。 2、通过内部系统变量(\$RANDOM) 其实，linux已经提供有个系统环境变量了，直接就是随机数，哈哈，觉得刚学习方法，是不是白费了！！ [chengmo@centos5 shell]$ echo $RANDOM 10918 [chengmo@centos5 shell]$ echo $RANDOM 10001 #连续2次访问，结果不一样，这个数据是一个小于或等于5位的整数 可能有疑问了，如果超过5位的随机数怎么得到呢？ 呵呵，加个固定10位整数，然后进行求余，跟例1 一样了。接下来的例子又是我们自立更生做了。 3、通过系统内部唯一数据生成随机数（/dev/random,urandom) 我们知道dev目录下面，是linux一些默认设备，它给我们感觉就是放的是键盘，硬盘，光驱等设备的对应文件了。 其实linux有些设备很特殊，有特殊用途。前面我们说到的：/dev/[udp|tcp]/host/port比较特殊吧。呵呵，有扯远了。 /dev/random设备，存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候，唯一值数据，因此可以用作随机数元数据。我们可以通过文件读取方式，读得里面数据。/dev/urandom这个设备数据与random里面一样。只是，它是非阻塞的随机数发生器，读取操作不会产生阻塞。 实例： [chengmo@centos5 shell]$ head -1 /dev/urandom ãÅ†ù…•KTþçanVÕã¹Û&¡õ¾“ô2íùU“ žF¦_ ÿ”†mEðûUráÏ=J…

批量生成secureCrt终端连接
type: item
date: 2015-08-04T11:31:24+08:00
description: 你是否在为手动连接很多服务器的终端Crt而烦恼呢？ Now 提供一个快捷的解决方法？ [1.批量创建SecureCRT的终端连接]\ [① 导出名称和IP的表格] ②将表格的转换为txt文件 serverlists.txt ③上传SecureCrt的模板配置文件 ④执行批量生成脚本 ⑤将该文件放到secureCrt的终端配置文件夹里面就可以看到了 终端配置文件查找图如下: 将ini文件丢到如上的文件夹即可。\ 批量创建ini文件脚本如下： #!/bin/bash #author: GaoMing #date: 2015-08-04 #qq: 530035210 #blog: https://my.oschina.net/pwd/blog #批量生成secureCrt终端连接 logdir=/data/log/shell #日志路径 log=$logdir/log.log #日志文件 is_font=1 #终端是否打印日志: 1打印 0不打印 is_log=0 #是否记录日志: 1记录 0不记录 file="serverlists.txt" iniFile="temp.ini" datef(){ date "+%Y-%m-%d %H:%M:%S" } print_log(){ if [[ $is_log -eq 1 ]];then [[ -d $logdir ]] || mkdir -p $logdir echo "[ $(datef) ] $1" >> $log fi if [[ $is_font -eq 1 ]];then echo -e "[ $(datef) ] $1" fi } autoCreateCrtConnect(){ print_log "开始读取服务器列表"、 if [[ ! -f $file ]];then print_log "$file文件不存在" fi if [[ ! -f $iniFile ]];then print_log "$iniFile文件不存在" fi print_log "开始批量生成ini文件" while read line do name=$(echo $line |awk -F':' '{print $1}') ip=$(echo $line |awk -F':' '{print $2}'|sed 's/[ ][ ]*//g') \cp $iniFile "$name".ini sed -i "s/8.8.8.8/$ip/g" "$name".ini print_log "生成$name.ini文件完成." done < $file print_log "开始批量生成ini文件完成" } autoCreateCrtConnect 文章作者 明哥 文章地址 https://www.pvcreate.com/index.php/archives/56/ 创建时间 2015-08-04 关注订阅 微信订阅号 开源项目 https://gitee.com/lookingdreamer 工具市场 https://gitee.com/lookingdreamer/SPPPOTools

RexDeploy-自动发布系统
type: item
date: 2015-06-04T11:26:00+08:00
description: Rexdeploy Rexdeploy: 一个基于名字服务自动化平台（命令行CLI版 和 API接口版） 中文文档 简单描述 RexDeploy是一个免客户端安装的管控平台，支持基于名字服务的自动发布，基于名字服务的自动重启(启动与停止)，以及基于名字服务的日志集中式管理，用户管理等，同时也支持批量执行命令，文件分发（上传与下载）等。 功能特点 批量命令执行 批量文件上传 批量文件下载 应用自动发布 应用自动回滚 应用自动重启 应用自动下载 配置自动下载 应用自动同步 应用命令执行 应用发布检查 支持并发执行 查看实时日志 集中日志下载 日志分析过滤 系统用户管理 应用灰度发布 微信和QQ消息 CLI部分截图 基于名字服务的应用自动发布 基于名字服务的应用灰度发布 基于名字服务的命令批量执行 基于名字服务的批量上传和下载 基于名字服务的应用批量重启 基于名字服务的批量日志下载 基于名字服务的批量日志过滤 基于服务器批量用户管理 文章作者 明哥 文章地址 https://www.pvcreate.com/index.php/archives/31/ 创建时间 2015-06-04 关注订阅 微信订阅号 开源项目 https://gitee.com/lookingdreamer 工具市场 https://gitee.com/lookingdreamer/SPPPOTools

expect定期远程登录Juniper防火墙实现定期重新拨号
type: item
date: 2015-05-21T18:05:27+08:00
description: #!/bin/bash #author: GaoMing #date: 2015-05-20 #qq: 530035210 #blog: https://my.oschina.net/pwd/blog #pppoe 定期重新拨号 logdir=/data/log/shell #日志路径 log=$logdir/log.log #日志文件 is_font=1 #终端是否打印日志: 1打印 0不打印 is_log=1 #是否记录日志: 1记录 0不记录 User=admin Host=192.168.1.253 Password="cccccc!@#xxxxxxxx748." #Cmd="get pppoe name ADSL-callcenter" Cmd="get interface" from_name="运维组" from="530035210@qq.com" to="huanggm@baoxian.com" datef(){ date "+%Y-%m-%d %H:%M:%S" } print_log(){ if [[ $is_log -eq 1 ]];then [[ -d $logdir ]] || mkdir -p $logdir echo "[ $(datef) ] $1" >> $log fi if [[ $is_font -eq 1 ]];then echo -e "[ $(datef) ] $1" fi } run() { if [[ $1 == "" ]];then print_log "cmd命令不能为空" exit fi expect -c " spawn /usr/bin/ssh -o StrictHostKeyChecking=no $User@$Host set timeout -1 expect \"\*password\*:\" send \"$Password\r\" expect \"\*\>\" send \"$1 \r\" expect \"\*\>\" send \"exit\r\" expect eof " } sendmail(){ email_title=$1 email_content=$2 email_subject=$3 if [[ $email_title == "" ]];then email_title="这是一封测试邮件." fi if [[ $email_content == "" ]];then email_content="这是测试邮件的内容." fi if [[ $email_subject == "" ]];then email_subject="这是测试邮件的主题." fi echo -e "To: \"${email_title}\" <${to}> \nFrom: \"${from_name}\" <${from}>\nSubject: ${email_subject}\n\n`echo ${email_content}`" | /usr/sbin/sendmail -t } #获取拨号前接口的外网地址 run_res1=$(run "get interface") interface_1=$(echo "$run_res1" |grep "eth0\/1" |awk '{print $2}' |sed "s/\/32//g") interface_2=$(echo "$run_res1" |grep "eth0\/2" |awk '{print $2}'|sed "s/\/32//g") interface_3=$(echo "$run_res1" |grep "eth0\/3" |awk '{print $2}'|sed "s/\/32//g") print_log "重启前,各接口的外网地址如下: eth0/1:$interface_1 eth0/2:$interface_2 eth0/3:$interface_3" #开始拨号 run_int1=$(run "exec pppoe name ADSL-bw2 disconnect") run_int2=$(run "exec pppoe name BW-GuangXian-2 disconnect") run_int3=$(run "exec pppoe name ADSL-callcenter disconnect") #获取拨号后接口的外网地址 run2_res1=$(run "get interface") interface2_1=$(echo "$run2_res1" |grep "eth0\/1" |awk '{print $2}' |sed "s/\/32//g") interf…

生产mongodb 分片与集群 方案
type: item
date: 2015-05-06T18:05:00+08:00
description: 生产mongodb 分片与集群 方案 一、 mongodb分片与集群拓扑图 二、分片与集群的部署 1.Mongodb的安装 分别在以上3台服务器安装好mongodb 安装方法见安装脚本。 2.Mongod 创建单个分片的副本集 10.68.4.209 ①建立数据文件夹和日志文件夹 mdkir /data/{master,slave,arbiter} mkdir /data/log/mongodb/{master,slave,arbiter} -p ②建立配置文件 master.conf dbpath=/data/master logpath=/data/log/mongodb/master/mongodb.log pidfilepath=/var/run/mongo_master.pid directoryperdb=true logappend=true replSet=policydb port=10002 oplogSize=10000 fork=true noprealloc=true profile=1 slowms=200 slave.conf dbpath=/data/slave logpath=/data/log/mongodb/slave/mongodb.log pidfilepath=/var/run/mongo_slave.pid directoryperdb=true logappend=true replSet=policydb port=10001 oplogSize=10000 fork=true noprealloc=true profile=1 slowms=200 arbiter.conf dbpath=/data/arbiter logpath=/data/log/mongodb/arbiter/mongodb.log pidfilepath=/var/run/mongo_arbiter.pid directoryperdb=true logappend=true replSet=policydb port=10000 oplogSize=10000 fork=true noprealloc=true profile=1 slowms=200 ③启动mongodb /etc/init.d/mongodb_master start /etc/init.d/mongodb_slave start /etc/init.d/mongodb_arbiter start ④配置主、备、仲裁节点 主节点: /usr/local/mongodb/bin/mongo 10.68.4.209:10002 MongoDB shell version: 2.4.9 connecting to: 10.68.4.209:10002/test use admin switched to db admin config={ _id:"policydb", members:[ {_id:0,host:'10.68.4.209:10002',priority:2}, {_id:1,host:'10.68.4.209:10001',priority:1}, ... {_id:2,host:'10.68.4.209:10000',arbiterOnly:true}] }; { "_id" : "policydb", "members" : [ { "_id" : 0, "host" : "10.68.4.209:10002", "priority" : 2 }, { "_id" : 1, "host" : "10.68.4.209:10001", "priority" : 1 }, { "_id" : 2, "host" : "10.68.4.209:10000", "arbiterOnly" : true } ] } rs.initiate(config) #初始化 rs.status() #查看集群状态 10.68.4.29 ①建立数据文件夹和日志文件夹 mdkir /data/{master,slave,arbiter} mkdir /data/log/mongodb/{master,slave,arbiter} -p ②建立配置文件 master.conf dbpath=/data/master logpath=/data/log/mongodb/master/mongodb.log pidfilepath=/var/run/mongo_master.pid directoryperdb=true logappend=true replSet=policydb2 port=10002 oplogSize=10000 f…

Converting slapd.conf to a Directory Based Configu
type: item
date: 2015-03-13T18:41:44+08:00
description: OpenLDAP 2.4 OpenLDAP 2.4 provides some great new features over 2.3. Notable among them are the ability to store configuration data in the directory and change values on the fly. Adding a Schema Converting slapd.conf to a Directory Based Configuration OpenLDAP 2.4 maintains an LDIF-based online directory in /etc/openldap/slapd.d/ (or otherwise specified location). In order to use this, you must seed the directory one of two ways. One way is to convert an existing slapd.conf file, which is illustrated below. Note that to access the newly minted cn=config, you should create an entry in your slapd.conf to provide a root password to this entry, or otherwise provide a useful ACL/ACI which gives a user access. To convert a standard slapd.conf file to the new format, issue the following command (re: man slapd-config): slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d Note that the directory /etc/openldap/slapd.d must exist prior to this command successfully completing. After importing the config file, start the OpenLDAP server: /etc/init.d/ldap start Verify that the server is running: ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts After validating that the server will start and stop, import some data with an LDIF file: slapadd -l <file>.ldif When attempting this, I get an error about an invalid attribute for an objectclass: # slapadd -l slapcat.out str2entry: invalid value for attributeType objectClass #1 (syntax 1.3.6.1.4.1.1466.115.121.1.38) slapadd: could not parse entry (line=1) Missing a schema, had to add cosine schema to get this to work. When attempting to add the schema ldif, I get this error: # ldapadd -x -H ldap://locahost -D "cn=manager,dc=example,dc=org" -W -f core.ldif Enter LDAP Password: ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) I switched back to using the slapd.conf file to get this to work, and emptying out the /var/lib/openldap-data directory, reattempting the slapadd, I get the following: # slapadd -l backup.ldif …

CMD命令下修改和查看ip地址,DNS,网关
type: item
date: 2015-03-12T00:04:56+08:00
description: [ ]设置IP、DNS、网关 >netsh interface ip set address name="本地连接" source=static addr=192.168.132.5 mask=255.255.255.0 >netsh interface ip set address name="本地连接" gateway=192.168.132.1 gwmetric=0 >netsh interface ip set dns name="本地连接" source=static addr=192.168.132.1 register=PRIMARY >netsh interface ip set wins name="本地连接" source=static addr=none [ ]查看IP、DNS、网关 >netsh interface ip show address ****\ 文章作者 明哥 文章地址 https://www.pvcreate.com/index.php/archives/30/ 创建时间 2015-03-12 关注订阅 微信订阅号 开源项目 https://gitee.com/lookingdreamer 工具市场 https://gitee.com/lookingdreamer/SPPPOTools

CMD命令实现批量修改文件名
type: item
date: 2015-02-18T16:46:24+08:00
description: cmd命令批量修改文件名: (批量去掉下载电影后的前缀) @echo off for /f "delims=" %%a in ('dir /b/s/a-d [阳光电影www.ygdy8.com].*') do ( set "str=%%~nxa" setlocal enabledelayedexpansion ren "%%a" "!str:~20!" endlocal ) 批量删除文件名特定字符(含特定字符自身)前后的文字? (如:Movie_20_(528990).mpg,要求只保留528990.mpg这样的文件名) @echo off for %%a in (*.mpg) do for /f "tokens=2 delims=()" %%b in ("%%a") do ren "%%a" "%%b.mpg" 批量添加文件名前缀 @echo off&setlocal EnableDelayedExpansion color 0a echo %date% %time% echo 正在批量重命名文件...... set a=1 for /f "delims=" %%i in ('dir /b *.del') do ( ren "%%i" "文件名前缀%%i" set /a a+=1 ) ) set /a a-=1 echo 重命名完成，共重命名%a%个文件。 pause 文章作者 明哥 文章地址 https://www.pvcreate.com/index.php/archives/70/ 创建时间 2015-02-18 关注订阅 微信订阅号 开源项目 https://gitee.com/lookingdreamer 工具市场 https://gitee.com/lookingdreamer/SPPPOTools