一 Linux服务器安全与运维
1.账户和登录安全
可删除的默认无用用户:
adm lp sync shutdown halt news uucp operator games gopher
可删除的默认无用组:
adm lp uucp games dip pppusers popusers slipusers
关闭不需要的服务:
anacron auditd autofs avahi-daemon avahi-dnsconfd bluetooth cupspeed firstboot gpm haldaemon hidd ip6tables ipsec isdn lpd mcstrans messagebus netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmail setroubleshoot yppasswdd ypserv.
[chkconfig --level 345 anacron off]
将SSH客户端生成的密钥放置服务端 启用Publickey认证
mkdir /home/test/.ssh
chmod 700 /home/test/.ssh
ssh-keygen -i -f test.pub >> /root/.ssh/authorized_key2
vim /etc/ssh/sshd_config
Protocol 2                                                         #仅使用SSH2认证
PubkeyAuthentication yes                                #启用PublicKey认证
AuthorizedKeysFile .ssh/authorized_key2        #PublicKey文件路径
PasswordAuthentication no                             #不使用口令认证
/etc/rc.d/init.d/sshd restart
开放普通用户单文件特权   (使用sudo 访问无权限的文件 输入密码后获得5分钟的访问券)
vim /etc/sudoers
test01 ALL = /bin/more /etc/shadow
#无需密码的方式
test01 ALL = NOPASSWD: /etc/init.d/nagios restart 
#普通用户提权为超级用户并不需要密码
test01 ALL=(ALL) NOPASSWD: ALL
系统登录欢迎信息
/etc/issue /etc/issue.net /etc/redhat-release /etc/motd
vim /etc/ssh/sshd_config 
Banner /etc/issue.net
禁止Ctrl+Alt+Del 关机
centos5.x
vim /etc/inittab
ca::ctrlaltdel:/sbin/shutdown -t3 -r now           #将此行注释
telinit q
centos6.x
vim /init/control-alt-delete.conf
exec /sbin/shutdown -r now "Control-Alt-Delete pressed"   #注释此行
禁止telnet方式认证登录
vim /etc/ssh/sshd_config
修改shell历史记录长度
vim /etc/bashrc
HISTFILESIZE=10000
HISTSIZE=10000
HISTTIMEFORMAT='%F %T'
export HISTTIMEFORMAT

/etc/profile

