Linux6版本系统搭建Open***远程访问
前言:
open***是一个***工具,用于创建虚拟专用网络(Virtual Private Network)加密通道的免费开源软件,提供证书验证功能,也支持用户名密码认证登录方式,当然也支持两者合一,为服务器登录和连接提供更加安全的方式,可以在不同网络访问场所之间搭建类似于局域网的专用网络通道,配合特定的代理服务器,可用于访问特定受限网站(你懂得)或者突破内部网络限制. 在企业运维管理人员手中,我们通常用来在跳板机上安装×××工具,连接上以管理内部服务器,方便的同时又增加了安全性!
安装
实验环境:centos6系列系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 关闭selinux setenforce 0 sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config #把官方源备份整理,然后摒弃 cd /etc/yum.repos.d/ mkdir yum.bak mv CentOS-* yum.bak/ # 安装epel源,因为资源比较全 #这是6系列系统的源 rpm -Uvh http://mirrors.kernel.org/fedora-epel/6/i386/epel-release-6-8.noarch.rpm #这是7系列系统的源 #rpm -Uvh http://mirrors.kernel.org/fedora-epel/7Server/x86_64/e/epel-release-7-8.noarch.rpm #安装163源,和epel互补,速度也较快 #这是6系列系统的源 wget命令可以用本地yum安装 yum -y install wget wget http://mirrors.163.com/.help/CentOS6-Base-163.repo #这是7系列系统的源 #wget http://mirrors.163.com/.help/CentOS7-Base-163.repo yum makecache # 安装openssl和lzo,lzo用于压缩通讯数据加快传输速度 yum -y install openssl openssl-devel lzo # 安装open***和easy-rsa yum -y install open*** easy-rsa |
其实也可以源码编译,不过费时费力,倒是效果一样,而且版本不同并不影响太多功能,内部系统要求也不至于那么高,所以直接yum安装也是够用的了.
配置
一般来说,open***需要配置证书来使用,假如你只使用用户名密码来认证登录,也不是不可以,只是安全性稍微打了一些折扣,下面来看看配证书.
先找到制作证书的工具easy-rsa存放的位置,一般yum安装的软件大多数都是这个路径/usr/share
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #先确认位置 find / -name easy-rsa /usr/share/easy-rsa /usr/share/doc/easy-rsa #修改vars文件 cd /usr/share/easy-rsa/2.0/ vim vars #修改注册信息,比如公司地址、公司名称、部门名称等。 为了实验的方便,你可以只修改CN国家,或者不作修改,没有影响 export KEY_COUNTRY="CN" 国家 export KEY_PROVINCE="GD" 省份 export KEY_CITY="canton" 城市 export KEY_ORG="XXX.com" 域名 export KEY_EMAIL="admin@xxx.com" 邮箱 export KEY_OU="XXX.com" 组织单位 #保存退出,然后加载一下,注意当前文件夹路径,后续操作暂时不能更换文件夹路径,不然会报错 source vars # 清除keys目录下所有与证书相关的文件 # 下面步骤生成的证书和密钥都在/usr/share/easy-rsa/keys目录里 ./clean-all # 生成根证书ca.crt和根密钥ca.key(一路按回车即可) ./build-ca # 为服务端生成证书和私钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) ./build-key-server server # 每一个登陆的×××客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接,下面建立2份 # 为客户端生成证书和私钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) ./build-key test1 ./build-key test2 # 创建迪菲·赫尔曼密钥,会生成dh2048.pem文件(生成过程比较慢,在此期间不要去中断它) ./build-dh # 生成ta.key文件(防DDos***、UDP淹没等恶意***) open*** --genkey --secret keys/ta.key |
证书已经生成完毕了,来看看证书存放的目录keys,就在当前文件夹目录里面(所以叫你别换文件夹路径),
[root@localhost keys]# ls
01.pem ca.key index.txt.attr.old server.crt test1.crt test2.csr
02.pem dh2048.pem index.txt.old server.csr test1.csr test2.key
03.pem index.txt serial server.key test1.key
ca.crt index.txt.attr serial.old ta.key test2.crt
[root@localhost keys]# pwd
/etc/open***/keys
好了,证书准备完毕,就开始正式配置服务端了,要定义配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #在open***的配置目录下新建一个keys目录 mkdir /etc/open***/keys # 将需要用到的open***证书和密钥复制一份到刚创建好的keys目录中 cp /usr/share/easy-rsa/keys/* /etc/open***/keys/ #编辑server.conf,有些版本有模板,有些版本没有,只能自建 vim /etc/open***/server.conf #定义端口号,默认是1194,不想被"特殊照顾",那就改一下吧 port 11194 # 改成tcp,默认使用udp,如果使用HTTP Proxy,必须使用tcp协议 proto tcp #路由模式,桥接模式用dev tap dev tun # 路径前面加keys,全路径为/etc/open***/keys/ca.crt ca keys/ca.crt cert keys/server.crt key keys/server.key # This file should be kept secret dh keys/dh2048.pem # 默认虚拟局域网网段,不要和实际的局域网冲突即可,路由模式,桥接模式用server-bridge server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt # 10.0.0.0/8是我这台×××服务器所在的内网的网段,读者应该根据自身实际情况进行修改 push "route 10.0.0.0 255.0.0.0" # 可以让客户端之间相互访问直接通过open***程序转发,根据需要设置 client-to-client # 如果客户端都使用相同的证书和密钥连接×××,一定要打开这个选项,否则每个证书只允许一个人连接××× duplicate-cn keepalive 10 120 tls-auth keys/ta.key 0 # This file is secret comp-lzo persist-key persist-tun # Open×××的状态日志,默认为/etc/open***/open***-status.log status open***-status.log # Open×××的运行日志,默认为/etc/open***/open***.log log-append open***.log #日志等级,看你需求,5就看多一些调试信息,3就简单些 verb 3 ###--加入脚本处理,如用密码验证 script-security 3 ###指定只用的认证脚本 auth-user-pass-verify /etc/open***/checkpsw.sh via-env ###不请求客户的CA证书,使用User/Pass验证,如果同时启用证书和密码认证,注释掉该行 #client-cert-not-required ### 使用客户提供的UserName作为Common Name username-as-common-name #保存退出,其他配置请看最后列出的配置说明 |
然后就是密码认证的脚本了,需要自己创建,放在open***的控制目录,和keys文件夹同一个文件夹(不是放keys里面)就可以了,server.conf配置文件里可以体现.
checkpsw.sh 需要加x权限 chmod +x /etc/open***/checkpsw.sh
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #先看看脚本 cat /etc/open***/checkpsw.sh #!/bin/bash ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman <mathias@open***.se> # # This script will authenticate Open××× users against # a plain text file. The passfile should simply contain # one row per user with the username first followed by # one or more space(s) or tab(s) and then the password. PASSFILE="/etc/open***/psw-file" LOG_FILE="/var/log/open***-password.log" TIME_STAMP=`date "+%Y-%m-%d %T"` ########################################################### if [ ! -r "${PASSFILE}" ]; then echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE} exit 1 fi CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}` if [ "${CORRECT_PASSWORD}" = "" ]; then echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE} exit 1 fi if [ "${password}" = "${CORRECT_PASSWORD}" ]; then echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE} exit 0 fi echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE} exit 1
#当然了,还要建议个记录用户名和密码的文件,脚本标记的文件是psw-file,前面是用户名.空格后是密码 cat /etc/open***/psw-file admin admin1234 |
配置写完了,最后来看看系统还要做一些东西
1 2 3 4 5 6 7 8 9 10 11 12 13 | #开启路由转发功能,在/etc/sysctl.conf里添加更改 sed -i '/net\.ipv4\.ip\_forward/c\net\.ipv4\.ip\_forward\=1' /etc/sysctl.conf #有些可能没有这个设置,那就在这个文件最后加入 echo "net\.ipv4\.ip\_forward\=1" >> /etc/sysctl.conf #重载一下这个文件的参数 sysctl -p # 配置防火墙,别忘记保存 iptables -I INPUT -p tcp --dport 11194 -m comment --comment "open***" -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE service iptables save #启动open***并设置为开机启动 service open*** start 注意,如果启动失败,请查看当前目录的open***.log,分析错误问题解决,如果连log都没有,肯定是你的server.conf文件有错误 可以使用open*** /etc/open***/server.conf 没有显示则无问题 如果你是复制粘贴我的命令,可以会出现字符集错误导致系统识别失败,具体请看open***的日志文件。 netstat -anput | grep 11194 可以看到open***正在运行中…… 启动成功后,ifconfig一下,我们可以看到出来了一个虚拟网卡,IP是我们定义的虚拟地址范围内的。 |
下面我们还要配置客户端文件,这个是需要应用到客户端里面的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 编辑client.o***,也是有些版本有模板,有些版本没有,只能自建 vim client.o*** client # 路由模式 dev tun # 改为tcp proto tcp # Open×××服务器的外网IP和端口 remote 外网IP 11194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt # test1的证书 cert test1.crt # test1的密钥 key test1.key ns-cert-type server tls-auth ta.key 1 comp-lzo verb 3 #密码认证相关 auth-user-pass |
最后,准备客户端的配置文件,
1 2 3 4 5 6 7 8 | #先创建一个config文件夹, mkdir config #将刚刚编辑好的client.o***和keys文件夹里面的ca.crt、test1.crt、test1.key、ta.key拷贝进去. cp -ar client.o*** config/ cd keys cp -ar ca.crt test1.crt test1.key ta.key config/ #压缩 tar zcf config.tar.gz config |
最后把config.tar.gz拷贝出来备用,最后在客户端里面使用
使用客户端
上面的都是服务端的操作,下面是客户端的操作,一般而言,windows和linux都可以,当然了,大部分人办公还是windows为主,我们也是以这个来说
首先,当然是要下载了,各位可以自行下载open***客户端,因为是开源,所以是免费的,不用注册,不用给钱,直接下载就可以了,不过官网在墙外,比较悲剧,下面是我上传的地址,可以去这里下载,版本是2.3.12.
http://down.51cto.com/data/2254112
windows的客户端怎么安装我就不多说了,直接点exe下一步就行,不用注册也不用你搞什么破解什么的事,直到安装完就是,期间唯一比较特别的也就是提示你安装个虚拟网卡,允许就ok了.
然后还记得最后下载的config.tar.gz么?请先找到客户端的安装目录,
对的,把config.tar.gz的文件全部解压,放到客户端安装目录的config文件夹里面
这个时候,你就可以双击桌面上的open***图标进行测试了,双击后再通知栏会有这个灰色的东西
然后鼠标右键点击conect开始连接
弹出登录框,输入你的用户名密码
正确通过认证后,看到小框变绿色就完成了
最后我们来测试下,能ping通,那就是完成了
配置文件详解
Server使用的配置文件server.conf
—————————–
#申明本机使用的IP地址,也可以不说明
;local a.b.c.d
#申明使用的端口,默认1194
port 1194
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议
;proto tcp
proto udp
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备
dev tap
;dev tun
#Open×××使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法
ca ca.crt
#Server使用的证书文件
cert server.crt
#Server使用的证书对应的key,注意文件的权限,防止被盗
key server.key # This file should be kept secret
#CRL文件的申明,被吊销的证书链,这些证书将无法登录
crl-verify ***crl.pem
#上面提到的生成的Diffie-Hellman文件
dh dh1024.pem
#这是一条命令的合集,如果你是Open×××的老用户,就知道这条命令的来由
#这条命令等效于:
# mode server #Open×××工作在Server模式,可以支持多client同时动态接入
# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
#
# if dev tun: #如果使用tun设备,等效于以下配置
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明Open×××使用的地址池(用于分配给客户),分别是起始地址、结束地址
# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
# if client-to-client: #如果使用client-to-client这个选项
# push “route 10.8.0.0 255.255.255.0″ #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1
# else
# push “route 10.8.0.1″ #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1
#
# if dev tap: #如果使用tap设备,则等效于以下命令
# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码
# push “route-gateway 10.8.0.1″ #把环境变量route-gateway传递给客户机
#
server 10.8.0.0 255.255.255.0 #等效于以上命令
#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,
#防止open***重新启动后“忘记”Client曾经使用过的IP地址
ifconfig-pool-persist ipp.txt
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
#通过××× Server往Client push路由,client通过pull指令获得Server push的所有选项并应用
;push “route 192.168.10.0 255.255.255.0″
;push “route 192.168.20.0 255.255.255.0″
#×××启动后,在××× Server上增加的路由,×××停止后自动删除
;route 10.9.0.0 255.255.255.252
#Run script or shell command cmd to validate client
#virtual addresses or routes. 具体查看manual
;learn-address ./script
#其他的一些需要PUSH给Client的选项
#
#使Client的默认网关指向×××,让Client的所有Traffic都通过×××走
;push “redirect-gateway”
#DHCP的一些选项,具体查看Manual
;push “dhcp-option DNS 10.8.0.1″
;push “dhcp-option WINS 10.8.0.1″
#如果可以让××× Client之间相互访问直接通过open***程序转发,
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
client-to-client
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
#和keys连接×××,一定要打开这个选项,否则只允许一个人连接×××
;duplicate-cn
#NAT后面使用×××,如果×××长时间不通信,NAT Session可能会失效,
#导致×××连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
#下面表示每10秒通过×××的Control通道ping对方,如果连续120秒无法ping通,
#认为连接丢失,并重新启动×××,重新连接
#(对于mode server模式下的open***不会重新连接)。
keepalive 10 120
#上面提到的HMAC防火墙,防止DOS***,对于所有的控制信息,都使用HMAC signature,
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
tls-auth ta.key 0 # This file is secret
#对数据进行压缩,注意Server和Client一致
comp-lzo
#定义最大连接数
;max-clients 100
#定义运行open***的用户
user nobody
group nobody
#通过keepalive检测超时后,重新启动×××,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动×××,一直保持tun或者tap设备是linkup的,
#否则网络连接会先linkdown然后linkup
persist-tun
#定期把open***的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
status open***-status.log
#记录日志,每次重新启动open***后删除原有的log信息
log /var/log/open***.log
#和log一致,每次重新启动open***后保留原有的log信息,新信息追加到文件最后
;log-append open***.log
#相当于debug level,具体查看manual
verb 3
#########################################################################
接下来配置客户端的配置文件client.conf:
Linux或Unix下使用扩展名为.conf Windows下使用的是.o***,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
———————————-
# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”
client
#指定接口的类型,严格和Server端一致
dev tap
;dev tun
# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel
# if you have more than one. On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap
# 使用的协议,与Server严格一致
;proto tcp
proto udp
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
remote 61.1.1.2 1194
;remote my-server-2 1194
# 随机选择一个Server连接,否则按照顺序从上到下依次连接
;remote-random
# 始终重新解析Server的IP地址(如果remote后面跟的是域名),
# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址
# 这样无需人为重新启动,即可重新接入×××
resolv-retry infinite
# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的×××有必要
nobind
# 运行open***用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作
user nobody
group nobody
#在Client端增加路由,使得所有访问内网的流量都经过×××出去
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
# push “route 192.168.0.0 255.255.255.0″
route 192.168.0.0 255.255.0.0
# 和Server配置上的功能一样如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
persist-key
persist-tun
# 如果你使用HTTP代理连接××× Server,把Proxy的IP地址和端口写到下面
# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]
# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# 对于无线设备使用×××的配置,看看就明白了
# Wireless networks often produce a lot
# of duplicate packets. Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件
ca ca.crt
# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。
cert elm.crt
key elm.key
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# 防止××× client使用他们的keys + DNS hack欺骗*** client连接他们假冒的××× Server
# 因为他们的CA里没有这个扩展
ns-cert-type server
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
tls-auth ta.key 1
# 压缩选项,和Server严格一致
comp-lzo
# Set log file verbosity.
verb 4
转载于:https://blog.51cto.com/11010174/1894372
相关文章:

