朋友的阿里云服务器一早上报木马入侵,找我处理,登陆阿里云查看警告信息“恶意进程(云查杀)-XorDDoS木马”,

本文也可以作为服务器处理木马排查的步骤的参考文章

排查原则:

1.一般的木马都有多个守护进程,不一定可以短时间停掉,或者处理好,要注意备份业务数据

2.如果木马运行影响到业务运行,首先要恢复业务的访问,同时进行排查处理,但是并不建议

3.如果没有太大影响,可以先停掉相关业务进程,防止查杀过程的操作对业务产生影响

生产环境注意根据实际情况决策

处理木马病毒的顺序:

1.关闭对外访问
2.停止定时任务
3.关闭木马的守护进程
4.禁止木马程序运行
5.删除开机自启动的木马程序
6.重启服务器测试木马是否清理完成

1.确认木马类型,关闭对外访问

从阿里云平台得知是DDOS的木马,可能对服务器性能造成影响,对业务数据不一定有影响

1.1.检查服务器对外的访问,获取相关IP地址

先登录到服务器上查看进程:

  1. [root@web ~]# netstat -anptl
  2. Active Internet connections (servers and established)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
  5. tcp 0.0.0.0: 0.0.0.0:* LISTEN /nginx
  6. tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
  7. tcp 1.1.1.1: 2.2.2.2: ESTABLISHED /sshd
  8. tcp 1.1.1.1: 104.166.89.67: ESTABLISHED /bash # 异常IP
  9. tcp 1.1.1.1: 106.11.68.13: ESTABLISHED /AliYunDun

可以看到有一个对外访问的IP:104.166.89.67,明显这个是有问题的,记录下来

我这里业务的访问量不大,暂时停掉服务,排除干扰

  1. [root@web ~]# service mysqld stop
  2. Shutting down MySQL.. [ OK ]
  3. [root@web ~]# service nginx stop
  4. Stopping nginx: [ OK ]

结束掉相关进程,再次查看

  1. [root@web ~]# !net
  2. netstat -anptl
  3. Active Internet connections (servers and established)
  4. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  5. tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
  6. tcp 1.1.1.1: 2.2.2.2: ESTABLISHED /sshd
  7. tcp 1.1.1.1: 91.195.240.82: SYN_SENT /sh
  8. tcp 1.1.1.1: 106.11.68.13: ESTABLISHED /AliYunDun

这次更换的IP是91.195.240.82,记录下来

多次杀掉相关异常进程,确认对外连接的只有这两个IP,顺便查询下归属地

  1. 104.166.89.67 美国
  2. 91.195.240.82 德国

1.2.利用防火墙禁用本机对外的IP访问

为了防止对外访问造成数据问题,首先要禁用这些IP的出入站访问

  1. iptables -I INPUT -s 104.166.89.67/ -j DROP
  2. iptables -I OUTPUT -s 104.166.89.67/ -j DROP
  3. iptables -I INPUT -s 91.195.240.82/ -j DROP
  4. iptables -I OUTPUT -s 91.195.240.82/ -j DROP

查看并保存下防火墙规则

  1. chkconfig iptables on
  2. service iptables save
  3. cat /etc/sysconfig/iptables
  4. service iptables start
  5. iptables -nL

以下是保存生效的防火墙规则

  1. [root@web ~]# cat /etc/sysconfig/iptables
  2. # Generated by iptables-save v1.4.7 on Wed Jul ::
  3. *nat
  4. :PREROUTING ACCEPT [:]
  5. :POSTROUTING ACCEPT [:]
  6. :OUTPUT ACCEPT [:]
  7. COMMIT
  8. # Completed on Wed Jul ::
  9. # Generated by iptables-save v1.4.7 on Wed Jul ::
  10. *filter
  11. :INPUT ACCEPT [:]
  12. :FORWARD ACCEPT [:]
  13. :OUTPUT ACCEPT [:]
  14. -A INPUT -s 91.195.240.0/ -j DROP
  15. -A INPUT -s 104.166.89.0/ -j DROP
  16. -A OUTPUT -s 91.195.240.0/ -j DROP
  17. -A OUTPUT -s 104.166.89.0/ -j DROP
  18. COMMIT
  19. # Completed on Wed Jul ::
  1. [root@web ~]# iptables -nL
  2. Chain INPUT (policy ACCEPT)
  3. target prot opt source destination
  4. DROP all -- 91.195.240.0/ 0.0.0.0/
  5. DROP all -- 104.166.89.0/ 0.0.0.0/
  6.  
  7. Chain FORWARD (policy ACCEPT)
  8. target prot opt source destination
  9.  
  10. Chain OUTPUT (policy ACCEPT)
  11. target prot opt source destination
  12. DROP all -- 91.195.240.0/ 0.0.0.0/
  13. DROP all -- 104.166.89.0/ 0.0.0.0/

