主要日志文件介绍
内核及公共消息日志 /var/log/messages 记录Linux内核消息及各种应用程序的公共日志信息,包括启动、Io错误、网络错误、程序故障等 对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息 计划任务日志 /var/log/cron 记录crond计划任务产生的事件信息 系统引导日志 /var/log/dmesg 记录Linux系统在引导过程中的各种事件信息 邮件系统日志 /var/log/maillog 记录进入或发出系统的电子邮件活动 用户登录日志 /var /log/lastlog 记录每个用户最近的登录事件,二进制格式 /var/log/secure 记录用户认证相关的安全事件信息 /var/log/wtmp 记录每个用户登录、注销及系统启动和停机事件,二进制格式 /var/run/btmp 记录失败的、错误的登录尝试及验证事件,二进制格式
对 su 命令的访问受到限制。
分配给组有无权限,通过组的划分来限制su命令的使用1.
确保系统帐户未登录
1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp文件。w命令输出的信息包括: 用户名称 用户的机器名称或tty号 远程主机地址 用户登录系统的时间 空闲时间(作用不大) 附加到tty(终端)的进程所用的时间(JCPU时间) 当前进程所用时间(PCPU时间) 用户当前正在使用的命令 w命令还可以使用以下选项 -h忽略头文件信息 -u显示结果的加载时间 -s不显示JCPU, PCPU, 登录时间
[root@localhost /]# w
11:29:48 up 3:37, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 :0 07:55 3:37m 2.14s 2.14s /usr/bin/Xorg :0 -nr -verb
root pts/0 192.168.19.1 09:42 0.00s 0.38s 0.00s w
root pts/1 192.168.19.1 09:48 3:31 0.08s 0.08s -bash
[root@localhost /]# w -h
root tty1 :0 07:55 3:37m 2.14s 2.14s /usr/bin/Xorg :0 -nr -verb
root pts/0 192.168.19.1 09:42 0.00s 0.38s 0.00s w -h
root pts/1 192.168.19.1 09:48 3:35 0.08s 0.08s -bash
[root@localhost /]# w -u
11:29:56 up 3:38, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 :0 07:55 3:37m 2.14s 2.14s /usr/bin/Xorg :0 -nr -verb
root pts/0 192.168.19.1 09:42 0.00s 0.38s 0.00s w -u
root pts/1 192.168.19.1 09:48 3:39 0.08s 0.08s -bash
[root@localhost /]# w -s
11:29:59 up 3:38, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM IDLE WHAT
root tty1 :0 3:37m /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /
root pts/0 192.168.19.1 0.00s w -s
root pts/1 192.168.19.1 3:42 -bash
[root@localhost /]#
使用who命令查看(登录)用户名称及所启动的进程
who命令用于列举出当前已登录系统的用户名称。其输出为:用户名、tty号、时间日期、主机地址。
1 2 3 4 | [root@localhost /]# who root tty1 2017-11-12 07:55 (:0) root pts/0 2017-11-12 09:42 (192.168.19.1) root pts/1 2017-11-12 09:48 (192.168.19.1) |
补充:users命令,可用于打印输出登录服务器的用户名称。该命令除了有help和version选项外,再没有其他选项。如果某用户使用了多个终端,则相应的会显示多个重复的用户名。
1 2 | [root@localhost /]# users root root root |
使用whoami命令查看你所使用的登录名称
whoami命令用于显示登入的用户名。
1 2 3 4 | [root@localhost /]# whoami root [root@localhost /]# who am i root pts/0 2017-11-12 09:42 (192.168.19.1) |
whoami命令能显示当前登入的用户名称,以及当前所使用的tty信息。该命令的输出结果包括如下内容:用户名、tty名、当前时间日期,同时还包括用户登录系统所使用的链接地址。
1 2 3 4 | [root@localhost /]# who am i root pts/0 2017-11-12 09:42 (192.168.19.1) [root@localhost /]# who mom likes root pts/0 2017-11-12 09:42 (192.168.19.1) |
4. 随时查看系统的历史信息(曾经使用过系统的用户信息)
last命令可用于显示特定用户登录系统的历史记录。如果没有指定任何参数,则显示所有用户的历史信息。在默认情况下,这些信息(所显示的信息)将来源于/var/log/wtmp文件。该命令的输出结果包含以下几列信息:
- 用户名称
- tty设备号
- 历史登录时间日期
- 登出时间日期
- 总工作时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@localhost /]# last root root pts/1 192.168.19.1 Sun Nov 12 09:48 still logged in root pts/0 192.168.19.1 Sun Nov 12 09:42 still logged in root pts/0 192.168.19.1 Sun Nov 12 07:56 - 09:42 (01:45) root tty1 :0 Sun Nov 12 07:55 still logged in root pts/1 192.168.19.1 Thu Nov 9 11:02 - 11:28 (00:26) root pts/0 192.168.19.1 Thu Nov 9 10:47 - 11:28 (00:40) root tty1 :0 Thu Nov 9 10:45 - 11:28 (00:42) root pts/1 192.168.19.1 Thu Nov 9 09:57 - down (00:23) root pts/0 192.168.19.1 Thu Nov 9 08:55 - down (01:24) root pts/1 192.168.19.1 Thu Nov 9 07:13 - 08:55 (01:41) root pts/0 192.168.19.1 Thu Nov 9 03:56 - 08:28 (04:32) root pts/1 192.168.19.1 Thu Nov 9 03:04 - 03:54 (00:49) root pts/0 192.168.19.1 Thu Nov 9 03:01 - 03:54 (00:52) root pts/1 192.168.19.1 Thu Nov 9 02:59 - 02:59 (00:00) root pts/0 192.168.19.1 Thu Nov 9 02:56 - 02:59 (00:02) root tty1 :0 Thu Nov 9 02:50 - down (07:30) wtmp begins Thu Nov 9 02:47:58 2017 |
收集会话启动信息
Linux启动时内核会检测硬件,这些启动信息会很快的在屏幕上闪过(有些发行版则不会显示)。所有内核检测信息,会被记录到内存中的一个保护区段,而用dmesg这个命令则会读取该内存区段的内容。dmesg命令的用法是:dmesg | more,之所以用管道加more命令,是因为dmesg显示的内容太长了,加上more命令可以让显示界面暂停。也可以用管道符加grep命令只选取需要的内容。
常用的日志文件解析
/var/log/boot.log
该文件记录了系统在引导过程中发生的事件就是Linux系统开机自检过程显示的信息。
shell超时设置
为了增强linux系统的安全性,我们需要在用户输入空闲一段时间后自动断开,这个操作可以由设置TMOUT值来实现。将以下字段加入到/etc/profile 中即可(对所有用户生效)。 export TMOUT=900 # 设置900秒内用户无操作就字段断开终端 readonly TMOUT # 将值设置为readonly 防止用户更改 注意:设置了readonly 之后在当前shell下是无法取消的,需要先将/etc/profile 中设置readonly行注释起来或直接删除,logout 后重新login 。 $ export TMOUT=900 $ readonly TMOUT $ unset TMOUT -bash: unset: TMOUT: cannot unset: readonly variable 方式一:设置服务器端 1、echo $TMOUT 如果显示空白,表示没有设置,等于使用默认值0, 一般情况下应该是不超时. 如果大于0,可以在如/etc/profile或者~/.bash_profile之类文件中设置它为0. Definition: TMOUT: If set to a value greater than zero, the value is interpreted as the number of seconds to wait for input after issuing the primary prompt. Bash terminates after waiting for that number of seconds if input does not arrive readonly TMOUT # 将值设置为readonly 防止用户更改。记得设置完后执行source /etc/profile //立即生效 2、修改/etc/ssh/sshd_config文件,将 ClientAliveInterval 0和ClientAliveCountMax 3的注释符号去掉,将ClientAliveInterval对应的0改成60,ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0, 不发送.而ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了.ClientAliveCountMax, 使用默认值3即可.ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开. 正常情况下,客户端不会不响应.最后记得执行/etc/init.d/sshd restart 哦,否则刚才的修改是不会生效的。 想参考更多,请输入man sshd_config了解更多信息 方式二:设置CRT参数(反空闲和屏幕日志记录功能) 1、反空闲 使用SecureCRT远程登录,经常会出现断掉的情况,一般采用top,或者ping某个ip的方式保证ssh连接处于激活状态,其实SecureCRT有一个选项可以设置每隔多少秒自动发送一个信息到服务器端,告诉服务器端客户端还在连接中。服务器的超时时间要大于CRT设置的反空闲时间,不然CRT还没反超时自动连接就被自动断开,那就没啥意义了。具体配置为: 选项------会话选项-----终端-----反空闲,可以设置发送字符串为\n、null或其他信息过去,每10秒发送一次,这样就可以达到每10秒发送一个回车,保证ssh连接处于激活状态。 2、屏幕日志记录功能 屏幕日志记录,可以记录自己执行过的所有命令和输出,便于以后追踪查找问题。 具体配置为: 选项-----全局选项-----默认会话-----编辑默认设置,弹出会话选项框,选择日志文件,可以配置日志文件名、选项、自定义日志数据,具体格式见日志文件名和自定义日志数据替换部分。
配置了密码创建要求。
对于linux可能大家都很少知道有密码策略这回事吧,好多人都认为linux安全机制已经很强大了,而且大多数linux采用可插拔密码认证来加强密码的安全策略,下面就来说说linux的密码策略,linux密码策略要比windows密码策略要强大许多 linux密码策略有以下设置: 密码的最大有效期 密码最长使用时间 密码最小长度 密码失效前提前多少天进行提醒 密码大小写以及数字、特殊字符等限制 新旧密码不能相同 新旧密码长度不能相同 账号锁定时间 账号自动解锁时间 密码策略配置文件路径: 在centos/redhat等系统中路径:/etc/pam.d/system-auth ubuntu等系统中路径:/etc/pam.d/common-password 文件内容如下:(版本不同,内容有一些差别) # /etc/pam.d/common-password - password-related modules common to all services # This file is included from other service-specific PAM config files, # and should contain a list of modules that define the services to be # used to change user passwords. The default is pam_unix. # Explanation of pam_unix options: # The "sha512" option enables salted SHA512 passwords. Without this option, # the default is Unix crypt. Prior releases used the option "md5". # The "obscure" option replaces the old `OBSCURE_CHECKS_ENAB' option in # login.defs. # See the pam_unix manpage for other options. # As of pam 1.0.1-6, this file is managed by pam-auth-update by default. # To take advantage of this, it is recommended that you configure any # local modules either before or after the default block, and use # pam-auth-update to manage selection of other modules. See # pam-auth-update(8) for details. # here are the per-package modules (the "Primary" block) password [success=1 default=ignore] pam_unix.so obscure sha512 # here's the fallback if no module succeeds password requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around password required pam_permit.so # and here are more per-package modules (the "Additional" block) # end of pam-auth-update config 密码过期时间以及有效期等配置文件:/etc/login.defs,文件部分内容: PASS_MAX_DAYS:一个密码可使用的最大天数。 PASS_MIN_DAYS:两次密码修改之间最小的间隔天数。 PASS_MIN_LEN:密码最小长度。 PASS_WARN_AGE:密码过期前给出警告的天数 下面为大家举例说明linux用户密码策略: 设置密码最大使用时间(PASS_MAX_DAYS) 这个用来限制密码最大可以使用的天数。时间到了会强制进行密码锁定。如果忘记修改,那么就无法登录系统。需要使用管理员账户进行解锁后才能继续使用。这个可以在 /etc/login.defs 文件中的PASS_MAX_DAYS参数设置。在企业中一般把这个值设置为30天,也就是一个月修改一次密码。 root@test:/etc# vim login.defs PASS_MAX_DAYS 30 //单位为天数 设置密码最小天数(PASS_MIN_DAYS) 这个是限制多长时间无法进行密码修改。当值为15时,表示15天内无法修改密码,也就是两次密码修改中间最少隔15天,这个可以在 /etc/login.defs 文件中PASS_MIN_DAYS参数设置。企业中一般不对此项进行控制,这个根据自己需求进行修改,我这里设置10天。 root@test:/etc# vim login.defs PASS_MIN_DAYS 10 //单位为天数 设置密码过期前警告(PASS_WARN_AGE) 这个用来提醒用户该进行密码修改了,也就是在密码即将过期的时候,会给用户一个警告提示,在未到最大密码使用时间,会每天进行提醒,这可以提醒用户在密码过期前修改他们的密码,否则我们就需要联系管理员来解锁密码。这个可以在 /etc/login.defs 文件中PASS_WARN_AGE参数设置。 这个企业中一般设置为3天,我这里就设置为3天 root@test:/etc# vim login.defs PASS_WARN_AGE 3 //单位为天数 避免重复使用旧密码 这个用来防止更改密码时设置为旧密码,寻找同时包含“password”和"pam_unix.so"的行,然后再这行后面加上“remember=天数”。这将防止N个最近使用过的密码被用来设置为新密码,这个配置文件是在 /ect/pam.d/common-password 文件中(主要,centos/redhat需要修改:/etc/pam.d/system-auth文件),这个在企业中一般设置为5,我这里就设置5 ubuntu: root@test/etc# vim pam.d/common-password password [success=1 default=ignore] pam_unix.so obscure sha512 remember=5 centos/redhat: root@test/etc# vim pam.d/common-password password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 设置密码复杂度 这个用来控制密码的复杂程度的,应安全性要求,企业里面要求大小写、特殊字符、数字等最受三个进行组合并且长度最少为8。寻找同时包含“password”和“pam_cracklib.so”的一行,并在后面加上“ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1”。这将迫使你在密码中至少包括一个大写字母、两个小写字母、一个数字和一个符号。 ubuntu: root@test/etc# vim pam.d/common-password password requisite pam_cracklib.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1 centos/redhat: root@test/etc# vim pam.d/system-auth password requisite pam_cracklib.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
收集登录和注销事件
/var/log/wtmp
记录每个用户登录、注销及系统启动和停机事件,二进制格式
SSH 相关设置
>SSH MaxAuthTries 设置
MaxAuthTries 1 这里表示只允许输错一回密码.
>SSH 协议设置
>SSH LoginGraceTime 设置
LoginGraceTime表示认证的时限,我们可以调整认证的时间限制
>SSH IgnoreRhosts
>配置 SSH 空闲超时间隔
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port ! # 亦即重复使用 port 这个设定项目即可! Protocol 2,1 # 选择的 SSH 协议版本,可以是 1 也可以是 2 , # 如果要同时支持两者,就必须要使用 2,1 这个分隔了! #ListenAddress 0.0.0.0 # 监听的主机适配卡!举个例子来说,如果您有两个 IP, # 分别是 192.168.0.100 及 192.168.2.20 ,那么只想要 # 开放 192.168.0.100 时,就可以写如同下面的样式: ListenAddress 192.168.0.100# 只监听来自 192.168.0.100 这个 IP 的SSH联机。 # 如果不使用设定的话,则预设所有接口均接受 SSH PidFile / var /run/sshd.pid # 可以放置 SSHD 这个 PID 的档案!左列为默认值 LoginGraceTime 600 # 当使用者连上 SSH server 之后,会出现输入密码的画面, # 在该画面中,在多久时间内没有成功连上 SSH server , # 就断线!时间为秒! Compression yes # 是否可以使用压缩指令?当然可以啰! # 2. 说明主机的 Private Key 放置的档案,预设使用下面的档案即可! HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私钥 HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥 HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥 # 2.1 关于 version 1 的一些设定! KeyRegenerationInterval 3600 # 由前面联机的说明可以知道, version 1 会使用 # server 的 Public Key ,那么如果这个 Public # Key 被偷的话,岂不完蛋?所以需要每隔一段时间 # 来重新建立一次!这里的时间为秒! ServerKeyBits 768 # 没错!这个就是 Server key 的长度! # 3. 关于登录文件的讯息数据放置与 daemon 的名称! SyslogFacility AUTH # 当有人使用 SSH 登入系统的时候,SSH会记录资 # 讯,这个信息要记录在什么 daemon name 底下? # 预设是以 AUTH 来设定的,即是 /var/log/secure # 里面!什么?忘记了!回到Linux 基础去翻一下 # 其它可用的 daemon name 为:DAEMON,USER,AUTH, # LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5, LogLevel INFO # 登录记录的等级!嘿嘿!任何讯息! # 同样的,忘记了就回去参考! # 4. 安全设定项目!极重要! # 4.1 登入设定部分 PermitRootLogin no # 是否允许 root 登入!预设是允许的,但是建议设定成 no! UserLogin no # 在 SSH 底下本来就不接受 login 这个程序的登入! StrictModes yes # 当使用者的 host key 改变之后,Server 就不接受联机, # 可以抵挡部分的木马程序! #RSAAuthentication yes # 是否使用纯的 RSA 认证!?仅针对 version 1 ! PubkeyAuthentication yes # 是否允许 Public Key ?当然允许啦!只有 version 2 AuthorizedKeysFile .ssh/authorized_keys # 上面这个在设定若要使用不需要密码登入的账号时,那么那个 # 账号的存放档案所在档名! # 4.2 认证部分 RhostsAuthentication no # 本机系统不止使用 .rhosts ,因为仅使用 .rhosts 太 # 不安全了,所以这里一定要设定为 no ! IgnoreRhosts yes # 是否取消使用 ~/.ssh/.rhosts 来做为认证!当然是! RhostsRSAAuthentication no # 这个选项是专门给 version 1 用的,使用 rhosts 档案在 # /etc/hosts.equiv配合 RSA 演算方式来进行认证!不要使用 HostbasedAuthentication no# 这个项目与上面的项目类似,不过是给 version 2 使用的! IgnoreUserKnownHosts no # 是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录 # 的主机内容?当然不要忽略,所以这里就是 no 啦! PasswordAuthentication yes# 密码验证当然是需要的!所以这里写 yes 啰! PermitEmptyPasswords no # 若上面那一项如果设定为 yes 的话,这一项就最好设定 # 为 no ,这个项目在是否允许以空的密码登入!当然不许! ChallengeResponseAuthentication yes # 挑战任何的密码认证!所以,任何 login.conf # 规定的认证方式,均可适用! #PAMAuthenticationViaKbdInt yes # 是否启用其它的 PAM 模块!启用这个模块将会 # 导致 PasswordAuthentication 设定失效! # 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定! #KerberosAuthentication no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #KerberosTgtPassing no # 4.4 底下是有关在 X-Window 底下使用的相关设定! X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes # 4.5 登入后的项目: PrintMotd no # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等 # 等,预设是 yes ,但是,如果为了安全,可以考虑改为 no ! PrintLastLog yes # 显示上次登入的信息!可以啊!预设也是 yes ! KeepAlive yes # 一般而言,如果设定这项目的话,那么 SSH Server 会传送 # KeepAlive 的讯息给 Client 端,以确保两者的联机正常! # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会 # 有僵尸程序的发生! UsePrivilegeSeparation yes# 使用者的权限设定项目!就设定为 yes 吧! MaxStartups 10 # 同时允许几个尚未登入的联机画面?当我们连上 SSH , # 但是尚未输入密码时,这个时候就是我们所谓的联机画面啦! # 在这个联机画面中,为了保护主机,所以需要设定最大值, # 预设最多十个联机画面,而已经建立联机的不计算在这十个当中 # 4.6 关于使用者抵挡的设定项目: DenyUsers * # 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部 # 挡吧!若是部分使用者,可以将该账号填入!例如下列! DenyUsers test DenyGroups test # 与 DenyUsers 相同!仅抵挡几个群组而已! |
禁止普通用户使用su命令
# vim /etc/pam.d/su.. ..auth required pam_wheel.so use_uid //去掉此行开头的#号
提高Linux服务器主机的SSH防爆破能力
++ 比如,禁止直接以root用户SSH登录 ++ 可允许zhsan用户SSH登录,然后再通过su -切换为root(或者授予sudo权限) # vim /etc/ssh/sshd_configPermitRootLogin no# systemctl restart sshd
了解用户通过sudo做过哪些操作
# visudo.. ..Defaults logfile=/var/log/sudo //添加此行,要求记录sudo操作到指定文件 # less /var/log/sudo //当用户使用sudo操作后,可以查看此文件新增的内容.. ..
提高LAMP网站的防护能力
1>降低Web数据库的安全风险 ++ 网络防护:防火墙(安全组规则)、流量限制 ++ 服务防护:不提供网络监听/只面向本机、提供网络监听/面向内网个别Web主机或管理机 ++ 用户授权:严格限制用户访问权限(不要轻易给root,不要轻易给all)、来源地址(不要轻易面向所有主机) ++ Web接入:严格控制Web接入的账号设置(包括账号设置文件的访问权限) 比如:/var/www/html/bbs/config/config_global.php 记录了前台Web系统如何访问数据库 比如:/var/www/html/bbs/config/config_ucenter.php 记录了后台Web系统如何访问数据库 ++数据库代码的优化:…… 2>Web服务的安全加固 ++ Web服务配置优化(隐藏版本信息、伪装版本信息-修改源代码重编译、拒绝自动索引、拒绝使用连接文件、……) ++ PHP解析环境配置(关闭系统调用函数、关闭文件上传、图片支持、文件压缩、……) ++ 网络防火墙、系统防火墙、SELinux、SSH远程访问控制、su/sudo的使用和跟踪 ++ Web程序代码的优化(SQL注入的输入验证) ++ WAF防火墙、…… !!!! 默认情况下,各种云服务器的防护墙、SELinux都是关闭的 !!!! 云服务商会提供安全防护产品(基础主机防护、云备份、WAF防火墙、DDoS高防、负载均衡、CDN、……)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~