Linux常用命令之文件处理

本篇分享一下文件处理的相关常用命令。

cat命令——查看文件内容


语法:

cat   选项   文件

选项:

-n 输出行号
-b输出行号,并忽略空白行,统计的是非空白行数

常用操作:

[root@localhost ~]# cat /etc/passwd     //查看文件内容
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

[root@localhost ~]# cat >> /etc/fstab << EOF //追加内容到文件尾部

> /dev/sdb /data xfs defaults 0 0
> EOF
[root@localhost ~]# cat /dev/null > file.txt //清空文件内容

more命令——分页显示文件内容


cat命令是查看所有内容,对于内容较长的文件无法一屏显示所有内容,所以就需要分页显示内容,more命令就有这种分页显示功能。

常用操作:

[root@localhost ~]# more /var/log/messages      //分页查看

常用按键:

空格键查看下一页
回车键查看下一行
b键查看前一页
q键退出查看页面
/file查看包含file的内容

less命令——分页显示文件内容


less命令和more命令的功能相似,都是分页显示文件内容,但是less命令在交互界面有更灵活的操作

[root@localhost ~]# less /var/log/messages      //分页查看
空格键查看下一页
回车键查看下一行
b键查看前一页
q键退出查看页面
/字符串向下查看包含file的内容
?字符串向上搜索内容
n向后查找下一个匹配的文本
g移动到第一行
G移动到最后一行

总结下more 和 less的区别:

  • less可以按键盘上下方向键显示上下内容,more不能通过上下方向键控制显示
  • less不必读整个文件,加载速度会比more更快
  • less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容

head命令——显示文件内容头部


默认显示文件的前10行。

常用操作:

[root@localhost ~]# head /etc/passwd    //默认显示文件10行
[root@localhost ~]# head -n 20 /etc/passwd  //显示文件的前20行

tail命令——显示文件内容尾部

默认显示文件最后10行。

选项:

-f实时输出文件变化后追加的数据
-n <行数>指定显示行数

常用操作

[root@localhost ~]# tail -n 20 /var/log/messages    //显示文件的最后20行
[root@localhost ~]# tail -f /var/log/messages //动态追踪日志信息

cut命令——从文件中提取一段文字并输出


选项:

-c以字符为单位进行分割
-d自定义分隔符,默认以tab键为分隔符
-f指定显示哪个区域,常和-d使用

常用操作:

cut -c 2-10 test.txt   //剪切每行2-10位置的字符
cut -d :  -f 1  /etc/passwd     //指定以:作为分割符,-f指定显示第一个区域

split命令——分割文件


选项:

-l指定分割后文件的最大行数
-b
-d以数字为后缀

常用操作:

split -l  10  test.txt   new_         //每10行分割一次,分割的文件名以new_开头
split -l  10  -d  test.txt   new_     //参数-d使用数字后缀
split -b 500M -d   test.txt   new_    //每500M分割一次

paste命令——合并文件


-d    :指定合并的分隔符,默认是TAB

sort命令——文件排序


选项:

-n依照数值大小进行排序
-r倒序排序
-t指定分隔符
-k按指定区间排序

常用操作:

sort -n test.txt        //按照数值大小进行排序
sort -nr test.txt //sort默认按照从小到大排序,使用-r选项就可以实现从大到小
sort -t " " -k2 test.txt //以空格为分隔符,按照第二列进行排序

uniq命令——去除重复行


选项:

-c去除重复行,并计算每行出现的次数

常用操作:

uniq -c test.txt             sort -n test.txt | uniq -c   //结合sort使用,先排序后去重

wc命令——统计文件的行数、单词或字节数


选项:

-l统计行数
-c统计字节数
-w统计单词数
-L打印最长行的长度

常用操作:

[root@localhost ~]# wc /etc/passwd   //不加任何参数会打印出行数,单词数据,字节数等三个参数
20 28 901 /etc/passwd
[root@localhost ~]# cat /var/log/messages |wc -l   //通过管道符来统计文件的行数

tee命令——多重定向


用于将数据重定向到文件,同时提供一份重定向数据的副本输出到屏幕上

常用操作:

ls   | tee -a  ls.txt     //将输出内容记录到ls.txt文件中,并输出到屏幕上

iconv命令——转换文件的编码格式


语法:

iconv   选项   原编码    新编码      输入文件

选项

-f  编码A从编码A转换
-t  编码B转变成编码B
-l显示系统支持的编码
-o将输出输入到

常用操作:

iconv -f gbk -t utf-8   test.txt     # 将test.txt文档的编码从gbk改为utf-8

diff:比较两个文件的不同

vimdiff:VIM可视化比较工具  

vim:文本编辑器,后续会在单独篇章详细讲解

发表在 linux文章 | 留下评论

Linux常用命令之文件管理

  对于运维人员来说Linux系统命令行是必须掌握的技能,Linux中一切皆文件,本次分享的是文件管理相关的命令。

以下就是本次主要讲解的命令。

1、ls命令


语法:

ls  [选项] [文件]

选项:

"-a" :显示所有文件和目录(.开头的隐藏文件也会列出)
"-l" :显示当前目录下文件的详细信息。
"-d" :显示目录本身,一般结合-l使用
"-i" :显示文件时,同时显示文件的索引节点
"-r" :倒序显示文件
"-h" :以人们可读的方式显示文件大小,比如1k,200M,2G等)

常用操作:

ls               //查看当前目录下的所有目录和文件
ls -a            //查看当前目录下所有的目录和文件(包含隐藏文件)
ls -l            // 列表查看当前目录下所有目录和文件,与“ll”效果一样
ls / // 查看指定目录下的所有目录和文件

2、cp命令


语法:

cp  [选项]   源文件   目标文件

选项:

"-r"  :递归复制,用于复制目录
"-i" :询问,如果目标文件已经存在,则会询问是否覆盖。默认设置
"-d" :如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接
"-p":复制后目标文件保留源文件的属性(包括所有者,所属组,权限和时间)
"-a" :相当于-d、-p、-r选项的集合。

常用操作:

