centos7.x openvpn+freeradius认证daloradius管理

继上一篇的openvpn账号密码验证,由于账号密码保存在服务器文件中的是明文,存在一定的风险,现在通过freeradius进行账号认证

同样参考相关网络资料

http://www.beijinghuayu.com.cn/centos7%e9%85%8d%e7%bd%aedaloradius/

freeradius 2.2.5版本限制用户并发登录_norhtlander的专栏-CSDN博客

FreeRADIUS 3.0安装配置_cluniquecui的专栏-CSDN博客

软件版本

freeradius-3.0.13-15.el7.x86_64

mariadb-server-5.5.68-1.el7.x86_64

php-5.4.16-48.el7.x86_64

服务器:阿里云

1.安装

yum安装简便快捷

安装依赖

yum install wget telnet net-tools httpd mariadb-server php php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel epel-release -y

安装freeradius

yum install freeradius freeradius-mysql freeradius-utils -y

2.关闭selinux

[root@openvpn ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
[root@openvpn ~]# setenforce 0
setenforce: SELinux is disabled
[root@openvpn ~]# geten
getenforce  getent      
[root@openvpn ~]# getenforce 
Disabled

3.启动数据库、httpd,关闭防火墙

[root@openvpn ~]# systemctl restart mariadb
[root@openvpn ~]# systemctl restart httpd
[root@openvpn ~]# systemctl stop firewalld
[root@openvpn ~]# systemctl disable firewalld

4.登录数据库,创建radius数据库

[root@openvpn ~]# mysql            #默认初次启动的mariadb没有密码,直接登录
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#设置mariadb的root登录密码
MariaDB [(none)]> set password=password('password');
Query OK, 0 rows affected (0.00 sec)
#创建radius数据库
MariaDB [(none)]> create database radius;
Query OK, 1 row affected (0.00 sec)
#给radius库建用户密码
MariaDB [(none)]> grant all on radius.* to radius@localhost identified by 'radius';
Query OK, 0 rows affected (0.00 sec)
#刷新
MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.01 sec)
#退出
MariaDB [(none)]> quit
Bye

5.初始化freeradius数据库

[root@openvpn ~]# cd /etc/raddb/
[root@openvpn raddb]# ls
certs         hints           mods-config   policy.d      README.rst       templates.conf
clients.conf  huntgroups      mods-enabled  proxy.conf    sites-available  trigger.conf
dictionary    mods-available  panic.gdb     radiusd.conf  sites-enabled    users

yum安装的freeradius配置文件默认在/etc/raddb

#初始化数据库
[root@openvpn mysql]# mysql -uradius -p radius < schema.sql 
Enter password: 

[root@openvpn mysql]# mysql -uradius -p radius 
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [radius]> use radius
Database changed
MariaDB [radius]> show tables;
+------------------+
| Tables_in_radius |
+------------------+
| nas              |
| radacct          |
| radcheck         |
| radgroupcheck    |
| radgroupreply    |
| radpostauth      |
| radreply         |
| radusergroup     |
+------------------+
8 rows in set (0.00 sec)

MariaDB [radius]> quit
Bye

6.freeradius连接数据库

6.1允许sql模块

