[TOC]


前言

《项目实战》系列为《linux实战教学笔记》第二阶段内容的同步教学配套实战练习,每个项目循序衔接最终将组成《Linux实战教学笔记》第二阶段核心教学目标10台规模的基础核心服务架构集群。本文上接http://www.cnblogs.com/chensiqiqi/p/6556509.html 项目实战二

本文转自
 

【SSH项目实战三】脚本密钥的批量分发与执行 - 陈思齐 - 博客园
http://www.cnblogs.com/chensiqiqi/p/6554055.html

【企业案例】

公司来了8台新服务器,计划组成一个小规模集群架构;其中有一台服务器作为批量管理服务器使用,其余7台则是业务架构所需。现在先由你来负责服务器的前期配置工作,

现要求如下:

  • [x] 从管理服务器ssh连接到其他任何服务器时进行免密码的密钥认证,要求进行批量分发。(脚本实现批量分发)
  • [x] 由于没有DNS解析服务器,所以各个服务器需要进行hosts的服务器地址解析,因此,需要进行/etc/hosts文件的批量分发(ansible实现文件批量分发)
  • [x] 新服务器初期需要做简单的优化(服务器优化脚本)和yum仓库的搭建(epel.repo源)。(ansible实现脚本的批量分发和批量执行)

环境准备

操作系统

[root@m01 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)

内核版本

[root@m01 ~]# uname -r
2.6.32-642.el6.x86_64

主机网络参数设置:

主机名 网卡eth0 网卡eth1 用途
lb01 10.0.0.5/24 172.16.1.5/24 A1-nginx负载均衡服务器01
lb02 10.0.0.6/24 172.16.1.6/24 A2-nginx负载均衡服务器02
web02 10.0.0.7/24 172.16.1.7/24 B1-apache web服务器
web01 10.0.0.8/24 172.16.1.8/24 B2-nginx web服务器
db01 10.0.0.51/24 172.16.1.51/24 C3-mysql数据库服务器
nfs01 10.0.0.31/24 172.16.1.31/24 C1-NFS存储服务器
backup 10.0.0.41/24 172.16.1.41/24 C2-rsync存储服务器
m01 10.0.0.61/24 172.16.1.61/24 X-管理服务器

一,开始部署ssh密钥的批量分发

第一步:开始安装sshpass免交互工具并进行SSH-key的批量分发

下载epel源并更新yum仓库

[root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@m01 ~]# yum -y clean all
[root@m01 ~]# yum makecache

安装sshpass工具

[root@m01 ~]# yum -y install sshpass

第二步:创建密钥对文件

免交互创建密钥对