#history
USER_IP= `who -u am i 2>/dev/null |awk '{print $NF}'|sed -e 's/[()]//g'`
HISTDIR=/usr/share/.history
if [ -z $USER_IP]
then
USER_IP=`hostname`
fi
if [ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
if [ ! -d $HISTDIR/${LOGNAME} ]
then 
mkdir -p $HISTDIR/${LOGNAME}
chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=10000
DT=`date +%Y%m%d_%H%M%s`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DY"
export HISTTIMEFORMAT="{%Y.%m.%d %H:%M:%S}"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
-------------------------------------------------------------
文件权限检查
任何用户都有写权限
find / -type f -perm -2 -o -perm -20 |xargs ls -al
find / -type d -perm -2 -o -perm -20 |xargs ls -al
含有s位的程序
find / -type f -perm -4000 -o -perm -2000 -print |xargs ls -al
查询含有suid和sgid文件
find / -user root -perm -2000 -print -exec md5sum {} \;
find / -user root -perm -4000 -print -exec md5sum {} \;
查询没有属主的文件
find / -nouser -o nogroup 
/tmp单独分区时安全的挂载方式
LABEL=/tmp    /tmp    ext4    rw,nosuid,noexec,nodev    0 0
/tmp是目录的安全挂载方式 [启动loopback文件系统]
dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
mke2fs -j /dev/tmpfs
cp -av /tmp /tmp.old
mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
chmod 1777 /tmp
mv -f /tmp.old/* /tmp
rm -rf /tmp.old
vim /etc/fstab 
/dev/tmpfs /tmp ext4 loop,nosuid,noexec,rw 0 0
/dev/shm 安全挂载方式
vim /etc/fstab
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
文件级rootkit
检查文件完整性:Tripwire aide
后门检测工具 chkrootkit
避免chkrootkit依赖的工具被污染提前备份一份完整所需工具至指定目录
mkdir /usr/share/.commands
cp `which --skip-alias awk cut echo find egrep id head ls netstat ps strings sed uname` /user/share/.commands 
chkrootkit -p /usr/share/.commands/
检测工具2 RKHunter            
#./installer.sh --layout default --install
rkhunter -c
rkhunter --check --skip-keypress     #静默检查
09 3 *** root rkhunter --check --cronjob
pidof 
2.网络安全运维
Ntop:嗅探网络数据包类型,分析区分数据流量
Ntopng 
iperf:网络性能评估工具
iperf3 -c 192.168.12.168
iperf3 -c 192.168.12.168 -t 20 -i 5
iperf3 -c 192.168.12.168 -i 10 -n 5000000000  #每隔十秒发送5G的数据
iperf3 -c 192.168.12.168 -F test.tar.gz -i 5 -t 20 -f M
iperf3 -c 192.168.12.168 -u -b 100M -f M -i 3
nmap:网络发现工具
nmap 39.106.125.107
nmap -T4 -A -v 39.106.125.107
nmap -sn -PE -PS22,80 -PU53 www.baidu.com
PE:发送ICMP echo 报文     PS:发送TCP SYN/ACK的形式侦探主机    PU:以UDP形式侦探
nmap -sU -sS -F www.myblogsite.top   
nmap -O --osscan-guess 192.168.3.1-254
3.数据安全
DRDB
yum -y install kmod-drbd83 drbd83
modprobe drbd
lsmod|grep -i drbd
modprobe -l|grep -i drbd
dd创建空数据: dd if=/dev/zero of=/mnt/testblack.tmp bs=10M count=20
数据恢复extundelete:  Linux常用恢复工具:debugfs R-Liunx ext3grep extundelete等.extundelete与ext3grep比较常用,两款工具原理较为相似.前者功能更强大.
通过分析文件系统的日志,解析出所有文件的indoe信息,从而可以恢复Linux下主流的ext3 ext4文件系统下被误删除的文件.而ext3grep仅支持ext3文件系统,此外在恢复速度上前者要更快,是通过扫描inode和数据恢复同时进行,且支持单文件 单目录 inode恢复 block恢复与完整磁盘恢复.而ext3grep略显笨拙需要扫描所有inode信息然后开始恢复数据,速度上相对比较慢且不支持目录 时间恢复等.
前置安装e2fsprogs与e2fsprogs-libs
1.误操作删除需要立即将分区卸载.
2.extundelete /dev/sdc1 --inode 2
3.extundelete /dev/sdc1 --restore-file passwd   #单文件恢复
4.extundelete /dev/sdc1 --restore-directory /ganglia-3.4.0  #单目录恢复
5.extundelete /dev/sdc1 --restore-all  #全部文件恢复
6.extundelete --after 1379146740 --restore-all /dev/sdc1  #恢复一小时内文件   当前 date +%s-3600
4.Linux系统运维故障排查思路
Linux系统常见无法启动
a.文件系统受损 [ext3 ext4文件系统都是具备日志记录功能的日志文件系统,并且可以进行简单的容错与纠错.日志文件系统并不是将数据实时写入到磁盘,而是定期批量写入,但文件系统的所有读写操作都会实时记录到日志文件中,当系统发生掉电等错误导致数据没有写入磁盘时可以通过日志文件的记录回滚发生故障的读写操作,从而保证数据和文件系统的一致性,但是由于实际环境复杂多样导致文件系统不能每一次都可以成功自我修复,这是就需要运维人员手动介入修复.]
掉电开机提示:  /dev/sda6 contains a file system with errors,check forced
/dev/sda6:UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY
(or type Control-D to continue):
give root password for maintenance
输入root密码后进入修复模式,使用fsck命令修复.
fsck.ext3 -y /dev/sda6          [无法恢复的数据会存放在文件系统lost+found目录中]    (fsck -A -y)
若忘记root密码
centos6.x
1.引导参数中增加  init=/bin/bash 载入系统.
2.mount -o remount,rw /             #重挂根
3.passwd                                       #修改密码
4.重启输入root密码继续修复.
centos7.x
1.引导参数中增加  rd.break console=tty0  载入系统
2.mount remount,rw /sysroot        #重挂根
3.chroot /sysroot                            #切换根
4.passwd          
5.touch /.autorelabel                          
6.exit
7.reboot
b.系统文件配置不当或/etc/fstab文件丢失
开机提示: starting system logger
1.开机使用引导介质进入救援模式  [linux rescue]
2.e2label 可查看每个分区对应的挂载点 
3.查找出原系统的跟分区目录查找出对应分区 如 /dev/sda3
4.创建一个目录 /rescue_tmp 将原根挂载至此    mkdir /rescue_tmp ;mount /dev/sda3 /rescue_tmp
5.vim /rescue_tmp/etc/fstab
6.恢复完成后重启系统.
c.Linux内核丢失或崩溃
d.引导程序出错
e.硬件故障
f.无响应分析
系统硬件问题: SCSI卡 主板 RAID卡 HBA卡 网卡 硬盘等硬件设备导致,通过更换硬件解决
外围硬件问题: 主要为网络问题导致.网络设备 网络参数等方面查找
软件问题: 系统内核bug 应用软件bug 驱动程序bug等  通过升级内核 修复程序bug 更新驱动程序解决
系统设置问题: 防火墙配置 开机启动不正确等.
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT 
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
5.常见故障案例
su 切换普通用户时报错.
报错提示: su: warning: cannot change directory to /home/oracle: Permission denied
su: /bin/bash: Permission denied 
排查思路:
  • 用户目录权限存在问题
    ls -ld /home/oracle 
  • su   程序权限存在问题
    ll /bin/su
  • 程序依赖的共享库问题
    ldd /bin/su 
  • SELinux问题
    grep "SELINUX" /etc/selinux/config
  • 系统根分区问题
    检查剩余容量
    检查根分区权限
创建文件提示: Cannot make directory: file:/www/data/html          [Read-only file system]
原因比较多,可能是文件系统数据块出现不一致导致,也可能是磁盘故障导致.可以尝试fsck修复
1.卸载无法写入的磁盘.
2.若有占用则查询占用端口  fuser -m /dev/sdb1    查找出占用进程
3.停止进城后卸载目录
4.进行修复   fsck -V -a /dev/sdb1
5.重新挂会
操作大量文件时遇到 Argument list too long     getconf ARG_MAX  控制传递参数
手动分批删除
find传递删除
shell脚本循环删除
重新编译linux内核  include/liunx/binfmts.h文件 #define MAX_ARG_PAGES 32   将32改为64或128.重新编译
inode消耗殆尽 
dumpe2fs -h /dev/sda3|grep 'Inode count'
文件删除后空间不释放:  文件存放分为数据部分和指针部分,指针部分位于文件系统的meta-data中,将数据清除后指针从meta-data中被清除.将数据对应的指针清除后空间随之释放.
进程占用不断的写数据导致
Too many open files 
ulimit -n              [/etc/security/limits.conf]
www soft nofile 65535
www hard nofile 65535
内核文件大小限制
进程数据块大小限制
shell进程创建文件大小限制
可加锁内存大小限制
常驻内存集的大小限制
打开文件句柄数限制
分配堆栈的最大大小限制
CPU占用时间限制用户最大可用的进程数
shell进程所能使用的最大虚拟内存限制
No speace left on device:mod_rewrite:could not create rewrite_log_lock Configyration Failed  
信号量占尽.  ipcs -s |grep nobody|perl -e 'while (<STDIN> { @a=split(/\s+/); print `ipcrmsem $a[1]`})'
6.轻量级运维利器pssh pdsh mussh
并行ssh运维工具pssh   parallel-ssh  支持文件并行复制/远程并行执行命令/杀死远程主机进程等
&  需要保证本地主机与管理服务器之间单向信任
&  Python版本大于2.4
&  附带5个主程序 
ssh(pssh)          远程主机并行运行命令
scp(pscp)          复制文件至远程多台主机
rsync(prsync)    使用rsync协议将文件从本地同步到远程多台主机
nuke(pnuke)     在远程主机并行killall某进程
slurp(pslurp)     将文件从远程主机复制到本地
查看user002 003的时间
pssh -H opsuser@user002.bestbook.com:9529 -P date
pssh -H user003.bestbook.com -i date
批量管理列表  /etc/pssh/hosts
批量下发命令
获取运行时间 
pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime"        -O "StrictHostKeyChecking=no"  让远程主机自动接受本地hostkey
解压文件
passh -i -h /etc/pssh/hosts "tar -xzvf test.zip"
连接指定端口
passh -i -x "-l opsuser" "-p 9529" -h /etc/pssh/hosts -o /etc/pssh/info "uptime;name-a"                          
本地文件推送给批量远端
pscp -h /etc/pssh/hosts /etc/ssh/ssh_config /tmp
pscp -h /etc/pssh/hosts -r /etc/httpd/conf /tmp  
本地拉取远端文件
pslurp -h /etc/pssh/hosts -L /home/opsuser/test > /home/opsuser/gmond.conf gmond1.conf
pslurp -h /etc/pssh/hosts -r -L /home/opsuser/test > /home/opsuser/gmond gmond1
本地文件同步到远程主机
prsync -h /etc/pssh/hosts -l opsuser -a -r /etc/httpd /tmp
prsync -h /etc/pssh/hosts -l opsuser -az -r /var/log/httpd /tmp               #压缩传输
杀死远端进程
punke -h /etc/pssh/hosts httpd
分布式运维工具pdsh  parallel distributed shell  适用于大批量服务器配置/部署/文件复制/运维等操作
&  需要保证本地主机与管理服务器之间的单向信任
&  默认rsh方式  支持ssh mrsh qsh mqsh krb4 xcpu 等多种rcmd模块
&  --with-ssh  --with-dshgroups  --with-machines  --with-dshgroups
&  传输文件时 本地与远端都必须安装pdcp
批量统计信息
pdsh -w ssh:192.168.16.[1-3]  "uname -n"
pdsh -w ssh:user00[1-5] -x user003 "uptime"
pdsh -w ssh:user00[10-31],/15/ "uptime"
文件批量调用
/etc/pdsh/machines
pdsh -R ssh -a uptime
pdsh -R ssh -g userhosts uptime
pdsh -R ssh -a -X userhosts uptume
交互模式
pdsh -R ssh -w user001
文件传输
pdcp -R ssh -g userhosts /home/opsuser/mysqldb.tar.gz /home/opsuser
pdcp -R ssh -w userhosts -r /home/opsuser/webdata /home/opsuser
多主机ssh封装mussh  MUltihost SSH Wrapper
&  需要保证本地主机与管理服务器之间的单向信任
批量命令:
mussh -h opsuser@user01 opsuser@user02 -c uptime
文件批量命令       /home/opsuser/myhosts
mussh -H myhosts -l opsuser -c uptime
本地脚本远端执行
mussh -o "port=22" -H myhosts -s /usr/bin/python -C "/home/opsuser/checkos.py"
7.分布式监控
Ganglia HPC(高性能计算集群) 采集CPU 内存 硬盘使用率 I/O负载 网络流量等情况汇总到gmetad守护进程下,使用rrdtool存储数据.以曲线方式展示
&  gmond: ganglia monitoring daemon 守护检测进程默认监听8649
&  gmetad:ganglia meta daemon 数据汇聚守护进程,将数据存储至RRD引擎中
&  webfrontend:从gmetad中读取RRD数据通过rrdtool生成图表
gmetric -n disk_used -v 40 -t int32 -u '% test' -d 50 -s '8.8.8.8:cloud1'
8.高性能Nginx服务器
HTTP/IMAP/POP3/SMTP代理服务器
--with-http_stub_status_module    #开启nginx status功能 监控状态
--with-http_gzip_static_module     #开启Gzip压缩功能
select          标准工作模式1
poll             标准工作模式2
kqueque     高效工作模式1
epoll           高效工作模式2
rtsig            
/dev/poll
max_client=worker_processes * worker_connections(默认1024)   #ulimit -n 65536
sendfile  on; tcp_nopush on ; tco_nodelay on;
开启ngin运行状态
localtion /NginxStatus {
stub_status                 on;
access_log                  logs/NginxStatus.log;
auth_basic                  "NginxStatus";
auth_basic_user_file   ../htpasswd;
}
htpasswd -C htpassswd password
信号处理:
QUIT:  15   处理完当前请求关闭进程
HUP:         重载配置,关闭原由进程开启新进程,不中断请求
USR1:        Nginx日志切割
USR2:        平滑升级
WINCH:     从容关闭
rewrite重写 来自www.taob.com的请求至www.tb.com 
service {
service_name  www.taob.com;
rewirte ^/(.*)$  http://www.tb.com/$1 permanent;   #301 redirect 302
}
基于核心变量$host实现重定向
service {
server_name  www.tb.com www.taob.com;
if ($host != 'www.tb.com') {
rewirte ^/(.*)$ http://www.tb.com/$1 permanent;
}
}
禁止访问特定资源
location ~* \.(txt|doc)$ {
root /data/www/wwwroot;
deny all;
}
Nginx内置变量
$args                       与请求行的参数相等
$document_root     当前root命令指定的值
$uri                          当前request中的URI
$document_uri        同等$uri
$host                       与头部"Host"行的值一致
$limit_rate               限制连接速率
$request_method    同等于request的method GET或POST
$remote_addr          客户端IP
$remote_port           客户端端口
$remote_user           用户名  ngx_http_auth_basic_module认证
$request_filename    当前请求的文件的路径名,由root或alias与URI request组合而成
$request_uri              参数完整的初始URI
$query_string            与$args一致
$server_name            请求到达的服务器名
$server_port               请求到达的端口号
location ~ ^/best/ {
rewirte ^/best/(.*)$ /test/$1 break;
proxy_pass http://www.taob.com;
}
location / {
proxy_pass http://127.0.0.1:8080/;
set $query $query_string;
rewrite /dade /wordpress?$query?;
}
可将http://www.tb.com/wp/?p=160的页面重写到www.tb.com/wordpress/?p=160
service {
listen             80;
server_name www.tb.cn  www.taob.com;
if ($host != 'www.tb.cn') {
rewirte ^/(.*)$ http://www.tb.cn/error.txt  bread;
rewirte ^/(.*)$ http://www.tb.cn/$1 permanent;
}
}
nginx 编译时注释 auto/cc/gcc 的  CFLAGS="$CFLAGS -g"
--with-cc-opt='-O3'
--with-cpu-opt=CPU  [pentinm pentiumpro pentium3 pentium4 athlon opteron adm64 sparc32 sparc64 ppc64]     cat /proc/cpuinfo  |grep "model name"
TCMalloc 优化Nginx性能 
1.安装libunwind库
2.安装google-perftools
3.重新编译nginx 添加参数 --with-google_perftools_module
4.添加google-perftools线程目录  0777 权限
5.nginx主配置文件pid处写入 google_perftools_profiles /tmp/tcmalloc;
6.重启nginx 验证
针对nginx的内核优化   /sbin/sysctl -p
net.ipv4.tcp_max_tw_buckets = 6000               #timewait数量  默认180000
net.ipv4.ip_local_port_range = 1024 65000     #允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1                              #启用timewait快速回收
net.ipv4.tcp_tw_reuse = 1                                 #允许TIME-WAIT sockets
net.ipv4.tcp_syncookies = 1                             #SYN等待队列溢出时启用cookies处理
net.core.somaxconn = 262144                         #tcp并发连接 默认 128
net.core.netdev_max_backlog = 262144          #网口数据包速率比内核处理快时允许等到的队列大小
net.ipv4.tcp_max_orphans = 262144                #设定最大套接字不被关联到任何用户文件句柄上
net.ipv4.tcp_max_syn_backlog = 262144          #记录尚未收到客户端确认信息的连接请求最大值
net.ipv4.tcp_synack_retries = 1                         #内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retres = 1                               #内核放弃建立连接前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1                             #保持FIN-WAIT-2状态的时间 默认60
net.ipv4.tcp_keepalive_time = 30                      #keepalive启动时tcp发送的频度 默认2

高性能Linux架构实战 [高俊峰] 笔记摘要相关推荐

  1. 高性能Mysql运维应用实战-高俊峰-专题视频课程

    高性能Mysql运维应用实战-8242人已学习 课程介绍         爱维Linux独家出品,本课程从mysql运维的方方面面进行介绍,主要对mysql版本的选择,mysql平台的部署,优化.调优 ...

  2. 企业Web常用架构LAMP-LNMP实战-高俊峰-专题视频课程

    企业Web常用架构LAMP-LNMP实战-8501人已学习 课程介绍         本课程针对企业级常用的web运维技术Linux+apache+Mysql+php以及Linux+nginx+Mys ...

  3. 企业级架构apache/PHP/tomcat架构应用实战-高俊峰-专题视频课程

    企业级架构apache/PHP/tomcat架构应用实战-4807人已学习 课程介绍         本课程主要介绍企业级常见的apache/PHP/tomcat常见应用架构的使用经验和技巧. 课程收 ...

  4. 新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路

    谈到运维,监控应该是运维的重中之重.怎么说呢?有很多人说这个监控应该是运维的第三只眼睛,一个好的监控平台对我们这个工作本身来说,应该有很大的帮助.那么,如何要构建一个完善的监控平台.那就是我们今天要讨 ...

  5. 企业Web服务器Nginx应用实战-高俊峰-专题视频课程

    企业Web服务器Nginx应用实战-6850人已学习 课程介绍         nginx,当今流行的web服务器,运维流行web平台,高薪运维,作为一个轻量级的HTTP服务器,Nginx与Apach ...

  6. linux集群课程,超全Linux集群技术高俊峰-实战式教学视频课程(43讲全)

    超全Linux集群技术高俊峰-实战式教学视频课程(43讲全) 1.jpg (63.6 KB, 下载次数: 0) 2016-4-27 11:41 上传 1.jpg (38.51 KB, 下载次数: 0) ...

  7. 【资源分享】高俊峰老师作品《linux集群应用实战》 视频源码分享

    [size=medium][size=x-small]大家好, 与大家分享一些linux集群的学习资料,对开发入门或者是想提升技术高度的同学可能会比较有用,希望可以帮助到大家,祝大家都能够学习进步,事 ...

  8. 企业运维监控平台架构设计与实现-高俊峰-专题视频课程

    企业运维监控平台架构设计与实现-8364人已学习 课程介绍         爱维Linux独家出品,本课程主要介绍了企业常见的运维监控平台的构建思路和常用软件,讲述了cacti.nagios.zabb ...

  9. MYSQL企业常见架构与调优经验分享-高俊峰-专题视频课程

    MYSQL企业常见架构与调优经验分享-8967人已学习 课程介绍         爱维Linux独家发行,从MYSQL系统安装.配置入手,从多个方面深入介绍MYSQL的使用技巧和调优策略,大限度发挥M ...

最新文章

  1. 使用javascript模拟常见数据结构(二)
  2. 如何优雅的实现 Spring Boot 接口参数加密解密?
  3. mysql view 能和表关联吗_MySQL 事务隔离及实现,赶快码上收藏!满满干货
  4. 物体可见性信息在3D检测中的探索CVPR2020(oral)
  5. 一些随笔,我有故事,你有酒吗
  6. 一举打败16个同类模型,视频超分比赛冠军算法入选CVPR 2022,来自商汤南洋理工大学...
  7. zzfrom水木-Linux环境学习和开发心得(作者:lunker)
  8. java中io流案例_Java IO流的简单使用 通俗易懂 超详细 【内含案例】
  9. oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能
  10. Cortex-M3-指针和野指针
  11. python 虚拟环境 mac,Mac下python 虚拟环境安装
  12. WebAPI(part7)--Tab栏切换案例
  13. 设计模式之--原型模式
  14. 帝国 listenews.php,帝国cms7.2后台信息列表页批量添加tags
  15. linux 安装sysstat使用iostat、mpstat、sar、sa(转载)
  16. Linux中如何通过命令行访问Dropbox
  17. 类型的取值范围_Java基础类型取值范围,从基础的理解加深记忆
  18. python字符串isalnum()函数
  19. 第22节 软件工程知识
  20. html 嵌入编辑excel 开源_网页中嵌入Excel控件

热门文章

  1. 考研英语单词学习--单词资料整理
  2. oracle system和sysaux表空间清理和回收
  3. VUE 记一次高德地图和Echarts(中国地图)
  4. vue 获取视频第一帧
  5. Google软件工程(续)
  6. 仿生蛇形机器人01、Dynamixel MX-64AR舵机控制例程的使用【Python 1.0协议】
  7. 75.功能测试中重复测试很多,你怎么看待这个问题?
  8. js es6 Thread.sleep如何使用
  9. 大学生国家安全教育答案---【快捷查询】
  10. 关于五险一金你需要知道的事情