[root@openvpn mysql]# cd /etc/raddb/mods-enabled/
[root@openvpn mods-enabled]# ll
total 0
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 always -> ../mods-available/always
lrwxrwxrwx 1 root radiusd 29 Jul 22 19:54 attr_filter -> ../mods-available/attr_filter
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 cache_eap -> ../mods-available/cache_eap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 chap -> ../mods-available/chap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 date -> ../mods-available/date
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 detail -> ../mods-available/detail
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 detail.log -> ../mods-available/detail.log
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 dhcp -> ../mods-available/dhcp
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 digest -> ../mods-available/digest
lrwxrwxrwx 1 root radiusd 33 Jul 22 19:54 dynamic_clients -> ../mods-available/dynamic_clients
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 eap -> ../mods-available/eap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 echo -> ../mods-available/echo
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 exec -> ../mods-available/exec
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 expiration -> ../mods-available/expiration
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 expr -> ../mods-available/expr
lrwxrwxrwx 1 root radiusd 23 Jul 22 19:54 files -> ../mods-available/files
lrwxrwxrwx 1 root radiusd 25 Jul 22 19:54 linelog -> ../mods-available/linelog
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 logintime -> ../mods-available/logintime
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 mschap -> ../mods-available/mschap
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 ntlm_auth -> ../mods-available/ntlm_auth
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 pap -> ../mods-available/pap
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 passwd -> ../mods-available/passwd
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 preprocess -> ../mods-available/preprocess
lrwxrwxrwx 1 root radiusd 25 Jul 22 19:54 radutmp -> ../mods-available/radutmp
lrwxrwxrwx 1 root radiusd 23 Jul 22 19:54 realm -> ../mods-available/realm
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 replicate -> ../mods-available/replicate
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 soh -> ../mods-available/soh
lrwxrwxrwx 1 root radiusd 26 Jul 22 19:54 sradutmp -> ../mods-available/sradutmp
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 unix -> ../mods-available/unix
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 unpack -> ../mods-available/unpack
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 utf8 -> ../mods-available/utf8
[root@openvpn mods-enabled]# ln -s ../mods-available/sql ./
[root@openvpn mods-enabled]# ll
total 0
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 always -> ../mods-available/always
lrwxrwxrwx 1 root radiusd 29 Jul 22 19:54 attr_filter -> ../mods-available/attr_filter
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 cache_eap -> ../mods-available/cache_eap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 chap -> ../mods-available/chap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 date -> ../mods-available/date
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 detail -> ../mods-available/detail
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 detail.log -> ../mods-available/detail.log
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 dhcp -> ../mods-available/dhcp
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 digest -> ../mods-available/digest
lrwxrwxrwx 1 root radiusd 33 Jul 22 19:54 dynamic_clients -> ../mods-available/dynamic_clients
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 eap -> ../mods-available/eap
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 echo -> ../mods-available/echo
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 exec -> ../mods-available/exec
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 expiration -> ../mods-available/expiration
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 expr -> ../mods-available/expr
lrwxrwxrwx 1 root radiusd 23 Jul 22 19:54 files -> ../mods-available/files
lrwxrwxrwx 1 root radiusd 25 Jul 22 19:54 linelog -> ../mods-available/linelog
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 logintime -> ../mods-available/logintime
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 mschap -> ../mods-available/mschap
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 ntlm_auth -> ../mods-available/ntlm_auth
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 pap -> ../mods-available/pap
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 passwd -> ../mods-available/passwd
lrwxrwxrwx 1 root radiusd 28 Jul 22 19:54 preprocess -> ../mods-available/preprocess
lrwxrwxrwx 1 root radiusd 25 Jul 22 19:54 radutmp -> ../mods-available/radutmp
lrwxrwxrwx 1 root radiusd 23 Jul 22 19:54 realm -> ../mods-available/realm
lrwxrwxrwx 1 root radiusd 27 Jul 22 19:54 replicate -> ../mods-available/replicate
lrwxrwxrwx 1 root radiusd 21 Jul 22 19:54 soh -> ../mods-available/soh
lrwxrwxrwx 1 root root    21 Jul 22 20:13 sql -> ../mods-available/sql
lrwxrwxrwx 1 root radiusd 26 Jul 22 19:54 sradutmp -> ../mods-available/sradutmp
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 unix -> ../mods-available/unix
lrwxrwxrwx 1 root radiusd 24 Jul 22 19:54 unpack -> ../mods-available/unpack
lrwxrwxrwx 1 root radiusd 22 Jul 22 19:54 utf8 -> ../mods-available/utf8

6.2修改freeradius配置文件

使之支持sql模式

6.2.1修改/etc/raddb/sites-enabled/default文件

将“-sql”改为“sql”