[root@m01 ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
4d::::be:::ab:ce::4f::e3:ab:0b:f8 root@m01
The key's randomart image is:
+--[ DSA ]----+
| oo+. |
| o . . |
| . . . . |
|. + . o |
| + o .S . |
|+ . o . |
|+. . . |
|++o |
|*=E. |
+-----------------+
[root@m01 ~]# ls ~/.ssh/
authorized_keys id_dsa id_dsa.pub known_hosts 命令说明:
ssh-keygen:生成密钥对命令
-t:指定密钥对的密码加密类型(rsa,dsa两种)
-f:指定密钥对文件的生成路径包含文件名
-P(大写):指定密钥对的密码

第三步:免交户方式分发公钥

[root@m01 ~]# sshpass -p "ssh登录密码" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@172.16.1.31"
Now try logging into the machine, with "ssh '-o StrictHostKeyChecking=no root@172.16.1.31'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@m01 ~]# 命令说明:
sshpass:专为ssh连接服务的免交户工具
-p :指定登录的密码
ssh-copy-id:自动分发公钥的工具
-i:指定公钥路径
-o StrictHostKeyChecking=no :不进行对方主机信息的写入(第一次ssh连接会在know_hosts文件里记录)

第四步:测试ssh密钥认证情况

[root@m01 ~]# ssh root@172.16.1.31   #测试成功,免密码ssh连接
Last login: Tue Mar :: from 172.16.1.1
[root@nfs01 ~]#

第五步:编写ssh密钥对免交户批量分发脚本

#!/bin/bash
# author:Mr.chen
# --
# description:SSH密钥批量分发 User=root
passWord=##Linux登录密码 function YumBuild(){ echo "正在安装epel源yum仓库,请稍后..."
cd /etc/yum.repos.d/ &&\
[ -d bak ] || mkdir bak
[ `find ./*.* -type f | wc -l` -gt 0 ] && find ./*.* -type f | xargs -i mv {} bak/
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &>/dev/null
yum -y clean all &>/dev/null
yum makecache &>/dev/null } echo "正在进行网络连接测试,请稍后..."
ping www.baidu.com -c2 >/dev/null ||(echo "无法连同外网,本脚本运行环境必须和外网相连!" && exit)
[ $# -eq 0 ] && echo "没有参数!格式为:sh $0 参数1...n" && exit
rpm -q sshpass &>/dev/null || yum -y install sshpass &>/dev/null
if [ $? -gt 0 ];then
YumBuild
yum -y install sshpass &>/dev/null || (echo "sshpass build error!" && exit)
fi
[ -d ~/.ssh ] || mkdir ~/.ssh;chmod 700 ~/.ssh
echo "正在创建密钥对...."
rm -rf ~/.ssh/id_dsa ~/.ssh/id_dsa.pub
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/null
for ip in $*
do
ping $ip -c1 &>/dev/null
if [ $? -gt 0 ];then
echo "$ip无法ping通请检查网络"
continue
fi
sshpass -p "$passWord" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no ${User}@$ip" &>/dev/null
echo "$ip 密钥分发成功"
done

特别提示:
脚本内容仅作思路开拓之用!
想学好shell或者编程,光看是没用的;
1,学(基础)
2,看(思路)
3,仿(写法)
4,练(课外)

切记....

第六步:脚本分发测试

[root@m01 yum.repos.d]# sh /server/scripts/ssh_key.sh 172.16.1.5 172.16.1.6 172.16.1.7 172.16.1.8 172.16.1.51 172.16.1.31 172.16.1.41 172.16.1.61
正在进行网络连接测试,请稍后...
正在创建密钥对....
172.16..5无法ping通请检查网络
172.16..6无法ping通请检查网络
172.16.1.7 密钥分发成功
172.16.1.8 密钥分发成功
172.16..51无法ping通请检查网络
172.16.1.31 密钥分发成功
172.16.1.41 密钥分发成功
172.16.1.61 密钥分发成功 备注:
故意少开了3台,脚本测试成功。

二,开始部署ansible自动化工具并进行文件的批量分发

第一步:安装ansible工具

需要epel.repo源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

yum -y install ansible

第二步:配置主机组

配置/etc/ansible/hosts文件

[root@m01 ~]# tail - /etc/ansible/hosts
[chensiqi]
172.16.1.31
172.16.1.41
172.16.1.51
172.16.1.5
172.16.1.6
172.16.1.7
172.16.1.8

由于已经配置过免密码的密钥认证了,所以/etc/ansible/hosts的主机映射文件只要加入被管理主机的IP地址就可以了。

第三步:进行ansible批量管理测试

[root@m01 ~]# ansible chensiqi -m command -a "w"
172.16.1.6 | SUCCESS | rc= >>
:: up min, user, load average: 0.00, 0.01, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ m01 : .00s .27s .01s /bin/sh -c /usr 172.16.1.41 | SUCCESS | rc= >>
:: up day, :, users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Sat03 :15m .15s .15s -bash
root pts/ m01 : .00s .33s .00s /bin/sh -c /usr 172.16.1.51 | SUCCESS | rc= >>
:: up min, user, load average: 0.08, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ m01 : .00s .29s .00s /bin/sh -c /usr 172.16.1.31 | SUCCESS | rc= >>
:: up :, users, load average: 0.16, 0.05, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Mon20 :56m .15s .15s -bash
root pts/ m01 : .00s .26s .00s /bin/sh -c /usr 172.16.1.5 | SUCCESS | rc= >>
:: up min, user, load average: 0.00, 0.01, 0.03
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ m01 : .00s .20s .00s /bin/sh -c /usr 172.16.1.7 | SUCCESS | rc= >>
:: up :, users, load average: 0.05, 0.05, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - : :03m .14s .14s -bash
root pts/ m01 : .00s .18s .00s /bin/sh -c /usr 172.16.1.8 | SUCCESS | rc= >>
:: up :, users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Sat09 :03m .10s .10s -bash
root pts/ m01 : .00s .16s .00s /bin/sh -c /usr

第四步,进行/etc/hosts文件的批量分发

[root@m01 ~]# ansible chensiqi -m copy -a "src=/etc/hosts dest=/etc/hosts backup=yes"   #backup=yes 如果目标存在文件,那么覆盖前是否备份目标文件
172.16.1.51 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446564.45-249855699288208/source",
"state": "file",
"uid":
}
172.16.1.31 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446564.26-6373581674916/source",
"state": "file",
"uid":
}
172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446564.37-90309519963188/source",
"state": "file",
"uid":
}
172.16.1.5 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446564.91-218095487370821/source",
"state": "file",
"uid":
}
172.16.1.6 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446564.92-48667872204035/source",
"state": "file",
"uid":
}
172.16.1.8 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446566.37-188264096277764/source",
"state": "file",
"uid":
}
172.16.1.7 | SUCCESS => {
"changed": true,
"checksum": "dba0126bf49ea8d4cdc476828f9edb37085c6afe",
"dest": "/etc/hosts",
"gid": ,
"group": "root",
"md5sum": "09bad48d0c62411850fd04b68f836335",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:net_conf_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489446566.39-64165112131501/source",
"state": "file",
"uid":
}

特别提示:
如果目标路径存在文件,并且目标文件和你想要copy的文件完全相同的话,也会导致ansilbe的copy功能失效

三,编写服务器初期优化脚本(服务优化+自动安装epel源yum仓库),并用ansible进行脚本的批量分发和批量执行

第一步:编写服务器初期服务优化+epel源yum仓库搭建脚本

#!/bin/bash
# author:Mr.chen
# --
# description:服务器初期优化脚本+epel源yum仓库搭建 function ServerSystemOptimize(){ echo "脚本开始尝试对服务器进行一些必要的优化...." && sleep
/etc/init.d/iptables stop &>/dev/null && echo "防火墙已经关闭!" && sleep
setenforce &>/dev/null && echo "SElinux 已关闭!" || echo "SElinux未开启!"
chkconfig iptables off && echo "防火墙已经取消开机启动!"&& sleep
sed -i '7 s/enforcing/disabled/g' /etc/selinux/config && echo "SElinux已经取消开机启动!"&& sleep
A=`awk '/id:/ {print NR,$0}' /etc/inittab | awk '{print $1}'`
sed -i "$A s/5/3/g" /etc/inittab && echo "Linux启动运行级别已经永久设置为3!" && sleep
chkconfig --list | egrep -v "rsyslog|network|crond|sysstat|sshd" | awk '{print "chkconfig",$1,"off"}' | bash &>/dev/null && echo "脚本已经关闭Linux不必要服务的开机自启动!" && sleep } function YumBuild(){ echo "正在安装epel源yum仓库,请稍后..."
cd /etc/yum.repos.d/ &&\
[ -d bak ] || mkdir bak
[ `find ./*.* -type f | wc -l` -gt 0 ] && find ./*.* -type f | xargs -i mv {} bak/
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &>/dev/null
yum -y clean all &>/dev/null
yum makecache &>/dev/null } echo "脚本正在进行网络连接测试,请稍后..."
ping www.baidu.com -c2 &>/dev/null ||(echo "无法连同外网,或者DNS解析有问题,本脚本运行环境必须和外网相连!" && exit)
YumBuild
ServerSystemOptimize

第二步:本地测试脚本功能

[root@m01 ~]# sh /server/scripts/server_uptimize.sh
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动!

第三步:用ansible进行脚本批量分发

[root@m01 ~]# ansible chensiqi -m copy -a "src=/server/scripts/server_uptimize.sh dest=/server/scripts/  backup=yes"
172.16.1.6 | SUCCESS => {
"changed": true,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"md5sum": "efeaffe8266992c190c1055241458259",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489449184.22-105813674245985/source",
"state": "file",
"uid":
}
172.16.1.5 | SUCCESS => {
"changed": true,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"md5sum": "efeaffe8266992c190c1055241458259",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489449184.22-102726815232979/source",
"state": "file",
"uid":
}
172.16.1.51 | SUCCESS => {
"changed": true,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"md5sum": "efeaffe8266992c190c1055241458259",
"mode": "",
"owner": "root",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1489449184.26-180721242166387/source",
"state": "file",
"uid":
}
172.16.1.41 | SUCCESS => {
"changed": false,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/server/scripts/server_uptimize.sh",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"state": "file",
"uid":
}
172.16.1.31 | SUCCESS => {
"changed": false,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/server/scripts/server_uptimize.sh",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"state": "file",
"uid":
}
172.16.1.8 | SUCCESS => {
"changed": false,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/server/scripts/server_uptimize.sh",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"state": "file",
"uid":
}
172.16.1.7 | SUCCESS => {
"changed": false,
"checksum": "9d508da8cce8830722ac38ad274361601d33f43e",
"dest": "/server/scripts/server_uptimize.sh",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/server/scripts/server_uptimize.sh",
"secontext": "system_u:object_r:default_t:s0",
"size": ,
"state": "file",
"uid":
}

第四步:用ansible批量执行脚本

[root@m01 ~]# ansible chensiqi -m shell -a "sh /server/scripts/server_uptimize.sh"
172.16.1.5 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.6 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.31 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.41 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.51 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.8 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动! 172.16.1.7 | SUCCESS | rc= >>
脚本正在进行网络连接测试,请稍后...
正在安装epel源yum仓库,请稍后...
*****************脚本开始尝试对服务器进行一些必要的优化....**********************
防火墙已经关闭!
SElinux 已关闭!
防火墙已经取消开机启动!
SElinux已经取消开机启动!
Linux启动运行级别已经永久设置为3!
脚本已经关闭Linux不必要服务的开机自启动!
 

【SSH项目实战】脚本密钥的批量分发与执行【转】的更多相关文章

  1. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  2. JAVAEE——SSH项目实战02:客户列表和BaseDao封装

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...

  3. JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  4. JAVAEE——SSH项目实战01:SVN介绍、eclipse插件安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  5. JAVAEE——SSH项目实战03:新增客户、数据字典、文件上传和修改客户

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7145599.html 一.新增客户 1.数据字典  用于枚举项目中有限个数的字典项 (1 ...

  6. JAVAEE——SSH项目实战06:统计信息管理、Spring注解开发和EasyUI

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7190925.html 一.统计信息管理   二.Spring注解开发 1.service ...

  7. JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册   显示错误信息到页面上的另一种方法: public ...

  8. JAVAEE——SSH项目实战04:联系人添加、列表显示和修改

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7159337.html 一.联系人添加 1.添加页面设计    linkman/list. ...

  9. [svc]ssh批量分发key/批量用户管理

    centos6 sshpass批量分发key yum install sshpass -y ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" 命令说 ...

随机推荐

  1. 第74天:jQuery实现图片导航效果

    图片导航效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  2. bootstrap练习制作网页

    导航条 <nav class="navbar navbar-default"> <div class="container-fluid"> ...

  3. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说

    再次听Puff的时候我想起了Davy. 文理分班后我坐到了他后面.Davy天生一头黄毛,黑头发”not even one”.上课时他若不是肆无忌惮地舒开四肢呼呼大睡,便是如受惊一般伸长他的细脖子,直挺 ...

  4. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  5. debug - vue中通过ajax获取数据时,如何避免绑定的数据中出现property of undefined错误

    因为获取服务器是异步的,所以 vue 先绑定数据. 如果 ??? 是通过 ajax 异步获取的,在获取之前,???是未定义的.此时在外面的标签上添加一个 v-if="???" 可以 ...

  6. QVariant实质

    QVariant实质 QVariant是一种可以存储不同类型的数据结构,在很多场合这是很有用得为了达到这种目的,可以想象,该对象应该存储对象的类型信息,数据信息以及其他辅助详细考虑用途,这种对象必须支 ...

  7. 【BZOJ4540】【HNOI2016】序列(莫队)

    [BZOJ4540][HNOI2016]序列(莫队) 题面 BZOJ 洛谷 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是 ...

  8. Sort Integers II

    Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...

  9. NOIP2015运输计划题解报告

    这题在洛谷上可以找到提交 P2680运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航 ...

  10. 米勒罗宾素性测试(Miller–Rabin primality test)

    如何判断一个素是素数 效率很高的筛法 打个表 (素数的倍数一定是合数) 就可以解决问题. 筛选法的效率很高,但是遇到大素数就无能为力了. 米勒罗宾素性测试是一个相当著名的判断是否是素数的算法 核心为费 ...