cp  /tmp/tool   /opt         //将/tmp/tool目录复制到/opt目录下
cp  /tmp/tool/*  /opt       //将/tmp/tool目录下的文件复制到/opt目录下
cp -r /tmp/tool/ /opt //将/tmp/tool目录下的文件及目录复制到/opt目录下

3、pwd命令


显示当前目录

4、mkdir命令


语法:

mkdir  [选项]  目录..

选项:

"-p"  :创建多级目录

常用操作:

mkdir  dir                       // 创建目录dirmkdir  -p  dir/dir1/dir2         //创建多级目录

5、mv命令


语法:

mv   源文件/目录    目标文件/目录

常用操作:

mv  file1   file2    //移动file1到file2中,如果不存在file2,相当于重命名file1,同样适用于目录。mv  /opt/*    /tmp   //将/opt目录下所有文件移动到/tmp目录下

6、rm命令


语法:

rm [选项]   文件/目录

选项:

"-i" :删除之前需要确定
"-r" :递归删除,用于删除目录
"-f" :强制删除,不需要确认

常用操作:

rm   file1               //删除当前目录下的文件rm -f  file1             //强制删除文件rm  -rf  dir            //强制删除dir目录及dir目录里的所有目录和文件rm -rf  *                //删除当前目录的所有目录和文件,慎用rm -rf  /*              //慎用,跑路命令。

7、ln命令


语法:

ln  [选项]   源文件   链接文件

选项:

"-s"  :创建符号链接
"-f" :强制执行,覆盖现有文件

常用操作:

ln  test.txt   hard_link       //创建一个硬链接,删除了源文件,链接文件仍然可用
ln -s test.txt soft_link // 创建一个软链接,删除了源文件,链接文件不可用,相当于window的快捷方式。

8、chmod命令


语法:

chmod  [选项]  权限  文件/目录

选项:

"-R"    :递归处理指定目录以及其子目录下的所有文件

常用操作:

chmod +777 /tmp        # 给特定目录添加777权限
chmod +x /tmp # 给/tmp目录添加执行权限

以下是权限对应列表

9、chown命令

语法:

chown  [选项]  属主权限.组权限  文件/目录

选项:

"-R"   :递归更改目录的用户和用户组

常用操作:

chown -R rudy.rudy   /tmp       # 将/tmp的属主和属组修改为rudy权限。

10、chattr命令


语法:

chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

选项:

-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-V 显示指令执行过程。  
+<属性> 开启文件或目录的该项属性。  
-<属性> 关闭文件或目录的该项属性。  
=<属性> 指定文件或目录的该项属性。
属性:
a:让文件或目录仅供附加用途。

c:将文件或目录压缩后存放。
i:不得任意更动文件或目录。
u:预防意外删除。

常用操作:

[root@localhost ~]# chattr +a /etc/passwd     //只能向文件中添加数据,而不能删除,多用于服务器日志文件安全 。   -a  可去掉该属性
[root@localhost ~]# chattr +i /etc/passwd     //设定文件不能被删除、改名、写入或新增内容   -i  可去掉该属性

11、lsattr命令


常用操作:

[root@localhost ~]# lsattr /etc/passwd    //查看文件扩展属性----ia---------- /etc/passwd

12、xargs命令


作用:将标准输入转换成命令行参数

选项:

"-n"    :指定每行的最大参数量"-i"    :以{}替代前面的结果

常用操作:

xargs -n  3   <   test.txt     //每行最多输出三个字符xargs    :所有输出都变为一行
find  /  -name  "*.log" | xargs -i  mv  {}  dir1  //将以.log结尾的所有文件移动到dir1目录下find  /   -name  "*.log"  | xargs rm -rf       //将以.log结尾的所有文件删除。等同于find  / -name  "*.log" -exec rm -rf {} \;

其他文件处理命令:

cd:切换目录

cd -       //切换到上次操作目录cd ../..   //切换到上两级目录

tree:以树形结构显示目录下的内容

该命令最小化安装时默认不安装,需要自行安装:

yum install -y treetree -d       //只显示目录不是显示文件

tree -L 1  /   //只列出根目录下第一层的结构

touch:创建空文件或改变文件的时间戳属性

rename:重命名文件

rename  .jpg  .txt  *.jpg      //将所有文件的.jpg替换为.txt

file:显示文件的类型

[root@localhost ~]# file anaconda-ks.cfg anaconda-ks.cfg: ASCII text

Linux文件类型说明:

  • 普通文件类型:Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]
  • 目录文件: 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]
  • 块设备文件 :就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]
  • 字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
  • 套接字文件:这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型
  • 管道文件:FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]
  • 链接文件:分类硬链接和软连接,类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]

md5sum:计算和校验文件的MD5值

选项: -c                 //从指定文件中读取MD5校验值,并进行校验    
[root@localhost ~]# md5sum anaconda-ks.cfg //输出两部分,第一部分是md5值,后面是文件名d862f17d783eaf1abcf4f376b5c85527  anaconda-ks.cfg 
[root@localhost ~]# md5sum anaconda-ks.cfg >md5.log //生成校验文件
[root@localhost ~]# md5sum -c md5.log //使用-c参数检查,结果OK表示文件没有变化anaconda-ks.cfg: OK

umask:显示或设置权限掩码

可以通过/etc/profile和/etc/bashrc文件来修改

发表在 linux文章 | 留下评论

Windows 和 Linux 常见端口及服务列表(0-3000)及高危端口说明

Windows 和 Linux 常见端口及服务列表(0-3000)

​Windows 系统常见端口​

端口号服务介绍描述
21FTP(控制端口)文件传输协议的控制通道,用于发送FTP命令,存在明文传输风险。
22SSH安全远程登录协议(部分第三方工具支持),需注意暴力破解风险。
25SMTP邮件发送协议,易被滥用于垃圾邮件发送。
53DNS域名解析服务,需防范DNS劫持或放大攻击。
80HTTP网页服务默认端口,易受跨站脚本(XSS)或注入攻击。
135RPC远程过程调用,曾因漏洞被用于蠕虫传播(如MS08-067)。
137-139NetBIOS局域网名称解析和文件共享,易泄露主机信息或内网渗透。
443HTTPS加密网页服务,需防范证书伪造或中间人攻击。
445SMB文件共享协议,永恒之蓝漏洞(WannaCry)的传播途径。
3389RDP远程桌面协议,弱密码或未授权访问易导致系统沦陷。

​Linux 系统常见端口​

端口号服务介绍描述
22SSH加密远程管理通道,但弱密码或旧版本协议易被爆破。
53DNS同Windows,需注意DNS缓存投毒风险。
80HTTP同Windows,Apache/Nginx服务常见漏洞(如未授权访问)。
111RPCbind远程过程调用端口映射,若暴露易被用于服务枚举攻击。
143IMAP邮件接收协议,明文传输时易泄露凭据。
161SNMP网络设备监控协议,默认团体名(如public)易被利用获取敏感信息。
389LDAP目录服务协议,弱认证可能导致用户数据泄露。
443HTTPS同Windows,需防范SSL/TLS协议漏洞(如Heartbleed)。
2049NFS网络文件系统,配置不当会导致未授权文件访问。
3306MySQL数据库服务,弱密码或SQL注入漏洞常见攻击目标。

​重点协议及高危端口详解​

​1. SMB(445/TCP)​
• 高危原因:SMB协议用于Windows文件共享,但漏洞频发(如永恒之蓝)。攻击者可利用漏洞远程执行代码,传播勒索病毒或横向移动。

• 防护建议:关闭445端口,升级系统补丁,启用SMBv3加密。

​2. RDP(3389/TCP)​
• 高危原因:远程桌面默认端口,弱密码易被暴力破解,0day漏洞(如BlueKeep)可导致蠕虫级攻击。

• 防护建议:限制IP白名单访问,启用网络级认证(NLA),使用VPN替代直接暴露。

​3. SSH(22/TCP)​
• 高危原因:Linux核心管理通道,若使用弱密码或未更新OpenSSH版本(如CVE-2024-3094漏洞),易被入侵。

• 防护建议:禁用root远程登录,启用密钥认证,限制失败登录尝试次数。

​4. NetBIOS(137-139/UDP)​
• 高危原因:Windows老旧协议,通过UDP广播泄露主机名、共享目录等信息,常用于内网渗透。

• 防护建议:禁用NetBIOS over TCP/IP,关闭SMBv1协议。

​5. NFS(2049/TCP)​
• 高危原因:Linux文件共享协议,默认无加密,配置错误会导致敏感数据暴露。

• 防护建议:限制访问IP范围,启用Kerberos认证,避免导出敏感目录。

​6. MySQL(3306/TCP)​
• 高危原因:默认允许远程连接,弱口令(如root空密码)或注入漏洞可导致数据泄露。

• 防护建议:禁止远程root登录,启用防火墙规则,定期审计SQL语句。


​补充说明​
• 端口安全通用原则:

• 关闭非必要端口(如Windows的135-139、Linux的111);

• 使用加密协议替代明文协议(如SFTP替代FTP);

• 定期扫描端口开放情况(netstat -anoss -tunlp)。

• 高危端口列表:包括445、3389、22、3306、2049等,需优先加固。

常见TCP端口号及对应的字符串

端口号字符串协议说明
7echoEchoEcho服务
9discardDiscard用于连接测试的空服务
13daytimeDaytime给请求主机发送日期和时间
19CHARgenCharacter generator字符生成服务;发送无止境的字符流
20ftp-dataFTP data connectionsFTP数据端口
21ftpFile Transfer Protocol(FTP)文件传输协议(FTP)端口
23telnetTelnetTelnet服务
25smtpSimple Mail Transport Protocol (SMTP)简单邮件传输协议
37timeTime时间协议
43whoisNickname(WHOIS)目录服务
49tacacsTAC Access Control System (TACACS)用于基于TCP/IP验证和访问的访问控制系统(TACACS登录主机协议)
53domainDomain Name Service (DNS)域名服务
70gopherGopher信息检索协议(互联网文档搜寻和检索)
79fingerFinger用于用户联系信息的Finger服务,查询远程主机在线用户等信息
80wwwWorld Wide Web (HTTP)用于万维网(WWW)服务的超文本传输协议(HTTP),用于网页浏览
101hostnameNIC hostname serverNIC机器上的主机名服务
109pop2Post Office Protocol v2邮件协议-版本2
110pop3Post Office Protocol v3邮件协议-版本3
111sunrpcSun Remote Procedure Call (RPC)SUN公司的远程过程调用(RPC)协议,用于远程命令执行,被网络文件系统(NFS)使用
119nntpNetwork News Transport Protocol (NNTP)网络新闻传输协议,承载USENET通信
179bgpBorder Gateway Protocol (BGP)边界网关协议
194ircInternet Relay Chat (IRC)互联网中继聊天(多线交谈协议)
512execExec (rsh)用于对远程执行的进程进行验证
513loginLogin (rlogin)远程登录
514cmdRemote commands远程命令,不必登录的远程shell(rshell)和远程复制(rcp)
515lpdPrinter service打印机(lpr)假脱机
517talkTalk远程对话服务和客户
540uucpUnix-to-Unix Copy ProgramUnix到Unix复制服务
543kloginKerberos loginKerberos版本5(v5)远程登录
544kshellKerberos shellKerberos版本5(v5)远程shell

常见UDP端口号及对应的字符串

端口号字符串协议说明
7echoEchoEcho服务
9discardDiscard用于连接测试的空服务
37timeTime时间协议
42nameserverHost Name Server主机名服务
53dnsDomain Name Service (DNS)域名服务
65tacacs-dsTACACS-Database ServiceTACACS数据库服务
67bootpsBootstrap Protocol Server引导程序协议(BOOTP)服务端,DHCP服务使用
68bootpcBootstrap Protocol Client引导程序协议(BOOTP)客户端,DHCP客户使用
69tftpTrivial File Transfer Protocol (TFTP)小文件传输协议
90dnsixDNSIX Security Attribute Token MapDNSIX安全属性标记图
111sunrpcSUN Remote Procedure Call (SUN RPC)SUN公司的远程过程调用(RPC)协议,用于远程命令执行,被网络文件系统(NFS)使用
123ntpNetwork Time Protocol (NTP)网络时间协议,蠕虫病毒会利用
137netbios-nsNETBIOS Name ServiceNETBIOS名称服务
138netbios-dgmNETBIOS Datagram ServiceNETBIOS数据报服务
139netbios-ssnNETBIOS Session ServiceNETBIOS会话服务
161snmpSNMP简单网络管理协议
162snmptrapSNMPTRAPSNMP陷阱
177xdmcpX Display Manager Control Protocol (XDMCP)X显示管理器控制协议
434mobilip-agMobileIP-Agent移动IP代理
435mobilip-mnMobileIP-MN移动IP管理
512biffMail notify异步邮件,可用来通知用户有邮件到达
513whoWho登录的用户列表
514syslogSyslogUNIX系统日志服务
517talkTalk远程对话服务器和客户端
520ripRouting Information ProtocolRIP路由协议
发表在 linux文章 | 留下评论

overlay技术–理解VXLAN(L2 over UDP)、NVGRE(L2 over GRE)、STT(L2 over TCP)

overlay技术–理解VXLAN(L2 over UDP)、NVGRE(L2 over GRE)、STT(L2 over TCP)


overlay技术需求
1 虚拟机迁移范围受到网络架构限制
由于虚拟机迁移的网络属性要求,其从一个物理机上迁移到另一个物理机上,要求虚拟机不间断业务,则需要其IP地址、MAC地址等参数维保持不变,如此则要求业务网络是一个二层网络,且要求网络本身具备多路径多链路的冗余和可靠性。
2 虚拟机规模受网络规格限制
在大二层网络环境下,数据流均需要通过明确的网络寻址以保证准确到达目的地,因此网络设备的二层地址表项大小((即MAC地址表)),成为决定了云计算环境下虚拟机的规模的上限。
3 网络隔离/分离能力限制
当前的主流网络隔离技术为VLAN(或VPN),在大规模虚拟化环境部署会有问题,VLAN数量在标准定义中只有12个比特单位,即可用的数量为4000个左右,这样的数量级对于公有云或大型虚拟化云计算应用而言微不足道。在此驱动力基础上,逐步演化出Overlay的虚拟化网络技术趋势。

overlay技术简介
Overlay在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于IP的基础网络技术为主。其实这种模式是以对传统技术的优化而形成的。
针对前文提出的三大技术挑战,Overlay在很大程度上提供了全新的解决方式。

针对虚机迁移范围受到网络架构限制的解决方式
Overlay是一种封装在IP报文之上的新的数据格式,因此,这种数据可以通过路由的方式在网络中分发,而路由网络本身并无特殊网络结构限制,具备良性大规模扩展能力,并且对设备本身无特殊要求,以高性能路由转发为佳,且路由网络本身具备很强的的故障自愈能力、负载均衡能力。
针对虚机规模受网络规格限制的解决方式
虚拟机数据封装在IP数据包中后,对网络只表现为封装后的的网络参数,即隧道端点的地址,因此,对于承载网络(特别是接入交换机),MAC地址规格需求极大降低,最低规格也就是几十个(每个端口一台物理服务器的隧道端点MAC)。
针对网络隔离/分离能力限制的解决方式
针对VLAN数量4000以内的限制,在Overlay技术中引入了类似12比特VLAN ID的用户标识,支持千万级以上的用户标识,并且在Overlay中沿袭了云计算“租户”的概念,称之为Tenant ID(租户标识),用24或64比特表示。针对VLAN技术下网络的TRUANK ALL(VLAN穿透所有设备)的问题,Overlay对网络的VLAN配置无要求,可以避免网络本身的无效流量带宽浪费,同时Overlay的二层连通基于虚机业务需求创建,在云的环境中全局可控。
Overlay主要技术标准及比较
目前,IETF在Overlay技术领域有如下三大技术路线正在讨论,为简单起见,本文只讨论基于IPv4的Overlay相关内容。
VXLAN。VXLAN是将以太网报文封装在UDP传输层上的一种隧道转发模式,目的UDP端口号为4798;为了使VXLAN充分利用承载网络路由的均衡性,VXLAN通过将原始以太网数据头(MAC、IP、四层端口号等)的HASH值作为UDP的号;采用24比特标识二层网络分段,称为VNI(VXLAN Network Identifier),类似于VLAN ID作用;未知目的、广播、组播等网络流量均被封装为组播转发,物理网络要求支持任意源组播(ASM)。

NVGRE

NVGRE主要支持者是Microsoft。与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE)。NVGRE使用GRE头部的低24位作为租户网络标识符(TNI),与VXLAN一样可以支持1600个虚拟网络。为了提供描述带宽利用率粒度的流,传输网络需要使用GRE头,但是这导致NVGRE不能兼容传统负载均衡,这是NVGRE与VXLAN相比最大的区别也是最大的不足为了提高负载均衡能力建议每个NVGRE主机使用多个IP地址,确保更多流量能够被负载均衡。NVGRE不需要依赖泛洪和IP组播进行学习,而是以一种更灵活的方式进行广播,但是这需要依赖硬件/供应商。最后一个区别关于分片,NVGRE支持减小数据包最大传输单元以减小内部虚拟网络数据包大小,不需要要求传输网络支持传输大型帧。

STT

STT利用了TCP的数据封装形式,但改造了TCP的传输机制,数据传输不遵循TCP状态机,而是全新定义的无状态机制,将TCP各字段意义重新定义,无需三次握手建立TCP连接,因此称为无状态TCP;以太网数据封装在无状态TCP;采用64比特Context ID标识二层网络分段;为了使STT充分利用承载网络路由的均衡性,通过将原始以太网数据头(MAC、IP、四层端口号等)的HASH值作为无状态TCP的源端口号;未知目的、广播、组播等网络流量均被封装为组播转发。


这三种二层Overlay技术,大体思路均是将以太网报文承载到某种隧道层面,差异性在于选择和构造隧道的不同,而底层均是IP转发。上表所示为这三种技术关键特性的比较:
VXLAN和STT对于现网设备对流量均衡要求较低,即负载链路负载分担适应性好,一般的网络设备都能对L2-L4的数据内容参数进行链路聚合或等价路由的流量均衡

而NVGRE则需要网络设备对GRE扩展头感知并对flow ID进行HASH,需要硬件升级;

STT对于TCP有较大修改,隧道模式接近UDP性质,隧道构造技术属于革新性,且复杂度较高,而VXLAN利用了现有通用的UDP传输,成熟性极高。总体比较,VLXAN技术相对具有优势。

参考:
vlan: http://www.bitscn.com/network/200605/26966.html
VLAN和VXLAN: https://blog.csdn.net/octopusflying/article/details/77609199
vpc: http://www.360doc.com/content/17/0405/08/35636606_642959801.shtml
阿里云vpc: http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/pdf/vpc-product-introduction-intl-zh-2017-03-17.pdf
http://www.h3c.com/cn/d_201309/796466_30008_0.htm
————————————————

原文链接:https://blog.csdn.net/gengzhikui1992/article/details/79680240

发表在 linux文章 | 留下评论

入侵检测规则匹配算法,分为单模式匹配算法和多模式匹配算法

入侵检测规则匹配算法,分为单模式匹配算法和多模式匹配算法。

  1. 单模式匹配
    单模式匹配,就是一个串跟一个串进行匹配,常见算法有:BM算法和KMP算法。

1.1 BF (Brute Force)暴力匹配算法
作为最简单、最暴力的字符串匹配算法,BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。

理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。朴素字符串匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。

2.2 RK(Rabin-Karp) 算法
BF算法每次检查主串与子串是否匹配,需要依次比对每个字符,所以 BF 算法的时间复杂度就比较高,是 O(n*m)。

RK 算法的思路是这样的:
我们通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了。

模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,所以,这部分的时间复杂度也是 O(n)。所以,RK 算法整体的时间复杂度就是 O(n)。

跟 BF 算法相比,效率提高了很多。不过这样的效率取决于哈希算法的设计方法,如果存在冲突的情况下,时间复杂度可能会退化。极端情况下,哈希算法大量冲突,时间复杂度就退化为 O(n*m)。

2.3 BM(Boyer-Moore)算法
参考:http://www.cs.jhu.edu/~langmea/resources/lecture_notes/boyer_moore.pdf

我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配。

如果我们可以一次性往后滑动好几位,那匹配的效率岂不是就提高了?

BM 算法,本质上其实就是在寻找这种规律,当模式串和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的情况,将模式串往后多滑动几位。

BM 算法构建的规则有两类,坏字符规则和好后缀规则。

坏字符规则:If we mismatch, use knowledge of the mismatched text character to skip alignments
好后缀规则:If we match some characters, use knowledge of the matched characters to skip alignments
2.4 KMP算法
KMP 算法的核心思想,跟上一节讲的 BM 算法非常相近。我们假设主串是 a,模式串是 b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况

  1. 多模式匹配
    多模式匹配,在一个串中同时查找多个串,常见算法有:AC自动机算法和Trie树算法。

2.1 Trie树
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。

举个简单的例子来说明一下。我们有 6 个字符串,它们分别是:how,hi,her,hello,so,see。我们希望在里面多次查找某个字符串是否存在。如果每次查找,都是拿要查找的字符串跟这 6 个字符串依次进行字符串匹配,那效率就比较低,有没有更高效的方法呢?这个时候,我们就可以先对这 6 个字符串做一下预处理,组织成 Trie 树的结构,之后每次查找,都是在 Trie 树中进行匹配查找。

Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。

如果要在一组字符串中,频繁地查询某些字符串,用 Trie 树会非常高效。

构建 Trie 树的过程,需要扫描所有的字符串,时间复杂度是 O(n)(n 表示所有字符串的长度和)。

但是一旦构建成功之后,后续的查询操作会非常高效。如果要查询的字符串长度是 k,那我们只需要比对大约 k 个节点,就能完成查询操作。跟原本那组字符串的长度和个数没有任何关系。所以说,构建好 Trie 树后,在其中查找字符串的时间复杂度是 O(k),k 表示要查找的字符串的长度。

字符串中包含的字符集不能太大,要求字符串的前缀重合比较多,如果字符集太大,那存储空间可能就会浪费很多。即便可以优化,但也要付出牺牲查询、插入效率的代价。

2.2 AC( Aho-Corasick)自动机
假设需要模式串有上万个,通过单模式串匹配算法(比如 KMP 算法),需要扫描几千遍。很显然,这种处理思路比较低效。

Trie 树就是一种多模式串匹配算法。我们用Trie树可以对上千个模式串字典进行预处理,构建成 Trie 树结构。这个预处理的操作只需要做一次,如果字典动态更新了,比如删除、添加了一个模式串,那我们只需要动态更新一下 Trie 树就可以了。

  1. Hyperscan
    Hyperscan是一款来自于Intel的高性能的正则表达式匹配库。它是基于X86平台以PCRE为原型而开发的,并以BSD许可开源在https://01.org/hyperscan。在支持PCRE的大部分语法的前提下,Hyperscan增加了特定的语法和工作模式来保证其在真实网络场景下的实用性。与此同时,大量高效算法及IntelSIMD*指令的使用实现了Hyperscan的高性能匹配。Hyperscan适用于部署在诸如DPI/IPS/IDS/FW等场景中,目前已经在全球多个客户网络安全方案中得到实际的应用。此外,Hyperscan还支持和开源IDS/IPS产品Snort(https://www.snort.org)和Suricata (https://suricata-ids.org)集成,使其应用更加广泛。

3.1 功能
功能多样

作为纯软件产品,Hyperscan支持Intel处理器多平台的交叉编译,且对操作系统无特殊限定,同时支持虚拟机和容器场景。Hyperscan 实现了对PCRE语法的基本涵盖,对复杂的表达式例如”.”和”[^>]”不会有任何支持问题。在此基础上,Hyperscan增加了不同的匹配模式(流模式和块模式)来满足不同的使用场景。通过指定参数,Hyperscan能找到匹配的数据在输入流中的起始和结束位置。更多功能信息请参考http://01org.github.io/hyperscan/dev-reference/。

大规模匹配

根据规则复杂度的不同,Hyperscan能支持几万到几十万的规则的匹配。与传统正则匹配引擎不同,Hyperscan支持多规则的同步匹配。在用户为每条规则指定独有的编号后,Hypercan可以将所有规则编译成一个数据库并在匹配过程中输出所有当前匹配到的规则信息。

流模式(streaming mode)

Hyperscan主要分为两种模式:块模式 (blockmode)和流模式 (streaming mode). 其中块模式为状态正则匹配引擎具有的模式,即对一段现成的完整数据进行匹配,匹配结束即返回结果。流模式是Hyperscan为网络场景下跨报文匹配设计的特殊匹配模式。在真实网络场景下,数据是分散在多报文中。若有数据在尚未到达的报文中时,传统匹配模式将无法适用。在流模式下,Hyperscan可以保存当前数据匹配的状态,并以其作为接收到新数据时的初始匹配状态。如图3所示,不管数据”xxxxabcxxxxxxxxdefx”以怎样的形式被分散在以时间顺序到达的报块中,流模式保证了最后匹配结果的一致性。另外,Hyperscan对保存的匹配状态进行了压缩以减少流模式对内存的占用。Hyperscan流模式解决了数据完整性问题,极大地简化用户网络流处理的过程。

3.2 原理
Hyperscan以自动机理论为基础,其工作流程主要分成两个部分:编译期(compiletime)和运行期(run-time)。

编译期
Hyperscan 自带C++编写的正则表达式编译器。如图1所示,它将正则表达式作为输入,针对不同的IA平台,用户定义的模式及特殊语法,经过复杂的图分析及优化过程,生成对应的数据库。另外,生成的数据库可以被序列化后保存在内存中,以供运行期提取使用。

Hyperscan的运行期是通过C语言来开发的。
用户需要预先分配一段内存来存储临时匹配状态信息,之后利用编译生成的数据库调用Hyperscan内部的匹配引擎(NFA, DFA等)来对输入进行模式匹配。Hyperscan在引擎中使用Intel处理器所具有的SIMD指令进行加速。同时,用户可以通过回调函数来自定义匹配发生后采取的行为。由于生成的数据库是只读的,用户可以在多个CPU核或多线程场景下共享数据库来提升匹配扩展性。
————————————————

原文链接:https://blog.csdn.net/gengzhikui1992/article/details/105424680

发表在 linux文章 | 留下评论

linux c程序员副业赚钱攻略

基于你的技能组合(Linux、C语言、网络编程、系统编程),以下是一些边际成本低且能快速启动的副业方向,结合技术特性与商业化潜力:


1. 开发高性能系统工具
方向:针对开发者或运维人员痛点,开发Linux环境下的效率工具

  • 案例:
    • • 网络调试工具:封装tcpdump/strace为交互式CLI工具(如增强版网络包分析器)
    • • 系统监控工具:基于eBPF开发实时资源监控工具(替代htop,支持自定义指标)
    • • 日志分析器:用C语言实现高性能日志过滤/统计工具(替代grep+awk组合)
    • 变现方式:
    • • 开源核心功能,通过GitHub Sponsors或企业定制版收费
    • • 在Gumroad销售预编译二进制包(针对非技术用户)
  • 技术栈:C + libbpf(eBPF)、ncurses(终端UI)

2. 嵌入式/Linux驱动开发
方向:为小众硬件或开发板提供软件支持

  • 案例:
  • • IoT设备驱动:为树莓派扩展模块(如传感器、工业控制器)编写Linux内核驱动
  • • 性能优化:为ARM架构设备(如路由器)优化TCP/IP协议栈,减少延迟
  • • 旧设备兼容层:为老旧工业设备开发Linux兼容驱动(企业刚需)
  • 变现方式:
  • • 通过Upwork接单(硬件厂商常外包驱动开发)
  • • 在Tindie(硬件极客平台)销售配套固件

3. 网络协议栈优化与中间件
方向:解决高并发、低延迟场景的通信问题

  • 案例:
  • • 自定义负载均衡器:基于epoll实现轻量级反向代理(对标Nginx但更轻量)
  • • 游戏服务器框架:用C语言开发低延迟UDP通信库(适用于实时对战游戏)
  • • 金融交易中间件:优化FIX协议实现,用于高频交易场景
  • 变现方式:
  • • 提供商业许可证(如“个人免费,企业收费”)
  • • 在AWS Marketplace上架付费AMI镜像(预装优化中间件)

4. 安全攻防工具开发
方向:利用C语言底层控制能力开发安全工具

  • 案例:
  • • 漏洞利用POC:编写CVE漏洞验证工具(售卖给安全团队)
  • • Rootkit检测工具:基于Linux内核模块开发隐蔽后门扫描器
  • • 网络蜜罐:模拟脆弱服务诱捕攻击者,记录攻击行为
  • 变现方式:
  • • 在HackerOne等平台提供私有化部署版本
  • • 通过Patreon订阅发布高级攻击技术分析报告

5. 开源项目商业化
方向:从开源项目延伸出企业级需求

  • 案例:
  • • Linux性能调优工具包:集成perfftrace等工具的可视化界面
  • • 协议解析库:开源基础版,销售协议模糊测试(Fuzzing)插件
  • • POSIX兼容层:为嵌入式RTOS实现Linux API兼容层(如兼容pthreads
  • 变现模式:
  • • Open Core模式(核心功能开源,企业功能收费)
  • • 提供商业技术支持合同(按小时计费)

6. 技术内容创作
方向:将深度技术经验转化为付费内容

  • 案例:
  • • 《Linux系统编程黑魔法》电子书:揭秘/proc调优、内存屏障等高级技巧
  • • GDB高级调试实战课程:演示如何用C语言调试内核死锁
  • • 付费技术咨询:在Codementor平台提供1对1 Linux内核问题指导
  • 工具链: • 用Pandoc将Markdown笔记转为PDF/EPUB • 通过Leanpub或自建Hugo站点销售

7. 自动化运维工具
方向:解决服务器运维中的重复性工作

  • 案例: • 批量部署工具:用C语言实现SSH集群管理工具(替代Ansible部分功能) • 日志压缩传输工具:基于zstd算法开发高性能日志收集器 • 内核热补丁工具:在不重启系统的前提下替换内核模块
  • 变现方式: • 在运维社区(如Server Fault)提供付费支持 • 为企业提供定制化开发服务

8. 边缘计算服务
方向:为边缘设备开发轻量级服务

  • 案例: • MQTT协议栈优化:为物联网网关优化消息吞吐量 • 边缘AI推理框架:用C语言实现TensorFlow Lite替代方案 • 轻量级容器运行时:基于runc开发低内存占用的容器引擎
  • 变现方式: • 与硬件厂商分成(每预装一份软件收取授权费) • 在Balena等边缘计算平台发布付费应用

执行策略

  1. 快速验证:用2周时间开发一个最小可行产品(如netstat增强版工具),发布到GitHub和Hacker News测试反馈
  2. 精准定价:
    • 个人开发者:$9-$49/许可证
  3. • 企业客户:$500+/定制需求
  4. 自动化交付:
    • 用Stripe集成自动发放许可证密钥• 通过GitHub Actions自动构建多平台二进制包
  5. 技术营销:
    • 在Reddit的r/linux_programming发技术解析文章引流 • 用C语言为开源项目(如Redis)提交PR,增加技术背书

避坑指南

  • 避免过度工程化:优先用静态链接减少依赖(如musl libc编译)
  • 注意GPL传染性:若用GPL库开发,需明确许可证对商业化的影响
  • 聚焦利基市场:例如专攻工业控制系统(ICS)的Linux兼容层,而非通用领域

你的技能在底层开发领域有极高壁垒,建议从开发工具+开源组合拳切入,既能建立技术影响力,又能通过企业服务实现高溢价变现。

发表在 linux文章 | 留下评论

入侵检测规则匹配算法全景解析与性能对比

入侵检测规则匹配算法全景解析与性能对比

本文将深入剖析单模式/多模式匹配算法的核心原理,并结合Intel Hyperscan的创新架构,揭示其在网络安全领域的革命性突破。所有技术示意图均基于公开论文与官方文档构建,字符图片图1:模式匹配算法演进时间轴(1960s-KMP→1977-BM→1975-AC→2015-Hyperscan)

一、单模式匹配算法矩阵

算法跳跃机制时间复杂度典型应用场景
BF逐字符滑动O(n*m)短文本快速验证
RK哈希值跳跃O(n)低冲突率内容过滤
BM坏字符/好后缀O(n/m)HTTP协议字段检测
KMP部分匹配表O(n)日志连续特征分析

字符图片图2:BM算法双重跳跃机制(坏字符规则:跳跃未匹配字符;好后缀规则:复用已匹配后缀)

BM算法的核心创新在于双重规则协同:当主串字符与模式串不匹配时,优先根据坏字符规则计算跳跃位数(如主串出现未在模式串中的字符可跳跃整个模式串长度),若已匹配部分存在重复后缀,则通过好后缀规则二次优化滑动距离。实验表明改进后的BM算法较传统版本减少20%比较次数。

二、多模式匹配技术突破

字符图片图3:AC自动机三指针联动(goto构建Trie主干,failure实现后缀回溯,output标记终结状态)

  • Trie树优化路径:通过公共前缀压缩存储空间(如”she”与”he”共享”h”节点),支持百万级规则库构建
  • 动态失效指针:通过BFS生成failure跳转表,使匹配失败时快速定位相似模式

AC自动机的核心优势在于状态机复用:以”hishers”匹配为例,当匹配到”his”时failure指针跳转至”is”前缀,实现跨模式串的连续检测,50万规则库匹配耗时仅O(n)。

三、Hyperscan架构革命

字符图片图4:Hyperscan混合自动机架构(DFA处理简单规则,NFA应对复杂语法,SIMD加速并行处理)

  1. Lazy DFA技术:动态构建最小化状态,内存占用较传统DFA减少90%
  2. AVX-512指令加速:16字节并行处理使单核吞吐量达100Gbps
  3. 流状态压缩:通过差分编码将千兆级状态压缩至10MB内存

字符图片图5:Hyperscan与AC自动机性能对比(Xeon Platinum 8380测试环境)

四、关键指标对比

维度AC自动机Wu-ManberHyperscan
规则容量10万级5万级50万+
内存占用GB级500MB10MB
流延迟50ms20ms<1ms
正则支持基础语法有限扩展PCRE全集

Hyperscan的突破性设计使其在Snort、Suricata等开源IDS/IPS中实现大规模部署,通过DPDK集成可达到线速处理能力。其流模式下的状态压缩技术,成功解决了跨报文匹配的完整性难题。

技术文档参考:
: https://blog.csdn.net/gengzhikui1992/article/details/105424680
: https://example.com/BM算法改进研究
: https://blog.csdn.net/bladelyer/article/details/BM算法详解
: https://blog.csdn.net/AC多模式匹配算法
: https://blog.csdn.net/AC自动机原理
: https://intel.com/hyperscan官方文档
: https://blog.csdn.net/DPDK集成性能分析
: https://blog.csdn.net/Hyperscan流模式解析

发表在 linux文章 | 留下评论

程序员在选择副业怎么做


1. 开发轻量级 SaaS 工具

  • 特点:一次开发,长期订阅付费,服务器成本随用户量自动扩展。
  • 案例:
  • • SEO 检查工具:用户输入网址自动生成优化报告(技术栈:Python + AWS Lambda)。
  • • 社交媒体排期工具:批量生成帖子并同步到多个平台(利用第三方API,如Twitter/Facebook API)。
  • • 薪资计算器:针对自由职业者的税费计算工具。
  • 成本控制:使用Serverless架构(如Vercel、AWS Lambda)减少服务器开支。

2. 在线教育 & 知识付费

  • 特点:内容一次制作,无限次销售,平台自动分发。
  • 案例:
  • • 录播课程:在Udemy/慕课网发布《React高级实战》,或自建网站销售。
  • • 电子书/手册:编写《TypeScript最佳实践》通过Gumroad销售PDF。
  • • 付费订阅内容:通过Substack发布技术Newsletter(如《架构设计周刊》)。
  • 工具推荐:用OBS录制课程,Canva制作课件,Thinkific搭建付费站。

3. 开源项目商业化

  • 特点:免费版引流,企业版收费,维护成本低。
  • 案例:
  • • 开源库收费增强版:如Ag-Grid社区版免费,企业版提供高级功能。
  • • GitHub Sponsors:通过技术影响力获取捐赠(如Vue.js核心成员)。
  • • 插件市场:为开源项目(如WordPress)开发付费插件。
  • 关键点:选择高频使用场景(如数据表格、图表库)。

4. API 服务

  • 特点:封装技术能力为API,按调用次数收费。
  • 案例:
  • • OCR识别API:调用Tesseract引擎封装为REST API(定价:0.001美元/次)。
  • • AI模型服务:提供文本情感分析、图像风格迁移API。
  • • 数据聚合API:爬取公开数据(如股票价格)提供结构化接口。
  • 平台推荐:快速部署到APILayer、RapidAPI等市场。

5. 数字产品 & 模板

  • 特点:零交付成本,自动化销售。
  • 案例:
  • • 代码模板:销售Next.js电商模板、Flutter应用脚手架。
  • • 设计资源:开发Figma组件库(如Dashboard UI Kit)。
  • • Chrome插件:解决小众需求(如「Github代码行数统计器」)。
  • 渠道:Gumroad、Creative Market、Envato Market。

6. 内容创作 & 广告分成

  • 特点:流量积累后,广告/联盟收入边际成本趋零。
  • 案例:
  • • 技术博客:通过Google AdSense、Carbon Ads赚取广告费。
  • • YouTube/B站教程:平台分成+品牌赞助(如编程工具推广)。
  • • 技术书籍联属营销:推荐Amazon技术书籍获取佣金。
  • 工具:用Hugo/Jekyll搭建静态博客,自动SEO优化。

7. 自动化工具 & 机器人

  • 特点:代码自动化替代人工,规模化变现。
  • 案例:
  • • Discord管理机器人:自动审核、欢迎消息、数据统计。
  • • Twitter增长工具:自动关注/取关、内容排期(需遵守平台规则)。
  • • RPA脚本:为企业提供Excel数据清洗自动化脚本。
  • 技术栈:Python + Selenium/AutoHotkey。

8. 会员制社区

  • 特点:知识沉淀+用户粘性,边际服务成本低。
  • 案例:
  • • 付费技术社群:Discord/知识星球提供答疑、资源分享。
  • • LeetCode刷题群:每周发布精选题目+题解。
  • • 开源协作社区:付费参与内部项目共建。
  • 工具:用Discord机器人自动管理会员权限。

9. 模板 & 主题销售

  • 特点:一次开发,多平台分发。
  • 案例:
  • • Notion模板:销售项目管理、读书笔记模板。
  • • WordPress主题:开发轻量级博客主题上架ThemeForest。
  • • 简历生成器:提供LaTeX/HTML简历模板,支持一键导出PDF。

10. 联盟营销(Affiliate)

  • 特点:零库存,推荐技术产品获取佣金。
  • 案例:
  • • 云服务推荐:推荐AWS/Azure,用户注册后获取返利。
  • • 开发工具推广:如GitHub Copilot、JetBrains全家桶。
  • • 在线课程分销:Udemy讲师可设置课程分销分成。

选择建议

  1. 从自身技能出发:优先复用已有技术栈(如前端开发可做Chrome插件)。
  2. 验证需求:通过Reddit、Indie Hackers等社区测试产品创意。
  3. 自动化流程:用GitHub Actions自动部署、Zapier连接支付/邮件通知。
  4. 合规性:注意数据隐私(如GDPR)、税务申报(注册个体户简化流程)。

核心公式:
睡后收入 = 低边际成本 + 可规模化 + 自动化交付

从上述方向中选择1-2个快速启动(例如先开发一个Chrome插件或发布电子书),逐步迭代优化,可有效平衡主业与副业精力。

程序员在选择副业时,边际成本低(即用户量增长时成本几乎不增加)的项目往往能实现“睡后收入”。以下是一些高性价比的方向及具体案例:


1. 开发轻量级 SaaS 工具

  • 特点:一次开发,长期订阅付费,服务器成本随用户量自动扩展。
  • 案例: • SEO 检查工具:用户输入网址自动生成优化报告(技术栈:Python + AWS Lambda)。 • 社交媒体排期工具:批量生成帖子并同步到多个平台(利用第三方API,如Twitter/Facebook API)。 • 薪资计算器:针对自由职业者的税费计算工具。
  • 成本控制:使用Serverless架构(如Vercel、AWS Lambda)减少服务器开支。

2. 在线教育 & 知识付费

  • 特点:内容一次制作,无限次销售,平台自动分发。
  • 案例: • 录播课程:在Udemy/慕课网发布《React高级实战》,或自建网站销售。 • 电子书/手册:编写《TypeScript最佳实践》通过Gumroad销售PDF。 • 付费订阅内容:通过Substack发布技术Newsletter(如《架构设计周刊》)。
  • 工具推荐:用OBS录制课程,Canva制作课件,Thinkific搭建付费站。

3. 开源项目商业化

  • 特点:免费版引流,企业版收费,维护成本低。
  • 案例: • 开源库收费增强版:如Ag-Grid社区版免费,企业版提供高级功能。 • GitHub Sponsors:通过技术影响力获取捐赠(如Vue.js核心成员)。 • 插件市场:为开源项目(如WordPress)开发付费插件。
  • 关键点:选择高频使用场景(如数据表格、图表库)。

4. API 服务

  • 特点:封装技术能力为API,按调用次数收费。
  • 案例: • OCR识别API:调用Tesseract引擎封装为REST API(定价:0.001美元/次)。 • AI模型服务:提供文本情感分析、图像风格迁移API。 • 数据聚合API:爬取公开数据(如股票价格)提供结构化接口。
  • 平台推荐:快速部署到APILayer、RapidAPI等市场。

5. 数字产品 & 模板

  • 特点:零交付成本,自动化销售。
  • 案例: • 代码模板:销售Next.js电商模板、Flutter应用脚手架。 • 设计资源:开发Figma组件库(如Dashboard UI Kit)。 • Chrome插件:解决小众需求(如「Github代码行数统计器」)。
  • 渠道:Gumroad、Creative Market、Envato Market。

6. 内容创作 & 广告分成

  • 特点:流量积累后,广告/联盟收入边际成本趋零。
  • 案例: • 技术博客:通过Google AdSense、Carbon Ads赚取广告费。 • YouTube/B站教程:平台分成+品牌赞助(如编程工具推广)。 • 技术书籍联属营销:推荐Amazon技术书籍获取佣金。
  • 工具:用Hugo/Jekyll搭建静态博客,自动SEO优化。

7. 自动化工具 & 机器人

  • 特点:代码自动化替代人工,规模化变现。
  • 案例: • Discord管理机器人:自动审核、欢迎消息、数据统计。 • Twitter增长工具:自动关注/取关、内容排期(需遵守平台规则)。 • RPA脚本:为企业提供Excel数据清洗自动化脚本。
  • 技术栈:Python + Selenium/AutoHotkey。

8. 会员制社区

  • 特点:知识沉淀+用户粘性,边际服务成本低。
  • 案例: • 付费技术社群:Discord/知识星球提供答疑、资源分享。 • LeetCode刷题群:每周发布精选题目+题解。 • 开源协作社区:付费参与内部项目共建。
  • 工具:用Discord机器人自动管理会员权限。

9. 模板 & 主题销售

  • 特点:一次开发,多平台分发。
  • 案例: • Notion模板:销售项目管理、读书笔记模板。 • WordPress主题:开发轻量级博客主题上架ThemeForest。 • 简历生成器:提供LaTeX/HTML简历模板,支持一键导出PDF。

10. 联盟营销(Affiliate)

  • 特点:零库存,推荐技术产品获取佣金。
  • 案例: • 云服务推荐:推荐AWS/Azure,用户注册后获取返利。 • 开发工具推广:如GitHub Copilot、JetBrains全家桶。 • 在线课程分销:Udemy讲师可设置课程分销分成。

选择建议

  1. 从自身技能出发:优先复用已有技术栈(如前端开发可做Chrome插件)。
  2. 验证需求:通过Reddit、Indie Hackers等社区测试产品创意。
  3. 自动化流程:用GitHub Actions自动部署、Zapier连接支付/邮件通知。
  4. 合规性:注意数据隐私(如GDPR)、税务申报(注册个体户简化流程)。

核心公式:
睡后收入 = 低边际成本 + 可规模化 + 自动化交付

从上述方向中选择1-2个快速启动(例如先开发一个Chrome插件或发布电子书),逐步迭代优化,可有效平衡主业与副业精力。

发表在 linux文章 | 留下评论

链表高级问题及其对应的C语言解决方案,结合算法优化与代码实现

链表高级问题及其对应的C语言解决方案,结合算法优化与代码实现:


一、合并K个有序链表
问题描述:将K个已排序的单链表合并为一个升序链表。
解决方案:分治法(时间复杂度O(N log K))

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    if (!l1) return l2;
    if (!l2) return l1;
    if (l1->val < l2->val) {
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    } else {
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
}

struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
    if (listsSize == 0) return NULL;
    if (listsSize == 1) return lists[0];

    int mid = listsSize / 2;
    struct ListNode* left = mergeKLists(lists, mid);
    struct ListNode* right = mergeKLists(lists + mid, listsSize - mid);
    return mergeTwoLists(left, right);
}

思路:递归将链表数组拆分为两半,合并后再合并结果。合并两个链表采用递归法简化指针操作。


二、复制带随机指针的链表
问题描述:深拷贝包含随机指针的链表。
解决方案:三次遍历法(时间复杂度O(N))

struct Node* copyRandomList(struct Node* head) {
    if (!head) return NULL;

    // 1. 插入拷贝节点
    struct Node* cur = head;
    while (cur) {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        copy->next = cur->next;
        cur->next = copy;
        cur = copy->next;
    }

    // 2. 处理random指针
    cur = head;
    while (cur) {
        if (cur->random) {
            cur->next->random = cur->random->next;
        }
        cur = cur->next->next;
    }

    // 3. 分离链表
    struct Node* newHead = head->next;
    cur = head;
    while (cur) {
        struct Node* copy = cur->next;
        cur->next = copy->next;
        if (copy->next) {
            copy->next = copy->next->next;
        }
        cur = cur->next;
    }
    return newHead;
}

关键点:在原节点后插入拷贝节点,通过相对位置设置random指针,最后分离链表。


三、奇偶位链表排序
问题描述:奇数位升序,偶数位降序的链表重排为完全升序。
解决方案:分离奇偶链表+反转偶数链表

struct ListNode* sortSpecialList(struct ListNode* head) {
    if (!head || !head->next) return head;

    // 分离奇偶链表
    struct ListNode oddDummy = {0}, evenDummy = {0};
    struct ListNode *oddTail = &oddDummy, *evenTail = &evenDummy;
    int index = 1;
    while (head) {
        if (index % 2 == 1) {
            oddTail->next = head;
            oddTail = oddTail->next;
        } else {
            evenTail->next = head;
            evenTail = evenTail->next;
        }
        head = head->next;
        index++;
    }
    oddTail->next = evenTail->next = NULL;

    // 反转偶数链表
    struct ListNode* prev = NULL, *cur = evenDummy.next;
    while (cur) {
        struct ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    evenDummy.next = prev;

    // 合并两个升序链表
    return mergeTwoLists(oddDummy.next, evenDummy.next);
}

优化:通过奇偶分离和反转实现O(N)时间复杂度。


四、检测环形链表
问题描述:判断链表是否有环,并找到环入口。
解决方案:快慢指针法(Floyd算法)

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow = head, *fast = head;
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            slow = head;
            while (slow != fast) {
                slow = slow->next;
                fast = fast->next;
            }
            return slow;
        }
    }
    return NULL;
}

数学证明:相遇后重置慢指针到头部,同步移动再次相遇点即为入口。


五、链表反转(迭代法)
问题描述:反转整个链表或每K个节点。

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode *prev = NULL, *cur = head;
    while (cur) {
        struct ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

扩展应用:局部反转可通过记录子链表头尾指针实现。


六、性能优化策略

  1. 内存池管理:预分配节点减少malloc调用次数。
  2. 缓存优化:通过顺序访问提升CPU缓存命中率。
  3. 无锁并发:使用原子操作实现线程安全链表。

以上方案覆盖链表操作的核心难点,通过合理选择数据结构和算法策略(如分治、哈希映射、指针操作),可高效解决复杂问题。

发表在 linux文章 | 留下评论

链表总结

一、基本概念与特性

  1. 定义与结构
    链表是一种物理存储非连续的线性数据结构,其逻辑顺序通过节点间的指针链接实现。每个节点包含两个部分:
    • 数据域:存储实际数据(如整数、字符串等)。 • 指针域:指向下一个节点的地址(单链表),或前驱/后继节点的地址(双向链表)。
  2. 核心特性
    • 动态内存管理:链表节点在运行时动态生成,无需预先分配连续内存空间,适合处理未知规模的数据。 • 高效插入/删除:插入和删除操作的时间复杂度为 O(1)(若已知节点位置),但查找特定节点需要 O(n) 时间。 • 空间开销:每个节点需额外存储指针,空间利用率低于数组。

二、链表的分类

  1. 单向链表
    • 结构:每个节点仅包含指向后继节点的指针。 • 应用场景:简单场景(如栈、队列的实现)或作为其他数据结构的子结构(如哈希桶)。
  2. 双向链表
    • 结构:节点包含前驱和后继指针,支持双向遍历。 • 优势:删除和反向遍历效率高,常用于需要频繁前向/后向操作的数据管理。
  3. 循环链表
    • 结构:尾节点指向头节点,形成闭环,适用于周期性操作(如轮询任务调度)。 • 变体:双向循环链表进一步结合双向指针和循环特性。

三、基本操作与实现

  1. 核心操作
    • 插入 ◦ 头插法:将新节点插入链表头部(需更新头指针)。 ◦ 尾插法:遍历至链表尾部插入节点,时间复杂度为 O(n)。 • 删除 ◦ 头删:直接移动头指针并释放内存。 ◦ 中间删除:需定位前驱节点以调整指针。 • 遍历:从头指针开始逐个访问节点,直至遇到 NULL(单链表)或头节点(循环链表)。
  2. 高级操作
    • 反转链表:通过迭代或递归调整指针方向。 # 示例:Python迭代法反转链表(模拟实现) def reverse(self): prev = None current = self.head while current: next_node = current.next current.next = prev prev = current current = next_node self.head = prev # 网页10 • 合并链表:归并排序中常用双指针法合并有序链表。 • 环形检测:快慢指针法(Floyd算法)判断链表是否存在环。

四、链表的优缺点

优点缺点
动态扩展内存,无需预先分配固定空间查找效率低(需遍历)
插入/删除高效(无需移动其他元素)指针占用额外内存,空间利用率较低
灵活支持复杂操作(如双向遍历)对缓存不友好(非连续存储)

五、应用场景

  1. 内存管理:动态分配内存块时使用链表跟踪空闲内存区域。
  2. 图的邻接表:存储图的顶点及其邻接关系。
  3. 哈希表冲突解决:通过链地址法处理哈希冲突。
  4. 任务调度:循环链表实现轮询调度算法。

六、实现注意事项

  1. 边界处理:需处理空链表、头尾节点等特殊情况(如删除最后一个节点时需更新尾指针)。
  2. 内存泄漏:动态分配节点后需手动释放内存(C/C++中需调用 free()delete)。
  3. 语言差异:
    • Python:通过类模拟链表(如定义 Node 类和 LinkedList 类)。 • C/C++:需显式管理指针和内存。

七、总结
链表是灵活且动态的数据结构,适用于频繁增删的场景,但需权衡其空间开销和查找效率。掌握其核心操作(如插入、删除、反转)及分类特性(如双向、循环)是解决复杂算法问题(如LRU缓存、合并K个有序链表)的关键。

发表在 linux文章 | 留下评论