1.3.防火墙处理完,再查看进程访问状态

  1. [root@web ~]# !net
  2. netstat -anptl
  3. Active Internet connections (servers and established)
  4. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  5. tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
  6. tcp 1.1.1.1: 2.2.2.2: ESTABLISHED /sshd
  7. tcp 1.1.1.1: 91.195.240.82: SYN_SENT /sh
  8. tcp 1.1.1.1: 106.11.68.13: ESTABLISHED /AliYunDun

可以看到该IP已经无法对外建立连接,多次kill掉,虽然会重建,但无法对外进行访问,不过进程名会变化

用 iptables 封禁向外请求的 ip 后,该清理木马了

2.停止定时任务

对于所有的木马或病毒,必定会创建定时任务,以便定时重建进程,或者在被杀掉后重建

2.1.检查系统级别的定时任务配置

  1. vim /etc/crontab
  2. ------------------------------
  3. */ * * * * root /etc/cron.hourly/gcc.sh
  4. ------------------------------

发现被增加了一项异常的定时任务,先注释掉,过几分钟又会重新创建,先不操作

2.2.检查用户级别的定时任务配置文件

  1. ll /var/spool/cron/

该目录用于保存以用户名作为文件的定时任务,没有文件表示没有用户级别的定时任务

2.3.查看木马创建的定时任务的内容

  1. vim /etc/cron.hourly/gcc.sh
  2. ------------------------------
  3. [root@web tools]# vim /etc/cron.hourly/gcc.sh
  4. #!/bin/sh
  5. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
  6. for i in `cat /proc/net/dev|grep :|awk -F: {'print $1'}`; do ifconfig $i up& done
  7. cp /lib/libudev.so /lib/libudev.so.
  8. /lib/libudev.so.
  9. ------------------------------

由脚本内容可以推断,以下文件是木马文件

  1. /lib/libudev.so
  2. /lib/libudev.so.

2.4.处理相关木马文件

尝试失败的处理方法:
手动清理木马文件,清除定时任务配置,不久就会重新产生

可以成功的处理方法:

对于木马文件,删除会重建,可以修改权限,使之无法运行,但不要删掉

  1. chmod /lib/libudev.so
  2. chmod /lib/libudev.so.

对于定时任务,删除或者注释都会被删掉重写,可以设置权限,使crontab文件无法写入

  1. chattr +i /etc/crontab

处理完以上的文件,定时任务就无法运行了,接下来需要处理木马的相关进程

3.查杀木马

方法:查看进程,确认木马进程名,找到对应的程序文件

3.1.检查确认系统命令工具是否被替换

下载并安装 rkhunter,扫描 Rootkit 替换的系统程序

  1. wget https://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
  2. tar xzvf rkhunter*
  3. cd rkhunter*
  4. ./installer.sh --layout /usr --install
  5. rkhunter --update
  6. rkhunter -C

我这边没有命令被替换,如果有,需要重装被修改的命令工具

看网络上有其他人的以下命令被替换了

  1. ps, lsof, ss, netstat
  2. ps 属于 procps
  3. ss 属于 iproute
  4. netstat 属于 net-tools
  1. yum -y reinstall procps lsof iproute net-tools

3.2.查找木马进程文件的方法

1)查看系统进程找到木马进程名

  1. pstree    # 查看进程树
  2. ps -aux    # 查看进程
  3. top

使用top命令查看的结果,以CPU倒序的方式查看,可以看到占用 CPU 最多的进程,类似这样的 “jlavwskubs” (是十位随机名称进程),

用kill -9杀死进程后,会出现类似的十位随机名称进程,可以看出有多个守护进程,显然没用