【Smart_Point】unique_ptr与shared_ptr使用实例
shared_ptr使用实例 文章目录shared_ptr使用实例unique_ptr使用实例cv::fitLine中斜率为正无穷的情况,需要特殊考虑std::string path "D:\\code\\test_base_opencv\\example\\depth_98.raw";std::string save_path "D:\\code\\test_base_opencv\\e…

关于kNN、kMeans、Apriori算法小结
趁着准备即将到来的笔试,也为了回顾一下这一星期来所学的三个机器学习算法,觉得还是重新理一下思路,好理解一下这几个算法。 复制代码 kNN算法 即k-近邻算法,属监督学习。 概述 优点:精度高,对异常值不敏感…

[PHP] Phalcon操作示范
这篇内容将对下列操作进行示范: Insert、Select、Update、Calculation、Transaction、models advanced、dev-tools、cookies [ Insert ] (1) // 模型内操作,data是[字段>值]的一维数组。$bool $this->save($data);return $…

【C++】lambda 表达式
1.lambda 表达式 1.1 lambda 特点 lambda表示一个可调用单元,可视为内联函数 范式 : 具有一个返回类型,一个参数列表,一个函数体 [captrue list](parameters list)->return type {function body} captrue list 捕获列表是一个lambda所…

8位图像的双边滤波器实现
static void bilateralFilter_8u( const Mat& src, Mat& dst, int d,double sigma_color, double sigma_space,int borderType ) {// 获取原始图像信息int cn src.channels();int i, j, maxk, radius;Size size src.size();CV_Assert( (src.type() CV_8UC1 || src.t…

读取Cert格式证书的密钥
不想存储Cert证书内容,只想存储证书密钥,可通过以下2種方式实现 一、通過java读取证书的密钥出来: 1 package com.zat.ucop.service.util;2 3 import sun.misc.BASE64Encoder;4 5 import java.io.FileInputStream;6 import java.security.Pu…

图像导向滤波操作
#include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; // 导向滤波器 cv::Mat guid…

【C++】bind参数绑定 P354(通用的函数适配器)
1. 什么时候该使用bing ?什么时候该使用lambda? 当只有少数地方调用时候使用lambda,当需要多次调用lambda时,需要定义一个函数,而不是多次编译相同的lambda表达式。 调用bind的一般形式为: auto newCallable bind(cal…

[译] RabbitMQ tutorials (3) ---- 'Pub/Sub' (Javascript)
发布与订阅 (Publish/Subscribe) 在之前的章节中,我们创建了工作队列,之前的工作队列的假设是每个任务只被分发到一个worker。在这一节中,我们会做一些完全不一样的事--把一条消息发送给多个消费者,这个模式…

如何选取合适的前端动效方案?
一、原因 前端动画场景需求多对众多动画场景的技术实现方案选择上比较模糊 各动画方案的优劣及适用场景认识模糊现有动画库太多,不知道选哪个 主流动画库的适用场景认识模糊二、分类 动画用途 展示型的动画,类似于一张GIF图,或者一段视频交互…

【C++】algorithm具体操作记录
find寻找特定元素位置 int main(char argc, int* argv[]) {vector<int> intVec { 0,1,1,1,1,2,3,4,5,6,7,8,9 };if (pos ! intVec.end())cout << "The value 5 exists,and its position is " <<distance(intVec.begin(), pos) 1 << endl;…

图像 DFT 尺寸转换
const int nRows srcImage.rows; const int nCols srcImage.cols; std::cout << "srcImage row:" << nRows << std::endl; std::cout << "srcImage col:" << nCols << std::endl; // 获取DFT尺寸 int cRo…

[python]目录及文件操作
Python OS模块和shutil模块 获取路径# 获取当前路径 pwd os.getcwd()# 获取上级路径 a_pwd os.path.abspath(os.path.dirname(os.getcwd())) a_pwd os.path.abspath(os.path.join(os.getcwd(), ..))# 获取上上级路径 aa_pwd os.path.abspath(os.path.join(os.getcwd(), ../…

【C++】关联容器学习记录
STL六大组件关系 Containe通过Allocator取得数据存储空间,Algorithm通过Iterator存取Container,Functor内容可以协助Algorithm完成不同的策略变化,Adaptor可以修饰或者套接Functor。 关联容器特性 1. 关联容器定义 顺序容器支持高效的关键…

图像 DFT 变换
// 通道组建立,cv::Mat groupMats[] {cv::Mat_<float>(sizeConvMat),cv::Mat::zeros(sizeConvMat.size(), CV_32F)};cv::Mat mergeMat;// 通道合并merge(groupMats,2,mergeMat);// DFT变换dft(mergeMat, mergeMat);// 分离通道split(mergeMat, groupMats);/…

MySQL innodb_autoinc_lock_mode 详解
innodb_autoinc_lock_mode这个参数控制着在向有auto_increment 列的表插入数据时,相关锁的行为; 通过对它的设置可以达到性能与安全(主从的数据一致性)的平衡 【0】我们先对insert做一下分类 首先insert大致上可以分成三类: 1、simpl…

小程序代理加盟实现月入1800到50K
他出身寒门,没钱没资源,搬过砖利用身边的健身达人赚过钱,毕业了院长看他很努力还安排过维修多媒体的工作,拒绝院长好意的他,月收入从1800到1万,再到赚到人生首个5万。 只用了一年,他到底是凭什么…
CCF201503-4 网络延时(100分)
试题编号: 201503-4 试题名称: 网络延时 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连…

【Smart_Point】动态内存与智能指针
动态内存 动态内存使用的三种原因 程序不知道自己需要多少对象程序不知道所需对象的准确类型程序需要在多个对线之间共享数据 文章目录动态内存动态内存使用的三种原因实例1: Exercise 12.2:Write your own version of the StrBlob class including the const ver…

JS中的null和undefined,undefined为啥用void 0代替?
起因 某天,在看某位同学的js代码,代码中发现了一个奇怪的东西 void 0,虽然第一眼看不懂这是什么东西,但是根据上下文,这里应该是想判断是否等于undefined,为什么要这样写的,有什么渊源吗?顺便就把undefined和null都拿出来复习了一下. 介绍 undefined和null是js中类型七种数据类…

【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
文章目录Cpp读入结构性数组文本查询程序文本查询程序本版1Cpp读入结构性数组 #include<sstream> #include<iostream> #include<string>std::vector<cv::Point2f> point_calibartion_position;std::string filename "C:/Users/Administrator/Des…

我眼中的DevOps(转)
过去一年以来,一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps。DevOps 就是开发(Development)和运维(Operations)这两个领域的合并。(如果没错的话,…
【阿圆实验】Consul HA 高可用方案
一、建立Consul Cluster环境 利用Consul提供的服务实现服务的注册与发现,需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种…

【C++】拷贝,赋值与构造
拷贝,赋值与构造 文章目录拷贝,赋值与构造1. 拷贝构造函数/合成拷贝构造函数(copy constructor)2. 拷贝赋值运算符3. 析构函数1. 拷贝构造函数/合成拷贝构造函数(copy constructor) 1.1 定义:复…

Java 内存查看与分析
2019独角兽企业重金招聘Python工程师标准>>> 1:gc日志输出 在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息&…

玩转Vuejs--核心原理
一、摘要: Vuejs是一款前端MVVM框架,利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用,网上对于Vue的分析大都是基于各个模块,理解起来不够顺畅,本文将从整个执行过程出发,讲一下…

【C++】拷贝控制与资源管理
1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员。如P447中所见,这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数,那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。 明确拷贝语义:可以定义…

leangoo V5.4.2版上线
本次更新增加了“卡片编辑面板内显示成员、截止日期、工作量”的功能。同时我们也进行了大量的功能优化,以下是此次更新详情: 1. 新增“卡片编辑面板内显示成员、截止日期、工作量”功能 本次更新后 ,您在卡片编辑面板内添加成员,…

差分边缘检测实现
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace cv; // 图像差分操作 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,cv::Mat& edgeYImage) {cv::Mat…

2.1:CGPROGRAM
文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。 本系列原更新于作者的github博客,这里给出链接。 前言 经过前面两个章节的铺垫,我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识,…