#修改第405行
404         #  See "Authorization Queries" in mods-available/sql
405         sql
406 
407         #
#修改第640行
639         #  See "Accounting queries" in mods-available/sql
640         sql
641 
642         #
#修改第738行
737         #  See "Authentication Logging Queries" in mods-available/sql
738         sql
739 
740         #
741         #  Instead of sending the query to the SQL server,
#修改第843行
841         Post-Auth-Type REJECT {
842                 # log failed authentications in SQL, too.
843                 sql
844                 attr_filter.access_reject
845 
846                 # Insert EAP-Failure message if the request was

6.2.2修改/etc/raddb/mods-available/sql文件

#修改第31行为rlm_sql_mysql
31         driver = "rlm_sql_null"
#修改第87-97行,如下:
 87         dialect = "mysql"
 88 
 89         # Connection info:
 90         #
 91         server = "localhost"
 92         port = 3306
 93         login = "radius"
 94         password = "radius"
 95 
 96         # Database table configuration for everything except Oracle
 97         radius_db = "radius"
#修改第245行
245         read_clients = yes

6.3测试

执行测试命令测试

#启动radius,调试模式-X
[root@openvpn ~]# radiusd -X

数据插入一条数据

MariaDB [radius]> insert into radcheck(id,username,attribute,op,value) values('1','test','Cleartext-Password',':=','testpwd');
Query OK, 1 row affected (0.00 sec)

MariaDB [radius]> select * from radcheck;
+----+----------+--------------------+----+---------+
| id | username | attribute          | op | value   |
+----+----------+--------------------+----+---------+
|  1 | test     | Cleartext-Password | := | testpwd |
+----+----------+--------------------+----+---------+
1 row in set (0.00 sec)

MariaDB [radius]> quit
Bye

另一个窗口,执行测试命令

[root@openvpn sites-enabled]# radtest test testpwd localhost 1812 testing123
Sent Access-Request Id 220 from 0.0.0.0:43606 to 127.0.0.1:1812 length 74
	User-Name = "test"
	User-Password = "testpwd"
	NAS-IP-Address = 172.25.217.190
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "testpwd"
Received Access-Accept Id 220 from 127.0.0.1:1812 to 0.0.0.0:0 length 20

当返回结果为 Access-Accept,说明使用数据库对接成功。下面需要对接daloradius。

7.安装daloridius

下载安装包

在github上下载安装包

[root@openvpn ~]# wget https://github.com/lirantal/daloradius/archive/refs/heads/master.zip

解压

[root@openvpn ~]# yum install unzip -y
[root@openvpn ~]# unzip master.zip 
[root@openvpn ~]# ls
daloradius-master  master.zip

将daloradius-master放在/var/www/html

[root@openvpn ~]# mv daloradius-master/ /var/www/html/daloradius
[root@openvpn html]# chown apache:apache /var/www/html/daloradius -R

修改配置文件

[root@openvpn ~]# cd /var/www/html/daloradius/library
[root@openvpn library]# cp daloradius.conf.php.sample daloradius.conf.php
[root@openvpn library]# vim daloradius.conf.php
#做如下修改

$configValues['CONFIG_DB_ENGINE'] = 'mysql';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = 'radius';
$configValues['CONFIG_DB_NAME'] = 'radius';

daloradius初始化数据库

[root@openvpn library]# cd ../contrib/db/
[root@openvpn db]# ls
fr1-mysql-daloradius-and-freeradius.sql  fr2-mysql-freeradius.sql                        mysql-migrate-0.93-to-0.94_hotspots_table.sql  mysql-migrate-0.95-to-0.96.sql  mysql-migrate-0.98-to-0.99.sql
fr1-mysql-freeradius.sql                 mysql-daloradius.sql                            mysql-migrate-0.93-to-0.94_userinfo_table.sql  mysql-migrate-0.96-to-0.97.sql  pgsql-daloradius-sample-data.sql
fr2-mysql-daloradius-and-freeradius.sql  mysql-migrate-0.92-to-0.93_operators_table.sql  mysql-migrate-0.94-to-0.95.sql                 mysql-migrate-0.97-to-0.98.sql  pgsql-daloradius.sql
[root@openvpn db]# mysql -uradius -p radius < fr2-mysql-daloradius-and-freeradius.sql 
Enter password: 
[root@openvpn db]# mysql -uradius -p radius < mysql-daloradius.sql 
Enter password: 
[root@openvpn db]# 

启动httpd

[root@openvpn db]# apachectl restart
[root@openvpn db]# 

浏览器登录

8.*.*.171/daloradius

修改账号配置

添加随机密码特殊字符(默认只有大小写字母和1-9数字)

在这后面直接加入(记得Apply应用)

直接加入

修改密码为md5

创建测试账号

后台测试

[root@openvpn html]# radtest abc 123456 localhost 1812 testing123
Sent Access-Request Id 57 from 0.0.0.0:39155 to 127.0.0.1:1812 length 73
	User-Name = "abc"
	User-Password = "123456"
	NAS-IP-Address = 172.25.217.190
	NAS-Port = 1812
	Message-Authenticator = 0x00
	Cleartext-Password = "123456"
Received Access-Accept Id 57 from 127.0.0.1:1812 to 0.0.0.0:0 length 20

测试成功!

8.安装openvpn

安装过程略,可以参考参照《centos7 搭建openvpn-账号密码验证》

8.1修改server/client配置

server.conf

port 1194
proto tcp
dev tun
ca /etc/openvpn/3.0.8/pki/ca.crt
cert /etc/openvpn/3.0.8/pki/issued/server.crt
key /etc/openvpn/3.0.8/pki/private/server.key  # This file should be kept secret
dh /etc/openvpn/3.0.8/pki/dh.pem
plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.8.0.0 255.255.255.0"
push "route 172.25.217.0 255.255.255.0"
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 223.5.5.5"
client-to-client
keepalive 10 120
tls-auth /etc/openvpn/3.0.8/ta.key 0 # This file is secret
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log         openvpn.log
log-append  openvpn.log
verb 3
explicit-exit-notify 0
client-cert-not-required
username-as-common-name
duplicate-cn

client.ovpn

client
proto tcp
dev tun
auth-user-pass
remote 8.*.*.171 1194
ca ca.crt
key-direction 1
remote-cert-tls server
cipher AES-256-CBC
auth-nocache
persist-tun
persist-key
comp-lzo
verb 3
mute 10
<ca>
-----BEGIN CERTIFICATE-----
MIIDNTCCAh2gAwIBAgIJAKeN1ALXfJYVMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV
BAMMC0Vhc3ktUlNBIENBMB4XDTIxMDcyMDEyMTgzOVoXDTMxMDcxODEyMTgzOVow
FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCahHWvjuMvtaCvTHR1RrTx4MzBgIUktrKvkwo8yTNpicKmI29tW7fo
s9wZa1J+gZo4cUiucCJnDIip7GOpTtf7Dn+p64uFJo1roC+CqIy2v4cxGYFDBcAm
Ph78ZPAWTzrTE0dtzH3lVxenzi+h6w8pI/NHaHV+JGVcoMCHb3bWTLVp2akX8TrQ
wrkaEV6eoPdFwoC7vAmwVzvcELTfd1t661U1DEVeL8p2WcjjHX9RiICK+bD2+BP5
tBKrEbav3VbttSsf8yujwae1ay0G6GouuNwAycFKZ5VBOTrjlVgNHoc+j7HNu/x8
FSdQlzHFD39Ks2CHwCgv/bz74kCIN2MtAgMBAAGjgYUwgYIwHQYDVR0OBBYEFCz3
05mFzd4tlwuO/1SmWO27vS3FMEYGA1UdIwQ/MD2AFCz305mFzd4tlwuO/1SmWO27
vS3FoRqkGDAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQYIJAKeN1ALXfJYVMAwGA1Ud
EwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBJQCbPDSiC
0AZ5PDl//Rkj+EhMSlBsJlOKUp0lwSnc+CbJmRlr51ToY3pT9oqNBSeznHkxWCIZ
0rOFBHeMzcAuYh7llSihWm9PcxoVRVOSSIqkH2PPx4OgNX+2/73JuZmIkc7FlnGr
X5LR2GTKXqUbbuNuaySDuq+hP53DE5kRNdoNjytMgA8j6W9r3qv8WGPno21O8Eaj
bc2PUX8OL2ltlPrWIgOUkj8Cq03mHJJD1o6rq3I2o6rezm5Tl1NcQ+5lgmMOKE7o
d8VhiUVTEp5kbnYBWfbjAz1H1OtyYr2VYUUYCuD1jPaPuek8BsM10uQk7ngCEcLr
WWkvOtRY/glO
-----END CERTIFICATE-----
</ca>
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
6f11050d42e2fb61e7ac248e1a37ddda
08a0d3b6c58eb7fd81956926257d3f19
3346b27050551cf35df03a587c59e2b3
f583d967dd1095da0ab15efa7934f948
d06ae2f46c1dca2968539037525aab3e
e276b3f1f53005b14fa85a4b32a08f3c
2c4e4f3478981cb798c523a6c0ef1eee
73510a0cd9237be41629a7cc7148fdf0
0edc4c62490124f5f4a01102174406a8
d984d057946d1bcb04c3990cb1b32667
6305e7a79633fb9d1a8b1229724edc72
d6bf8797cd07abec770d380e2520fd6d
ed6af291d7c852e75bae739a3b8a8b13
6422e2b02f869d9d5f2f3330249a189e
a0eb57ccf2e6f21aec6719b1f1a3c4e2
030b71c722423f4d42024b872c30d213
-----END OpenVPN Static key V1-----
</tls-auth>

8.2openvpn登录测试

参照《centos7 搭建openvpn-账号密码验证》

9.遗留问题

1.Simultaneous-Use 1(限制账号只能1人使用)不生效,网上说2.*版本的freeradius有select 的bug,但是当前版本3.*还是不生效,不知道什么原因

2.其他功能还在验证

虽然有一些不尽人意的地方,但是能满足一些基本需求,暂时这样吧

最后的openvpn这么仓促,是因为服务器到期了哈哈哈哈,不过这之前是验证通过了。

热门文章

暂无图片
编程学习 ·

Java输出数组的内容

Java输出数组的内容_一万个小时-CSDN博客_java打印数组内容1. 输出内容最常见的方式// List<String>类型的列表List<String> list new ArrayList<String>();list.add("First");list.add("Second");list.add("Third");list.ad…
暂无图片
编程学习 ·

母螳螂的“魅惑之术”

在它们对大蝗虫发起进攻的时候&#xff0c;我认认真真地观察了一次&#xff0c;因为它们突然像触电一样浑身痉挛起来&#xff0c;警觉地面对限前这个大家伙&#xff0c;然后放下自己优雅的身段和祈祷的双手&#xff0c;摆出了一个可怕的姿势。我被眼前的一幕吓到了&#xff0c;…
暂无图片
编程学习 ·

疯狂填词 mad_libs 第9章9.9.2

#win7 python3.7.0 import os,reos.chdir(d:\documents\program_language) file1open(.\疯狂填词_d9z9d2_r.txt) file2open(.\疯狂填词_d9z9d2_w.txt,w) words[ADJECTIVE,NOUN,VERB,NOUN] str1file1.read()#方法1 for word in words :word_replaceinput(fEnter a {word} :)str1…
暂无图片
编程学习 ·

HBASE 高可用

为了保证HBASE是高可用的,所依赖的HDFS和zookeeper也要是高可用的. 通过参数hbase.rootdir指定了连接到Hadoop的地址,mycluster表示为Hadoop的集群. HBASE本身的高可用很简单,只要在一个健康的集群其他节点通过命令 hbase-daemon.sh start master启动一个Hmaster进程,这个Hmast…
暂无图片
编程学习 ·

js事件操作语法

一、事件的绑定语法 语法形式1 事件监听 标签对象.addEventListener(click,function(){}); 语法形式2 on语法绑定 标签对象.onclick function(){} on语法是通过 等于赋值绑定的事件处理函数 , 等于赋值本质上执行的是覆盖赋值,后赋值的数据会覆盖之前存储的数据,也就是on…
暂无图片
编程学习 ·

Photoshop插件--晕影动态--选区--脚本开发--PS插件

文章目录1.插件界面2.关键代码2.1 选区2.2 动态晕影3.作者寄语PS是一款栅格图像编辑软件&#xff0c;具有许多强大的功能&#xff0c;本文演示如何通过脚本实现晕影动态和选区相关功能&#xff0c;展示从互联网收集而来的一个小插件&#xff0c;供大家学习交流&#xff0c;请勿…
暂无图片
编程学习 ·

vs LNK1104 无法打开文件“xxx.obj”

写在前面&#xff1a; 向大家推荐两本新书&#xff0c;《深度学习计算机视觉实战》和《学习OpenCV4&#xff1a;基于Python的算法实战》。 《深度学习计算机视觉实战》讲了计算机视觉理论基础&#xff0c;讲了案例项目&#xff0c;讲了模型部署&#xff0c;这些项目学会之后可以…
暂无图片
编程学习 ·

工业元宇宙的定义与实施路线图

工业元宇宙的定义与实施路线图 李正海 1 工业元宇宙 给大家做一个关于工业元宇宙的定义。对于工业&#xff0c;从设计的角度来讲&#xff0c;现在的设计人员已经做到了普遍的三维设计&#xff0c;但是进入元宇宙时代&#xff0c;就不仅仅只是三维设计了&#xff0c;我们的目…
暂无图片
编程学习 ·

【leectode 2022.1.15】完成一半题目

有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例 1&#xff1a…
暂无图片
编程学习 ·

js 面试题总结

一、js原型与原型链 1. prototype 每个函数都有一个prototype属性&#xff0c;被称为显示原型 2._ _proto_ _ 每个实例对象都会有_ _proto_ _属性,其被称为隐式原型 每一个实例对象的隐式原型_ _proto_ _属性指向自身构造函数的显式原型prototype 3. constructor 每个prot…
暂无图片
编程学习 ·

java练习代码

打印自定义行数的空心菱形练习代码如下 import java.util.Scanner; public class daYinLengXing{public static void main(String[] args) {System.out.println("请输入行数");Scanner myScanner new Scanner(System.in);int g myScanner.nextInt();int num g%2;//…
暂无图片
编程学习 ·

RocketMQ-什么是死信队列?怎么解决

目录 什么是死信队列 死信队列的特征 死信消息的处理 什么是死信队列 当一条消息初次消费失败&#xff0c;消息队列会自动进行消费重试&#xff1b;达到最大重试次数后&#xff0c;若消费依然失败&#xff0c;则表明消费者在正常情况下无法正确地消费该消息&#xff0c;此时…
暂无图片
编程学习 ·

项目 cg day04

第4章 lua、Canal实现广告缓存 学习目标 Lua介绍 Lua语法 输出、变量定义、数据类型、流程控制(if..)、循环操作、函数、表(数组)、模块OpenResty介绍(理解配置) 封装了Nginx&#xff0c;并且提供了Lua扩展&#xff0c;大大提升了Nginx对并发处理的能&#xff0c;10K-1000K Lu…
暂无图片
编程学习 ·

输出三角形

#include <stdio.h> int main() { int i,j; for(i0;i<5;i) { for(j0;j<i;j) { printf("*"); } printf("\n"); } }
暂无图片
编程学习 ·

stm32的BOOTLOADER学习1

序言 最近计划学习stm32的BOOTLOADER学习,把学习过程记录下来 因为现在网上STM32C8T6还是比较贵的,根据我的需求flash空间小一些也可以,所以我决定使用stm32c6t6.这个芯片的空间是32kb的。 #熟悉芯片内部的空间地址 1、flash ROM&#xff1a; 大小32KB&#xff0c;范围&#xf…
暂无图片
编程学习 ·

通过awk和shell来限制IP多次访问之学不会你打死我

学不会你打死我 今天我们用shell脚本&#xff0c;awk工具来分析日志来判断是否存在扫描器来进行破解网站密码——限制访问次数过多的IP地址&#xff0c;通过Iptables来进行限制。代码在末尾 首先我们要先查看日志的格式&#xff0c;分析出我们需要筛选的内容&#xff0c;日志…
暂无图片
编程学习 ·

Python - 如何像程序员一样思考

在为计算机编写程序之前&#xff0c;您必须学会如何像程序员一样思考。学习像程序员一样思考对任何学生都很有价值。以下步骤可帮助任何人学习编码并了解计算机科学的价值——即使他们不打算成为计算机科学家。 顾名思义&#xff0c;Python经常被想要学习编程的人用作第一语言…
暂无图片
编程学习 ·

蓝桥杯python-数字三角形

问题描述 虽然我前后用了三种做法&#xff0c;但是我发现只有“优化思路_1”可以通过蓝桥杯官网中的测评&#xff0c;但是如果用c/c的话&#xff0c;每个都通得过&#xff0c;足以可见python的效率之低&#xff08;但耐不住人家好用啊&#xff08;哭笑&#xff09;&#xff09…