使用pstree也可以看到类似的十位随机名称的进程,还有子进程数量

2)通过木马进程的PID找到木马文件的位置

原理:Linux在启动一个进程时,系统会在 /proc下创建一个以 PID 命名的文件夹,在该文件夹下会保存该进程的信息,其中包括一个名为exe的文件指向该进程对应程序文件的绝对路径

所以:使用以下命令查看木马进程运行目录

  1. ll /proc/[木马PID]

exe文件指向的文件即为木马进程文件

3)使用lsof命令查找木马文件的位置

原理:用 lsof 可以查看某个路径下的运行中的进程列表

  1. lsof /usr/bin/*

实例如下:

  1. lsof /usr/local/nginx/sbin/*
  2. [root@web virus]# lsof /usr/local/nginx/sbin/*
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. nginx 1481 root txt REG 252,1 5389099 1977535 /usr/local/nginx/sbin/nginx
  5. nginx 1484 root txt REG 252,1 5389099 1977535 /usr/local/nginx/sbin/nginx

4)用 pidof 命令可以查看某个路径下运行进程的 pid

  1. pidof /usr/bin/*

实例如下:

  1. pidof /usr/local/nginx/sbin/*
  2. [root@web virus]# pidof /usr/local/nginx/sbin/*
  3. 1484 1481

发现木马进程的运行目录,可以通过管道符 | 和 xargs 将 pid传参给kill命令进行结束:

  1. pidof /usr/bin/* | xargs kill -9

5)使用which查找木马进程文件的所在位置

  1. which [木马进程名]

3.3.尝试解析木马进程文件内容

1)确定木马文件所在位置,备份下该木马文件

  1. mkdir -p /tmp/virus
  2. cp /usr/bin/jlavwskubs /tmp/virus/usr-bin-jlavwskubs

2)直接打开该文件会显示乱码,可以通过 strings 命令把二进制的木马文件转化成可识别的字符

  1. cd /tmp/virus
  2. strings usr-bin-jlavwskubs >usr-bin-jlavwskubs.txt

3)查找转化后的文件内容可以看到:

  1. sed -i '/\/etc\/cron.hourly\/gcc.sh/d' /etc/crontab && echo '*/3 * * * * root /etc/cron.hourly/gcc.sh' >> /etc/crontab

这一行是修改定时任务的命令,也就是前面注释掉定时任务又会重新生成的原因,不管有没有,强制重建

  1. #!/bin/sh
  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
  3. for i in `cat /proc/net/dev|grep :|awk -F: {'print $1'}`; do ifconfig $i up& done
  4. cp /lib/libudev.so /lib/libudev.so.
  5. /lib/libudev.so.

这个是上面定时任务执行的gcc.sh脚本的内容,

3.4.木马程序文件的处理:

删除会重建,可以照上面的修改权限,使之无法运行,不要删掉

  1. chmod /usr/bin/jlavwskubs

至此,上面定时任务涉及到的就都找出来,并停止运行了,木马相关程序也形成了个闭环,但是此时放松还为时尚早

作为一个合格的木马,必定会设置开机启动项,这样不管你怎样清理掉我运行中的木马,一旦重启系统,木马就又回来了,所以

4.删除开机自启动的木马程序

4.1.检查最基本的开机启动项配置文件

  1. cat /etc/rc.local

4.2.检查chkconfig方法配置的自启动的服务

1)可以找到上面的jlavwskubs程序

  1. chkconfig --list|grep on
  2. -----------------------------------------
  3. [root@web ~]# chkconfig --list|grep on
  4. jlavwskubs :off :on :on :on :on :on :off
  5. -----------------------------------------

2)查看该文件内容

  1. cat /etc/init.d/jlavwskubs
  2. -----------------------------------------
  3. #!/bin/sh
  4. # chkconfig:
  5. # description: jlavwskubs
  6. ### BEGIN INIT INFO
  7. # Provides: jlavwskubs
  8. # Required-Start:
  9. # Required-Stop:
  10. # Default-Start:
  11. # Default-Stop:
  12. # Short-Description: jlavwskubs
  13. ### END INIT INFO
  14. case $ in
  15. start)
  16. /usr/bin/jlavwskubs
  17. ;;
  18. stop)
  19. ;;
  20. *)
  21. /usr/bin/jlavwskubs
  22. ;;
  23. esac
  24. -----------------------------------------

