Linux——系统安全及应用
目录
一:账号安全控制
1,基本安全措施
系统账号清理
密码安全控制
命令历史,自动注销
2,用户切换与提权
su命令的用法
PAM认证
3,sudo命令——提升执行权限
在配置文件/etc/sudoers中添加授权
通过sudo执行特权命令
启用sudo日志
二:系统引导和登录控制
1,限制更改GRUB引导参数
三:弱口令检测,端口扫描
1,弱口令检测——john the Ripper
下载并安装john the Ripper
检测弱口令账号
使用密码字典文件
2,网络扫描——NMAP
安装NMAP软件包
扫描语法及类型
扫描操作案例
一:账号安全控制
用户账号是计算机使用者的身份凭证或标识,每个要访问系统资源的人,必须凭借其用户账号才能进入计算机。在 Linux 系统中,提供了多种机制来确保用户账号的正当、安全使用。
核心目标
防止未授权访问:确保只有合法用户能登录账号。
保护数据安全:避免敏感信息(如个人数据、交易记录)泄露或被篡改。
降低风险:防范钓鱼攻击、暴力破解、社会工程学等威胁。
主要措施
身份验证 | 强密码策略:要求密码长度、复杂度(大小写字母、数字、符号),并定期更换。 |
权限管理 | 最小权限原则:用户仅获取完成工作所需的最低权限。 |
行为监控与防御 | 异常登录检测:识别非常用设备、陌生IP地址或频繁登录失败行为。 |
数据保护 | 加密存储:密码等敏感信息通过哈希算法(如bcrypt)加密,避免明文存储。 |
账户恢复与锁定 | 备用验证方式:绑定备用邮箱、手机号或安全问题用于找回账号。 |
安全策略与教育 | 定期更新策略:根据新威胁(如AI钓鱼攻击)调整防护规则。 |
1,基本安全措施
-
系统账号清理
在 Linux 系统中,除了用户手动创建的各种账号之外,还包括随系统或程序安装过程而生成的其他大量账号。除了超级用户 root 之外,其他大量账号只是用来维护系统运作、启动或保持服务进程,一般是不允许登录的,这些用户账号的登录shell通常是/sbin/nologin,因此也称为非登录用户账号。
使用以下命令查看非登录账号:
对于 Linux 服务器中长期不用的用户账号,若无法确定是否应该删除,可以暂时将其锁定。例如,若要锁定、解锁名为 zhangsan 的用户账号,可以执行以下操作(passwd、usermod 命令都可用来锁定、解锁账号)。
[root@localhost /]# usermod -L zhangsan ##使用usermod命令锁定账号
[root@localhost /]# passwd -S zhangsan
zhangsan LK 2025-04-21 0 99999 7 -1 (密码已被锁定。)[root@localhost /]# passwd -l zhangsan ##使用passwd命令锁定账户
锁定用户 zhangsan 的密码 。
passwd: 操作成功[root@localhost /]# passwd -S zhangsan
zhangsan LK 2025-04-21 0 99999 7 -1 (密码已被锁定。)
如果服务器中的用户账号已经固定,不再进行更改,添加账户等,还可以采取锁定账号配置文件的方法。使用chattr 命令,分别结合“+i”“-i”选项来锁定、解锁文件,使用 lsattr 命令可以査看文件锁定情况。
[root@localhost /]# chattr +i /etc/passwd /etc/shadow ##锁定文件
[root@localhost /]# lsattr /etc/passwd /etc/shadow ##查看文件状态(为锁定)
----i---------e------- /etc/passwd
----i---------e------- /etc/shadow[root@localhost /]# useradd aaa ##创建用户发现无法创建
useradd:无法打开 /etc/passwd[root@localhost /]# chattr -i /etc/passwd /etc/shadow ##解锁文件
[root@localhost /]# lsattr /etc/passwd /etc/shadow ##查看文件状态(为解锁)
--------------e------- /etc/passwd
--------------e------- /etc/shadow
-
密码安全控制
在不安全的网络环境中,为了降低密码被猜出或被暴力破解的风险,用户应养成定期更改密码的习惯,避免长期使用同一个密码。管理员可以在服务器端限制用户密码的最大有效天数,对于密码已过期的用户,登录时将被要求重新设置密码,否则将拒绝登录。
[root@localhost /]# vim /etc/login.defs ##修改配置文件,用于为创建的用户
.....省略以上部分
PASS_MAX_DAYS 30 ##位于131行部分[root@localhost /]# useradd aaa ##创建aaa用户用于测试
[root@localhost /]# tail -2 /etc/shadow
zhanghsan:!:20199:0:99999:7:::
aaa:!:20199:0:30:7::: ##密码有效期以更改为30天
如果针对系统已经有的账户,可用使用以下命令更改密码有效期
[root@localhost /]# chage -M 20 zhangsan ##将zhagnsan用户密码有效期更改为20天[root@localhost /]# tail /etc/shadow
.....省略以上部分
zhangsan:!:20199:0:20:7::: ##查看zhangsan密码有效期
在某些特殊情况下,如要求批量创建的用户初次登录时必须自设密码,根据安全规划统一要求所有用户更新密码等,可以由管理员执行强制策略,以便用户在下次登录时必须更改密码。例如,执行以下操作可强制要求用户wangwu下次登录时重设密码。
[root@localhost /]# useradd lisi ##创建lisi用户[root@localhost /]# passwd lisi ##修改lisi用户密码
更改用户 lisi 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost /]# chage -d 0 lisi ##设置lisi用户下次登陆必须修改密码
-
命令历史,自动注销
She11 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。
历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。
[root@localhost /]# vim /etc/profile ##修改配置文件(只适用于新登录的用户)
.....省略以上部分内容
HISTSIZE=10 ##设置最多只记录10条历史命令[root@localhost /]# export HISTSIZE=10 ##设置变量(适用于当前用户)[root@localhost /]# history ##只记录最新的10条历史记录141 chage -d 0 lisi142 su - lisi143 vim /etc/profile144 history 145 vim /etc/profile146 source /etc/profile147 history 148 vim /etc/profile149 export HISTSIZE=10150 history history -c ##使用此命令还可以清除所有的历史记录
Bash 终端环境中,还可以设置一个闲置超时时间,当超过指定的时间没有任何输入时即自动注销终端,这样可以有效避免当管理员不在时其他人员对服务器的误操作风险。闲置超时由变量 TMOUT 来控制,默认单位为秒(s)。
[root@localhost /]# vim /etc/profile ##适用于新登录用户
....省略以上部分内容
export TMOUT=300 ##末尾添加闲置时间超过300秒,则退出终端[root@localhost /]# export TMOUT=600 ##适用于当前用户(单位秒)
2,用户切换与提权
Linux 系统为我们提供了 su、sudo 两种命令,其中 su 命令主要用来切换用户,而 sudo 命令用
来提升执行权限。
-
su命令的用法
使用 su 命令,可以切换为指定的另一个用户,从而具有该用户的所有权限。当然,切换时需要对目标用户的密码进行验证(从 root 用户切换为其他用户时除外)。例如,创建zhangsan用户,并从root用户切换到zhangsan用户。
[root@localhost ~]# useradd zhangsan ##创建zhangsan用户并设置密码
[root@localhost ~]# passwd zhangsan
更改用户 zhangsan 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost ~]# su - zhangsan ##使用su命令切换到zhangsan用户 选项-表示切换到自己的家目录
[zhangsan@localhost ~]$
默认情况下,任何用户都允许使用 su 命令,从而有机会反复尝试其他用户(如 root)的登录密码,这样带来了安全风险。为了加强 su 命令的使用控制,可以借助于 pam whee1认证模块,只允许极个别用户使用 su 命令进行切换。可以将用户加入到wheel组。
wheel
组:是一个特殊的用户组,主要用于管理系统管理员权限(即通过 sudo
命令获得 root 权限)。它的核心作用是控制哪些普通用户可以通过 sudo
执行特权命令。
##将zhangsan用户加入到wheel,lisi用户则不加入
[root@localhost ~]# su - lisi ##切换到lisi用户[lisi@localhost ~]$ su - root ##由于lisi用户没有加入到wheel组,无法切换到root用户
密码:
su: 权限被拒绝[root@localhost ~]# gpasswd -a zhangsan wheel ##将zhangsan用户加入到wheel组
正在将用户“zhangsan”加入到“wheel”组中[root@localhost ~]# grep wheel /etc/group ##确认wheel组内的成员
wheel:x:10:zhangsan[zhangsan@localhost ~]$ su - root ##由于zhangsan用户在wheel组内,可以切换到root用户
密码:
[root@localhost ~]#
-
PAM认证
PAM(Pluggable Authentication Modules),是 Linux 系统可插拔认证模块,是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux 服务器普遍使用的认证方式。PAM 提供了对所有服务进行认证的中央机制,适用于 login,远程登录(telnet,rlogin,fsh,ftp),su 等应用程序中。系统管理员通过PAM 配置文件来制定不同应用程序的不同认证策略。PAM认证原理如下:
- PAM 认证一般遵循的顺序:Service(服务)→PAM(配置文件)→pam*.so;
- PAM 认证首先要确定哪一项服务,然后加载相应的 PAM 的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/1ib/security 下)进行安全认证;
- 用户访问服务器的时候,服务器的某一个服务程序把用户的请求发送到 PAM 模块进行认证。不同的应用程序所对应的 PAM 模块也是不同的。
如果想査看某个程序是否支持 PAM 认证,可以用 1s 命令进行査看,执行以下命令可以査看 su是否支持 PAM 模块认证。
[root@localhost /]# cat /etc/pam.d/su
....省略以上内容
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
- 每一行都是一个独立的认证过程;
- 每一行可以区分为三个字段:认证类型,控制类型,PAM 模块及其参数
- 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证
- 帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等;
- 密码管理(password management):主要是用来修改用户的密码
- 会话管理(session management):主要是提供对会话的管理和记账。
- 控制类型也可以称做 Control Flags,用于 PAM 验证类型的返回结果。
1,required 验证失败时仍然继续,但返回Fai1
2,requisite 验证失败则立即结束整个验证过程,返回 Fai1
3,sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续
4,optiona1 不用于验证,只是显示信息(通常用于 session 类型)
3,sudo命令——提升执行权限
通过 su 命令可以非常方便地切换为另一个用户,但前提条件是必须知道目标用户的登录密码。例如,若要从 jerry 用户切换为 root 用户,必须知道 root 用户的密码。对于生产环境中的 Linux 服务器每多一个人知道特权密码,其安全风险也就增加一分。使用 sudo 命令就可以提升执行权限。不过,需要由管理员预先进行授权,指定允许哪些用户以超级用户(或其他普通用户)的身份来执行哪些命令。
-
在配置文件/etc/sudoers中添加授权
sudo 机制的配置文件为/etc/sudoers,文件的默认权限为 440,需使用专门的 visudo 工具进行
编辑。授权配置文件主要包括用户,主机,命令三部分:
用户(user):直接授权指定的用户名,或采用“%组名”的形式(授权一个组的所有用户)。
主机(MACHINE):使用此配置文件的主机名称。此部分主要是方便在多个主机间共用同一份sudoers 文件,一般设为 localhost 或者实际的主机名即可。
命令(COMMANDS):允许授权的用户通过 sudo 方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号“,”进行分隔。
例如,授权用户lisi能够执行 ifconfig 命令来修改 IP 地址。
[root@localhost /]# visudo ##修改visudo文件,末尾添加
lisi localhost=ifconfig
-
通过sudo执行特权命令
对于已获得授权的用户,通过 sudo 方式执行特权命令时,只需要将正常的命令行作为 sudo 命令的参数即可。由于特权命令程序通常位于/sbin、/usr/sbin 等目录下,普通用户执行时应使用绝对路径。以下操作验证了使用 sudo 方式执行命令的过程。
[lisi@localhost ~]$ /sbin/ifconfig ens160:0 192.168.10.123/24 ##未使用sudo会报错
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
SIOCSIFNETMASK: Operation not permitted[lisi@localhost ~]$ sudo /sbin/ifconfig ens160:0 192.168.10.123/24 ##使用sudo则添加成功
[lisi@localhost ~]$ ifconfig
ens160:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.123 netmask 255.255.255.0 broadcast 192.168.10.255ether 00:0c:29:64:26:a0 txqueuelen 1000 (Ethernet)
-
启用sudo日志
[root@localhost log]# visudo ##在文件中添加此内容
....省略以上内容
Defaults logfile=/var/log/sudo.log[lisi@localhost ~]$ sudo /sbin/ifconfig ens160:0 192.168.10.123/24
[lisi@localhost ~]$ ifconfig
ens160:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.123 netmask 255.255.255.0 broadcast 192.168.10.255ether 00:0c:29:64:26:a0 txqueuelen 1000 (Ethernet)
##lisi用户sudo命令添加网卡信息[root@localhost log]# cat sudo.log ##使用root用户查看日志信息
Apr 21 17:17:02 : lisi : TTY=pts/0 ; PWD=/home/lisi ; USER=root ;COMMAND=/sbin/ifconfig ens160:0 192.168.10.123
二:系统引导和登录控制
在互联网环境中,大部分服务器是通过远程登录的方式来进行管理的,而本地引导和终端登录过程往往容易被忽视,从而留下安全隐患。特别是当服务器所在的机房环境缺乏严格、安全的管控制度时,如何防止其他用户的非授权介入就成为必须重视的问题。
1,限制更改GRUB引导参数
从系统安全的角度来看如果任何人都能够修改 GRUB 引导参数,对服务器本身显然是一个极大的威胁。为了加强对引导过程的安全控制,可以为 GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。为 GRUB 菜单设置的密码建议采用“grub2-mkpasswd-pbkdf2”命令生成,表现为经过 PBKDF2 算去加密的字符串,安全性更好。生成密码后在/etc/grub.d/08 header 配置文件中,添加对应的用户、密码等配置。
将黑色部分的密码复制到/etc/grub.d/01_users并对此文件进行修改。
使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
通过上述配置,重新开机进入 GRUB 菜单时,按E键将无法修改引导参数。若要获得编辑权限,必须根据提示输入正确的 GRUB 密码,
三:弱口令检测,端口扫描
在 Internet 环境中,过于简单的口令是服务器面临的最大风险。尽管大家都知道设置一个更长更复杂的口令会更加安全,但总是会有一些用户因贪图方便而采用简单、易记的口令字串。对于任何一个承担着安全责任的管理员,及时找出这些弱口令账号是非常必要的,这样便于采取进一步的安全措施(如提醒用户重设更安全的口令)。
1,弱口令检测——john the Ripper
John the Ripper 是一款开源的密码破解工具,能够在已知密文的情况下快速分析出明文的密码字串,支持 DES、MD5 等多种加密算法,而且允许使用密码字典(包含各种密码组合的列表文件)来进行暴力破解。通过使用 John the Ripper,可以检测 Linux/UNIX 系统用户账号的密码强度。
-
下载并安装john the Ripper
John the Ripper 的官方网站是 http://www.openwa11.com/john/,通过该网站可以获取稳定版
源码包,如 john-1.8.0.tar.gz。
[root@localhost ~]# ls ##准备john压缩包
anaconda-ks.cfg john-1.8.0.tar.gz pass.list[root@localhost ~]# tar zxvf john-1.8.0.tar.gz ##压缩john文件[root@localhost src]# dnf -y install gcc ##安装gcc软件包
[root@localhost src]# make clean linux-x86-64 ##在john的src目录下进行make安装[root@localhost john-1.8.0]# cd run ##切换搭配john的run目录下[root@localhost run]# ls ##可以看到run目录下包括可执行的程序john
ascii.chr john lm_ascii.chr makechr relbench unique
digits.chr john.conf mailer password.lst unafs unshadow
-
检测弱口令账号
在安装有 John the Ripper 的服务器中,可以直接对/etc/shadow 文件进行检测。对于其他 Linux服务器,可以对 shadow 文件进行复制,并传递给 john 程序进行检测。只需执行 run 目录下的 john 程序,将待检测的 shadow 文件作为命令行参数,就可以开始弱口令分析了。
[root@localhost ~]# cp /etc/shadow /root/shadow.txt ##准备要破解的文件
[root@localhost ~]# useradd lisi ##准备两个用户
[root@localhost ~]# useradd zhangsan 密码分别为lisi(123456)zhangsan(111) [root@localhost ~]# passwd lisi
更改用户 lisi 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost ~]# passwd zhangsan
更改用户 zhangsan 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
在执行过程中,分析出来的弱口令账号将即时输出,第一列为密码字串,第二列的括号内为相应的用户名(如用户lisi的密码为“123456”)。默认情况下,john 将针对常见的弱口令设置特点,尝试破解已识别的所有密文字串,如果检测的时间太长,可以按 Ctr1+C组合键强行终止。破解出的密码信息自动保存到 john.pot 文件中,可以结合“--show”选项进行査看。
[root@localhost run]# ./john /root/shadow.txt ##使用此命令对文件进行破解
Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
123456 (lisi)
111 (zhangsan) ##可以看到zhangsan,lisi用户密码已被破解出来
2g 0:00:03:27 3/3 0.009639g/s 908.7p/s 909.2c/s 909.2C/s abilo1..11341
Use the "--show" option to display all of the cracked passwords reliably
Session completed[root@localhost run]# ./john --show /root/shadow.txt ##查看已破解出的账号列表
lisi:123456:20148:0:99999:7:::
zhangsan:111:20148:0:99999:7:::2 password hashes cracked, 0 left
[root@localhost run]#
-
使用密码字典文件
对于密码的暴力破解,字典文件的选择很关键。只要字典文件足够完整,密码破解只是时间上的问题。因此,“什么样的密码才足够强壮”取决于用户的承受能力,有人认为超过 72 小时仍无法破解的密码才算安全,也可能有人认为至少暴力分析一个月仍无法破解的密码才足够安全,首先要准备密码字典文件,用户可以在字典文件中添加更多的密码组合,也可以直接使用更加完整的其他字典文件。执行john 程序时,可以结合“--wordlist=”选项来指定字典文件的位置,以便对指定的密码文件进行暴力分析。
[root@localhost ~]# useradd lisi ##准备两个用户
[root@localhost ~]# useradd zhangsan 密码分别为lisi(123456)zhangsan(111) [root@localhost ~]# passwd lisi
更改用户 lisi 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost ~]# passwd zhangsan
更改用户 zhangsan 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost ~]# ls ##准备pass.list密码文件并添加lisi,zhangsan用户的密码
anaconda-ks.cfg john-1.8.0 john-1.8.0.tar.gz pass.list pass.txt shadow.txt[root@localhost run]# :>john.pot ##清空已破解的账户列表,以便重新分析[root@localhost run]# ./john --wordlist=/root/pass.list /root/shadow.txt
Loaded 2 password hashes with 2 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
111 (zhangsan)
123456 (lisi)
2g 0:00:00:00 100% 9.523g/s 457.1p/s 914.2c/s 914.2C/s 1Password..fernando
Use the "--show" option to display all of the cracked passwords reliably
Session completed
##再次进行破解会发现速度很快
2,网络扫描——NMAP
NMAP 是一个强大的端口扫描类安全评测工具,官方站点是 http://nmap.org/。NMAP 被设计为检测众多主机数量的巨大网络,支持 ping 扫描、多端口检测、0S 识别等多种技术。使用 NMAP 定期扫描内部网络,可以找出网络中不可控的应用服务,及时关闭不安全的服务,减小安全风险。
-
安装NMAP软件包
使用dnf方式进行安装。
[root@localhost run]# dnf -y install nmap
-
扫描语法及类型
NMAP 的扫描程序位于/usr/bin/nmap 目录下,使用时基本命令格式如下所示:
nmap[扫描类型][选项]<扫描目标...>
其中,扫描目标可以是主机名、IP 地址或网络地址等,多个目标以空格分隔;常用的选项有“-p”“-n”,分别用来指定扫描的端口、禁用反向 DNS 解析(以加快扫描速度);扫描类型决定着检测的方式,也直接影响扫描的结果,比较常用的几种扫描类型如下:
类型 | 作用 |
-sS | TCP SYN 扫描,只向目标发出 SN 数据包,如果收到 SYN/ACK 响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。 |
-sT | TCP 连接扫描,这是完整的 TCP 扫描方式,用来建立一个 TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。 |
-sF | TCP FIN 扫描,开放的端口会忽略这种数据包,关闭的端口会回应 RST 数据包。许多防火墙只对 SYN 数据包进行简单过滤,而忽略了其他形式的 TCP 攻击包。这种类型的扫描可间接检测防火墙的健壮性。 |
-sU | UDP 扫描,探测目标主机提供哪些 UDP 服务,UDP 扫描的速度会比较慢 |
-sP | ICMP 扫描,类似于 ping 检测,快速判断目标主机是否存活,不做其他扫描。 |
-P0 | 跳过 ping 检测,这种方式认为所有的目标主机是存活的,当对方不响应 ICMP 请求时,使用这种方式可以避免因无法 ping 通而放弃扫描。 |
-
扫描操作案例
检查开放了哪些常用的端口
检查有哪些主机提供FTP服务
检查指定网段中有哪些存货的主机
相关文章:
Linux——系统安全及应用
目录 一:账号安全控制 1,基本安全措施 系统账号清理 密码安全控制 命令历史,自动注销 2,用户切换与提权 su命令的用法 PAM认证 3,sudo命令——提升执行权限 在配置文件/etc/sudoers中添加授权 通过sudo执行…...
随机面试--<二>
编译安装软件的流程 1-安装所需源代码 2-配置安装环境 3-进行相关设置 4-编译 5-安装 nginx安装新模块的流程 1-准备与原nginx版本相同的源码包,准备模块安装包 2-准备编译安装环境 3-配置参数 来源于nginx -V配置原模块 以及--add-module 增加模块 4-mak…...
LeetCode面试经典 150 题(Java题解)
一、数组、字符串 1、合并两个有序数组 从后往前比较,这样就不需要使用额外的空间 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int l mn-1, i m-1, j n-1;while(i > 0 && j > 0){if(nums1[i] > nums2[j])…...
【技术追踪】Differential Transformer(ICLR-2025)
Differential Transformer:大语言模型新架构, 提出了 differential attention mechanism,Transformer 又多了一个小 trick~ 论文:Differential Transformer 代码:https://github.com/microsoft/unilm/tree/master/Diff…...
报告系统状态的连续日期 mysql + pandas(连续值判断)
本题用到知识点:row_number(), union, date_sub(), to_timedelta()…… 目录 思路 pandas Mysql 思路 链接:报告系统状态的连续日期 思路: 判断连续性常用的一个方法,增量相同的两个列的差值是固定的。 让日期与行号 * 天数…...
【C++类和数据抽象】类的作用域
目录 一、类的作用域基本概念 1.1 什么是类的作用域 1.2 作用域层次体系 1.3 类作用域的特点 1.4 基本访问规则 二、访问控制三剑客 2.1 public:开放接口 2.2 private:数据封装 2.3 protected:继承通道 2.4 跨作用域访问示例 三…...
【区块链技术解析】从原理到实践的全链路指南
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:创建简单区块链案例2:工作…...
LangGraph(一)——QuickStart样例中的第一步
目录 1. LangGraph简介2. 使用uv初始化项目3. 官网QuickStart——第一步:构建一个ChatBot(仅关注Graph的构建即可)3.1 配置大模型API_KEY3.2 初始化StateGraph3.3 添加chatbot node3.4 添加edges3.5 可视化StateGraph3.6 构建聊天循环 参考 1. LangGraph简介 LangGr…...
spring security +kotlin 实现oauth2.0 认证
基于OAuth 2.0的认证功能实现(Kotlin Spring Security) 以下是使用 AbstractAuthenticationProcessingFilter、AuthenticationProvider、AbstractAuthenticationToken 和 AuthenticationSuccessHandler 实现 OAuth 2.0 认证的完整代码设计。 1. 自定义…...
服务器监控软件推荐
以下是几款常用的服务器监控软件推荐,涵盖开源和商业方案,适用于不同规模和需求: 一、开源免费方案 Prometheus Grafana 特点:时序数据库 可视化仪表盘,支持多维度监控和告警。适用场景:云原生、Kubernet…...
在kali中安装AntSword(蚁剑)
步骤一、下载压缩包 源码:https://github.com/AntSwordProject/antSword,下载压缩包。 加载器:https://github.com/AntSwordProject/AntSword-Loader,根据系统选择压缩包(kali选择AntSword-Loader-v4.0.3-linux-x64&…...
【论文速递】2025年06周 (Robotics/Embodied AI/LLM)
目录 SMOLLM2:当Smol变得大 - 以数据为中心的小语言模型英文摘要中文摘要 OmniHuman-1:重新考虑一阶段的人类动画模型的扩展英文摘要中文摘要 S1:简单的测试时间缩放英文摘要中文摘要 直接对齐算法间的差异日渐模糊英文摘要中文摘要 VideoJAM…...
相机标定(输出相机内参和畸变参数)
相机标定 这里我用笔记本电脑自带的摄像头进行相机标定 仅作示例,实际工程中要用对应的摄像头进行标定 同时代码也要相应的修改,不过修改的主要是相机的初始化 粗略的说就是打开相机那部分要修改(依据实际情况相应修改) 最终的结果…...
Linux-编辑器的使用
实验三 Linux编辑器的使用 一、实验目的 学习使用vi编辑器建立、编辑和保存文本文件。 二、实验内容 1.进入和退出vi。 2.Vi不同工作模式的切换。 3.文本文件基本编辑(光标移动、文本输入、复制、移动、删除、查找、替换)。 4.文本文件的保存和备份。…...
Android开发中的复制和粘贴
Android 提供了一个强大的基于剪贴板的框架,用于复制和粘贴。它支持简单和复杂的数据类型,包括文本字符串、复杂数据结构、文本和二进制流数据,以及应用资源。简单的文本数据直接存储在剪贴板中,而复杂的数据则存储为引用…...
使用 inobounce 解决 iOS 皮筋效果导致的无法下拉刷新
使用 inobounce 解决 iOS 皮筋效果导致的无法下拉刷新 在移动端 H5 页面开发中,iOS 设备的“皮筋效果”(Rubber Band Effect)是一个常见的挑战。当用户在页面顶部下拉或底部上拉时,iOS 会触发整个页面的回弹效果,这不…...
特征选择与类不平衡处理
特征选择与类不平衡处理技术 一、特征选择方法 1. 过滤法(Filter Methods) 原理: 基于统计学方法或特征本身的分布特性独立于模型进行特征筛选,通过计算特征与目标变量的相关性或特征的发散性进行排序选择。 典型方法…...
24、ASP.NET⻚⾯之间传递值的⼏种⽅式
1. QueryString(查询字符串) 描述:通过 URL 参数传递数据,例如 Page2.aspx?id123。 适用场景:简单、非敏感数据,页面跳转时使用。 2. Session(会话) 描述:在服务器端…...
【扩展卡尔曼滤波器实际运用案例】
扩展卡尔曼滤波器 算法描述实际案例 算法描述 考虑离散时间非线性动态系统 { x k 1 f k ( x k , w k ) z k h k ( x k , v k ) \left\{\begin{matrix} x_{k1}f_{k}(x_k,w_k)\\ z_{k}h_{k}(x_k,v_k) \end{matrix}\right. {xk1fk(xk,wk)zkhk(xk,vk) 其中是…...
Centos9 安装 nginx 及配置
1. 安装nginx 安装依赖软件,安装之前可以看一下是否已经安装过以下软件,dnf list installed | grep zlib dnf install gcc-c dnf install zlib dnf install pcre pcre-devel dnf install openssl openssl-devel下载nginx,这里是下载到opt文…...
总结设计测试用例的万能公式
现在有⼀款产品,要求我们对“⻔锁”设计测试⽤例,假如你是测试⼈员,你会怎么设计呢? 1 常规思考逆向思维发散性思维 设计测试⽤例的原则⼆: 1.测试⽤例的编写不仅应当根据有效和预料到的输⼊情况,⽽且也…...
Android RK356X TVSettings USB调试开关
Android RK356X TVSettings USB调试开关 平台概述操作-打开USB调试实现源码补充说明 平台 RK3568 Android 11 概述 RK3568 是瑞芯微(Rockchip)推出的一款高性能处理器,支持 USB OTG(On-The-Go)和 USB Host 功能。US…...
python生成动态库在c++中调用
一.Windows下生成动态库.pyd 在setup.py的同目录下使用python setup.py build_ext --inplace 二.在vscode的c中使用.pyd文件(动态库) 1)配置python的环境 python -c "import sys; print(sys.executable)" #确定python安装位置 2…...
大模型数据味蕾论
大模型数据味蕾论 大模型的成长路径:从婴儿到专家预训练数据的"四维口味"模型从文本到模型:数据处理的关键步骤"大模型数据味蕾论"结语 AI大模型就像一位厨师,预训练数据就是这位厨师的味蕾。 没有经过训练的味蕾&#x…...
网络编程4
day4 一、Modbus 1.分类 (1).Modbus RTU: 运行在串口上的协议,采用二进制表现形式以及紧凑型数据结构,通信效率高,应用广泛。(2).Modbus ASCII: 运行在串口上的协议,采用ASCII码传输,并且利用特殊字符作为其字节的开始…...
neo4j-community-3.5.5-unix.tar.gz安装
从官网找了下包,哎,奈何访问不了github,那就找镜像吧,哎,也是不通。 # docker search neo4j Error response from daemon: Get "https://index.docker.io/v1/search?qneo4j&n25": dial tcp 202.160.128.40:443: i…...
高防IP能抵御哪些类型的网络攻击?
高防IP(High Defense IP)是一种专门针对网络攻击设计的防护服务,主要通过流量清洗、协议分析、行为检测等技术抵御多种网络攻击。以下是其能防御的主要攻击类型及原理: 一、常见防御的攻击类型 DDoS攻击(分…...
动态监控进程
1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法: top [选项] 选项说明 ⭐️僵死进程:内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…...
你学会了些什么220622?--搭建UI自动化
jenkins访问地址:http://192.168.82.129:8080/ 账号密码:admin/a123456a ***** 什么是UI自动化** 使用工具或者脚本对需要测试的软件的前端界面在预设的条件下,在已有的测试数据下运行系统或者应用程序,并获取其前端页面UI显示的…...
深入理解自监督学习(Self-Supervised Learning):理论与实践
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4o-mini模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
时序逻辑入门指南:LTL、CTL与PTL的概念介绍与应用场景
引言 在计算机科学和形式化方法中,**时序逻辑(Temporal Logic)**是描述系统动态行为的核心工具,它允许我们形式化地表达“时间”相关的性质,例如“某事件最终会发生”或“系统始终满足安全条件”。其中,LTL(线性时序逻辑)、**CTL(计算树逻辑)和PTL(命题时序逻辑)*…...
Spring Boot 整合 JavaFX 核心知识点详解
1. 架构设计与集成模式 1.1 Spring Boot 与 JavaFX 的分层架构设计 Spring Boot 与 JavaFX 的整合需要精心设计的分层架构,以充分利用两个框架的优势。 标准分层架构 ┌────────────────────────────────────────────────…...
进程与线程:02 多进程图像
多进程图像的起源与核心地位 上节课我们开启了对操作系统核心概念——多进程图像的学习,探讨了其产生的原因。操作系统的核心职责之一是管理CPU,CPU作为实现取指执行的硬件自动化部件,只有执行取指操作(即取出并执行程序指令 &am…...
基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中,SIMMECHANICS是M…...
FreeRTOS互斥信号量解决优先级翻转实战教程
FreeRTOS互斥信号量解决优先级翻转实战教程 大家好!今天我们来深入探讨FreeRTOS中的优先级翻转问题,并通过互斥信号量来解决这个问题。上一篇文章我们已经了解了优先级翻转的现象,今天我们将动手实践,通过代码对比来直观感受互斥…...
Spark-SQL 四(实验)
用idea实验hive的常用代码 将数据放到项目的目录下 代码实现 运行结果: 实验 统计有效数据条数及用户数量最多的前二十个地址 将数据放到Spark-SQL/input目录下 代码实现: 运行结果:...
前端技术未来的发展趋势分析
以下是关于前端技术未来发展趋势的深度分析,结合行业动态和技术演进方向,从多个维度展开: 一、核心发展趋势 1. 框架融合与性能极致化 趋势:React/Vue/Solid 等框架在编译时优化(如React Forget编译器)和…...
字节扣子空间开启内测!附免费邀请码!
3月初,当Manus作为首个通用智能体横空出世时,整个科技圈都沸腾了。 当时我就预言过:这种创新产品要真正普及,还得看大厂动作(毕竟创业公司的资源有限啊)。 这不,字节跳动最近就悄悄放出了大招—…...
高并发场景下的淘宝 API 开发实践:商品数据实时采集与性能优化
在电商行业竞争激烈的当下,实时获取海量商品数据成为企业把握市场动态、制定精准策略的关键。然而,高并发场景下对淘宝 API 的调用极易引发性能瓶颈与稳定性问题。本文将围绕高并发场景下淘宝 API 开发,深入讲解商品数据实时采集的技术要点&a…...
如何将Qt程序打包成应用程序?
1、使用release模式,编译项目 2、新建一个文件夹(不要有中文路径),将刚才编译生成的可执行文件(.exe)放入新建的文件夹下。 可执行文件通常生成在项目目录下的构建文件夹中,如 build-项目名-套…...
AI重塑网络安全:机遇与威胁并存的“双刃剑”时代
一、引言 人工智能(AI)技术的迅猛发展,正在深刻改变网络安全行业的格局。从ChatGPT生成钓鱼邮件到AI驱动的漏洞挖掘,从零信任架构的普及到安全大模型的实战应用,AI既是攻击者的“新武器”,也是防御者的“新…...
c++基础·列表初始化
目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型(Aggregate Types)初始化 1. 聚合类型定义 2. 初始化…...
颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
文章目录 前言1. 安装Docker2. Go File使用演示3. 安装cpolar内网穿透4. 配置Go File公网地址5. 配置Go File固定公网地址 前言 在这个信息爆炸的时代,谁不曾遭遇过类似的窘境呢?试想,当你正于办公室中埋首案牍时,手机突然弹出一…...
目标检测中的损失函数(二) | BIoU RIoU α-IoU
BIoU来自发表在2018年CVPR上的文章:《Improving Object Localization With Fitness NMS and Bounded IoU Loss》 论文针对现有目标检测方法只关注“足够好”的定位,而非“最优”的框,提出了一种考虑定位质量的NMS策略和BIoU loss。 这里不赘…...
RS232 串行通信:C++ 实现指南
文章目录 一、RS232 简介1. 电气特性2. 传输速率3. 传输距离 二、在 C 中实现 RS232 通信1. Windows 平台(1)打开串行端口(2)配置串行通信参数(3)发送数据(4)接收数据(5&…...
电控---SWD协议
SWD协议是烧录调试常用的协议,本文对SWD协议进行了,覆盖物理层、协议层、寄存器结构、信号时序、安全特性、实际应用及最新发展趋势的讲解。 一、物理层架构与信号特性 1. 引脚定义与电气规范 核心引脚: SWDIO(双向数据线&…...
Linux系统下docker 安装 redis
docker安装最新版的redis 一、docker拉取最新版redis镜像 拉取镜像若没有指定版本,代表拉取最新版本 二、查询redis镜像 三、挂载配置文件 在docker容器内修改redis配置文件不方便,所以挂载配置文件,这样可以在外边修改redis配置 3.1 创建…...
第 2 篇:初探时间序列 - 可视化与基本概念
第 2 篇:初探时间序列 - 可视化与基本概念 (图片来源: Luke Chesser on Unsplash) 在上一篇《你好,时间序列!》中,我们了解了什么是时间序列数据以及学习它的重要性。现在,是时候卷起袖子,真正开始接触和探…...
适配器模式:化解接口不兼容的桥梁设计
适配器模式:化解接口不兼容的桥梁设计 一、模式核心:让不兼容的接口协同工作 在软件开发中,经常会遇到接口不兼容的情况:如旧系统提供的接口无法被新系统直接调用,或第三方库的接口与当前系统设计不匹配。适配器模式…...
科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%
4月21日盘后,AI龙头科大讯飞(002230.SZ)发布2024年报,公司全年实现营业收入233.43亿元,同比增长18.79%,同期归母净利润为5.6亿元。 公司核心赛道业务保持快速增长,消费者、教育、汽车、医疗业务…...