可以看出,无论怎样操作这个程序,都是启动它,并且在12345模式下都会开机自启动
3)接下来找这个启动的源文件,找十位随机名称的进程文件

  1. ls /etc/rc*/init.d
  2. ls /etc/rc*/

  1. ls /etc/rc*/
  2. -----------------------------------------
  3. [root@web ~]# ls /etc/rc*/
  4. /etc/rc0.d/:
  5. K01agentwatch K25sshd K50cloud-init-local K75blk-availability K87restorecond K89rdisc K90gfkexlpwho K90luobdoxchv K90xfeualnqzg K95rdma
  6. K05atd K30postfix K50cloud-init-upgrade K75netfs K88auditd K90apjpqfyeom K90hnipcstryl K90network K90xfvzcygkae K99lvm2-monitor
  7. K05jexec K36mysqld K60crond K75ntpdate K88iscsi K90cpaanfozrw K90imipfrazsb K90otgsovjinw K90yidoxmlkvd K99sysstat
  8. K10saslauthd K50cloud-config K61nfs-rdma K75udev-post K88rsyslog K90dgznpnhhcv K90jlavwskubs K90qfkxlouaux K90yxexqdafhi S00killall
  9. K15nginx K50cloud-final K74nscd K85mdmonitor K89iscsid K90egymjlsoun K90jvykhthbys K90rrywkqorsv K92ip6tables S01halt
  10. K25aliyun-util K50cloud-init K74ntpd K87multipathd K89netconsole K90ftyncxdpbf K90ljtyhksudi K90wpryovwobc K92iptables
  11.  
  12. /etc/rc1.d/:
  13. K01agentwatch K25aliyun-util K50cloud-config K50cloud-init-upgrade K74ntpd K87multipathd K88rsyslog K90network K95rdma S26udev-post
  14. K05atd K25sshd K50cloud-final K60crond K75netfs K87restorecond K89iscsid K90yidoxmlkvd S01sysstat S95jexec
  15. K10saslauthd K30postfix K50cloud-init K61nfs-rdma K75ntpdate K88auditd K89netconsole K92ip6tables S02lvm2-monitor S99single
  16. K15nginx K36mysqld K50cloud-init-local K74nscd K85mdmonitor K88iscsi K89rdisc K92iptables S25blk-availability
  17.  
  18. /etc/rc2.d/:
  19. K05atd K75netfs K89iscsid K92ip6tables S10network S26udev-post S53cloud-config S64mysqld S99local
  20. K10saslauthd K75ntpdate K89netconsole K95rdma S11auditd S50aegis S54cloud-final S85nginx
  21. K30postfix K87multipathd K89rdisc S01sysstat S12rsyslog S50cloud-init-upgrade S55aliyun-util S90crond
  22. K61nfs-rdma K87restorecond K90jlavwskubs S02lvm2-monitor S15mdmonitor S51cloud-init-local S55sshd S95jexec
  23. K74nscd K88iscsi K90yidoxmlkvd S08iptables S25blk-availability S52cloud-init S58ntpd S98agentwatch
  24.  
  25. /etc/rc3.d/:
  26. K10saslauthd K75ntpdate K89rdisc K95rdma S08iptables S13iscsi S26udev-post S58ntpd S95atd
  27. K30postfix K87multipathd K90jlavwskubs S01sysstat S10network S15mdmonitor S50aegis S64mysqld S95jexec
  28. K61nfs-rdma K87restorecond K90yidoxmlkvd S02lvm2-monitor S11auditd S25blk-availability S55aliyun-util S85nginx S98agentwatch
  29. K74nscd K89netconsole K92ip6tables S07iscsid S12rsyslog S25netfs S55sshd S90crond S99local
  30.  
  31. /etc/rc4.d/:
  32. K10saslauthd K87multipathd K90yidoxmlkvd S07iscsid S13iscsi S50aegis S54cloud-final S85nginx S99local
  33. K30postfix K87restorecond K92ip6tables S08iptables S15mdmonitor S50cloud-init-upgrade S55aliyun-util S90crond
  34. K61nfs-rdma K89netconsole K95rdma S10network S25blk-availability S51cloud-init-local S55sshd S95atd
  35. K74nscd K89rdisc S01sysstat S11auditd S25netfs S52cloud-init S58ntpd S95jexec
  36. K75ntpdate K90jlavwskubs S02lvm2-monitor S12rsyslog S26udev-post S53cloud-config S64mysqld S98agentwatch
  37.  
  38. /etc/rc5.d/:
  39. K10saslauthd K87multipathd K90yidoxmlkvd S07iscsid S13iscsi S50aegis S54cloud-final S85nginx S99local
  40. K30postfix K87restorecond K92ip6tables S08iptables S15mdmonitor S50cloud-init-upgrade S55aliyun-util S90crond
  41. K61nfs-rdma K89netconsole K95rdma S10network S25blk-availability S51cloud-init-local S55sshd S95atd
  42. K74nscd K89rdisc S01sysstat S11auditd S25netfs S52cloud-init S58ntpd S95jexec
  43. K75ntpdate K90jlavwskubs S02lvm2-monitor S12rsyslog S26udev-post S53cloud-config S64mysqld S98agentwatch
  44.  
  45. /etc/rc6.d/:
  46. K01agentwatch K25sshd K50cloud-init-local K75blk-availability K87restorecond K89rdisc K90gfkexlpwho K90luobdoxchv K90xfeualnqzg K95rdma
  47. K05atd K30postfix K50cloud-init-upgrade K75netfs K88auditd K90apjpqfyeom K90hnipcstryl K90network K90xfvzcygkae K99lvm2-monitor
  48. K05jexec K36mysqld K60crond K75ntpdate K88iscsi K90cpaanfozrw K90imipfrazsb K90otgsovjinw K90yidoxmlkvd K99sysstat
  49. K10saslauthd K50cloud-config K61nfs-rdma K75udev-post K88rsyslog K90dgznpnhhcv K90jlavwskubs K90qfkxlouaux K90yxexqdafhi S00killall
  50. K15nginx K50cloud-final K74nscd K85mdmonitor K89iscsid K90egymjlsoun K90jvykhthbys K90rrywkqorsv K92ip6tables S01reboot
  51. K25aliyun-util K50cloud-init K74ntpd K87multipathd K89netconsole K90ftyncxdpbf K90ljtyhksudi K90wpryovwobc K92iptables
  52.  
  53. /etc/rc.d/:
  54. init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit

可以看到很多红色显示的,以K90和S90开头的脚本文件(方框标注),这些就是chkconfig设置的开机启动项,需要依次删掉

注意在0,1,6三种启动级别下有K90network(圆框标注)的正常启动文件,这个是开机时网络的启动脚本,需要特别处理

4.3.删除木马的开机自启动文件

  1. rm -f /etc/rc*.d/K90*
  2. ls /etc/rc*/

使用以下命令可以恢复被删除的K90network文件

  1. chkconfig network on

查看修复后的自启动配置目录

  1. ls /etc/rc*/

多么清爽的界面,哈哈

4.4.接下来删除掉之前禁用关停的木马程序文件和定时任务内容即可

  1. rm -f /etc/init.d/yidoxmlkvd
  2. rm -f /usr/bin/yidoxmlkvd
    rm -f /lib/libudev.so
    rm -f /etc/cron.hourly/gcc.sh
  3. vim /etc/crontab

到此木马程序就清理完毕了

5.重启系统查看是否有其他的隐藏木马

  1. reboot

重启后查看进程,没有木马相关程序即表明木马清理完成

6.拓展知识:杀毒工具

# 安装clamav杀毒软件,更新病毒库

  1. yum -y install clamav
  2. freshclam

# 全盘扫描,只显示被感染的文件,并在发现时发出警告音。

  1. clamscan -r --bell -i /

# 也可以进入后台扫描,并将报告输出到 /tmp/virus/scan.log

  1. clamscan -r --bell -i / > /tmp/virus/scan.log &

# 更多 ClamAV 用法

参考:

==== 完毕,呵呵呵呵  =====

  1.  

Linux下XordDos木马的清除的更多相关文章

  1. linux 下dd命令直接清除分区表(不用再fdisk一个一个的删除啦)

    分区表是硬盘的分区信息,要删除一个硬盘的所有分区表很麻烦的,需要fdisk一个一个的删除,其实dd命令可直接清除分区信息,当然,这也是linux给root用户留下的作死方法之一.dd 命令主要参数如下 ...

  2. Linux下 XordDos(BillGates)木马查杀记录

    最近朋友的一台服务器突然网络异常,cpu占用率暴表,登录上去一查,cpu占用300% 左右,流量异常,经过看查进程,获取信息最终确认为中了dos木马,经过几天的研究,基本上已经清除,以下是清理记录. ...

  3. Linux下手动查杀木马

    (1).模拟木马程序病原体并让其自动运行 黑客让脚本自动执行的3种方法:1.计划任务:2.开机启动:3.系统命令被人替换,定一个触发事件. 1)生成木马程序病原体 [root@youxi1 ~]# v ...

  4. Linux的挖矿木马病毒清除(kswapd0进程)

    1.top查看资源使用情况 看到这些进程一直在变化,但是,主要是由于kswapd0进程在作怪,占据了99%以上的CUP,查找资料后,发现它就是挖矿进程 2.排查kswapd0进程 执行命令netsta ...

  5. Linux安全:Linux如何防止木马

    (一)解答战略 去企业面试时是有多位竞争者的,因此要注意答题的维度和高度,一定要直接秒杀竞争者,搞定高薪offer. (二)解答战术 因为Linux下的木马常常是恶意者通过Web的上传目录的方式来上传 ...

  6. 【转】Linux下如何清除系统日志

    使用过Windows的人都知道,在使用windows系统的过程中系统会变得越来越慢.而对于Windows下饱受诟病的各种垃圾文件都需要自己想办法删除,不然系统将会变得越来越大,越来越迟钝!window ...

  7. Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50

    Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l ...

  8. 【转发】Linux下清除系统日志方法

    摘要:相信大家都是用过Windows的人.对于Windows下饱受诟病的各种垃圾文件都需要自己想办法删除,不然你的系统将会变得越来越大,越来越迟钝!windows怎么清理垃圾相信大家都知道的,那么li ...

  9. svn之——linux下清除svn的用户名和密码

    问题:之前用的svn账号权限不够,需要使用别的账号,所以提出需求——怎么使用新的svn账号进行操作 方法一: linux下删除~/.subversion/auth即可清除之前的用户名和密码:rm -r ...

随机推荐

  1. nodejs+gulpjs压缩js代码

    1.安装node.js 下载地址:nodejs.org  或者  nodejs.cn 2.安装gulp之前我们需要安装nodejs的环境,检测能够正常使用npm后,我们用npm对gulp进行一次全局安 ...

  2. Hashtable、HashMap、TreeMap心得

    三者均实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值. (1) 元素特性 HashTable中的key.value都不能为null; ...

  3. RabbitMQ入门_08_所谓的点对点与发布订阅模型

    A. JMS 模型 JMS 中定义了点对点和发布订阅两种消息模型,原来以为 AMQP 协议中 direct Exchange 对应点对点模型,topic Exchange 对应发布订阅模型,fanou ...

  4. Java-Java语言

    2017-10-03 21:25:38 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.J ...

  5. 用MVVM模式开发中遇到的零散问题总结(1)

    https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html

  6. 使用Jenkins实现maven项目一键部署

    下面的博客请详细的,值得一看:jenkins+maven+svn实现简单的一键发布 http://blog.csdn.net/pein_zero/article/details/52597615#co ...

  7. LeetCode--104--二叉树的最大深度

    问题描述: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...

  8. javascritp文章 You-Dont-Know-JS

    https://github.com/getify/You-Dont-Know-JS 有6个系列.git在线免费. 第一本, up and going (点击链接) Mission: 作者建议在开始学 ...

  9. 3-4 8精彩算法集合。struct(C,ruby) Ruyb类对象和结构体, 3-5

    在本章我遇到了c语言的struct数据,即自定义的数据结构.比如: struct edge { int u; int v; int w; }; 题目给了一组数据,用edge储存.需要按照w大小排序.我 ...

  10. android------2018 年初值得关注的 16 个新 Android 库和项目

    1. transitioner Transitioner 是一个为两个拥有嵌入子视图的视图之间提供简便.动态且可调整的动画效果的库.它纯 100% 使用 Kotlin 编写而成,使用 MIT 许可,且 ...