第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

 注:近日曝出大规模利用 Redis 漏洞进行入侵的事件,会给用户的 Redis 运行环境以及 Linux 主机造成安全风险。若用户的Linux服务器中安装了Redis并对公网开放了Redis端口,则可能导致Redis数据丢失,服务器则存在被植入公钥用于SSH远程登录的风险。

关于Redis

Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

容易遭受入侵的环境

用户自建的运行了 Redis 服务的 Linux 主机,依root身份运行Redis服务,并在公网上开放了 6379 的 Redis 端口。

入侵现象

1)Redis 可能被执行过 flushall 命令

2)Redis 内建了名为 crackit 的 key

3)Redis 的 dir 参数指向了 /root/.ssh

4)/root/.ssh/authorized_keys 被覆盖或者包含 Redis 相关的内容

修复办法

5)以非 root 权限启动 Redis

6)增加 Redis 密码验证

7)禁止公网开放 Redis 端口, 例如可以在青云防火墙上禁用 6379 Redis 的端口

8)检查 authorized_keys 是否非法

详细内容请看下文:

漏洞概要

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞描述

Redis 安全模型的观念是: “请不要将Redis暴露在公开网络中, 因为让不受信任的客户接触到Redis是非常危险的” 。

Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99%使用Redis的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

因为其他受信任用户需要使用Redis或者因为运维人员的疏忽等原因,部分Redis 绑定在0.0.0.0:6379,并且没有开启认证(这是Redis的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,将会导致Redis服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

利用Redis自身的相关方法,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞影响

Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。

通过ZoomEye 的搜索结果显示,有97700在公网可以直接访问的Redis服务。

http://at.liuxinxiu.com/2017/05/image/a1.jpg

根据 ZoomEye 最新于2015年11月12日0点探测结果显示:

总的存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中被明着写入crackit的,也就是已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。

1.1.    漏洞分析与利用

首先在本地生产公私钥文件:


C#代码
  1. ? 1 $ssh-keygen –t rsa  

http://at.liuxinxiu.com/2017/05/image/a2.jpg

然后将公钥写入foo.txt文件

C#代码
  1. ? 1 $ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt  

再连接Redis写入文件

http://at.liuxinxiu.com/2017/05/image/a3.jpg

这样就可以成功的将自己的公钥写入/root/.ssh文件夹的authotrized_keys文件里,然后攻击者直接执行:

C#代码
  1. ? 1 $ ssh –i  id_rsa root@192.168.1.11  

即可远程利用自己的私钥登录该服务器。

当然,写入的目录不限于/root/.ssh 下的authorized_keys,也可以写入用户目录,不过Redis很多以root权限运行,所以写入root目录下,可以跳过猜用户的步骤。

Redis 未授权的其他危害与利用

数据库数据泄露

Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等

http://at.liuxinxiu.com/2017/05/image/a4.jpg

代码执行

Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下

http://at.liuxinxiu.com/2017/05/image/a5.jpg

一旦攻击者能够在服务器端执行任意代码, 攻击方式将会变得多且复杂, 这是非常危险的.

通过Lua代码攻击者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。

敏感信息泄露

通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫

http://at.liuxinxiu.com/2017/05/image/a6.jpg

可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。

全球无验证可直接利用 Redis 分布情况

http://at.liuxinxiu.com/2017/05/image/a7.jpg

http://at.liuxinxiu.com/2017/05/image/a8.jpg

Linux-以指定用户运行redis

[不指定 2017/05/11 10:25 | by 刘新修 ]

redis中无配置启动用户信息,需要添加redis用户,后以其启动(1):

useradd -s /bash/false -M redis  sudo -u redis /xxx/redis-server /xxx/etc/redis.conf >/dev/null 2>&1 &

linux指定某非root用户执行开机启动项的方法(2)

Linux下指定sun用户在linux开机时执行/home/sun/startrun.sh为例:

   以root登录linux

   执行vi /etc/rc.d/rc.local

   在文档末尾添加一行语句:su sun -c "/home/sun/startrun.sh"

   保存rc.local即可。

/bin/false和/sbin/nologin的区别
 
1 区别 
/bin/false是最严格的禁止login选项,一切服务都不能用。 
/sbin/nologin只是不允许login系统 
 
其中树莓派的/sbin/nologin文件在/usr/sbin/nologin 
小技巧: 
查看 /etc/passwd文件,能看到各用户使用的shell 
 
2.1 nologin 
当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示 
This account is currently not available. 
 
如果在树莓派下,配置错误,误将/usr/sbin/nologin配置成/sbin/nologin,SSH时会提示 
root@raspberrypi:/home# useradd -s /sbin/nologin piaohailin 
root@raspberrypi:/home# su piaohailin 
Cannot execute /sbin/nologin: No such file or directory 
 
2.2 false 
当用户配置成/bin/false时,ssh之后显示如下 
root@raspberrypi:/home# useradd -s /bin/false piaohailin 
root@raspberrypi:/home# su piaohailin 
root@raspberrypi:/home# whoami 
root 

不会有任何提示,用户切换不过去 

 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件夹的方法。

1: 如何查找大文件?

 

其实很多时候,你需要了解当前系统下有哪些大文件,比如文件大小超过100M或1G(阀值视具体情况而定)。那么如何把这些大文件搜索出来呢?例如我要搜索当前目录下,超过800M大小的文件

C#代码
  1. [root@getlnx01 u03]# pwd  
  2. /u03  
  3. [root@getlnx01 u03]# find . -type f -size +800M  
  4. ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1  
  5. ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1  
  6. ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1  
  7. ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1  
  8. ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1  
  9. ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1  
  10. ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1  
  11. ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1  
  12. ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1  
  13. ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1  
  14. ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1  
  15. ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1  
  16. ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1  
  17. ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1  
  18. ./oradata/epps/invsubmat_d08.dbf  
  19. ./oradata/epps/gmtinv_d08.dbf  
  20. ./oradata/epps/gmtinv_x01.dbf  
  21. ./oradata/epps/undotbs02.dbf  
  22. ./oradata/epps/gmtinv_d07.dbf  
  23. ./oradata/epps/undotbs01.dbf  
  24. ./oradata/epps/gmtinv_x02.dbf  

如上命令所示,我们仅仅能看到超过800M大小的文件的文件名称,但是对文件的信息(例如,文件大小、文件属性)一无所知,那么能否更详细显示一些文件属性或信息呢,当然可以,如下所示

C#代码
  1. [root@getlnx01 u03]# find . -type f -size +800M  -print0 | xargs -0 ls -l  
  2. -rw-r----- 1 oracle oinstall 2782846976 Mar  6 11:51 ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1  
  3. -rw-r----- 1 oracle oinstall 1878433792 Mar  6 11:53 ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1  
  4. -rw-r----- 1 oracle oinstall 1378492416 Mar  6 11:54 ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1  
  5. -rw-r----- 1 oracle oinstall 1641381888 Mar  6 11:56 ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1  
  6. -rw-r----- 1 oracle oinstall 1564065792 Mar  6 11:58 ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1  
  7. -rw-r----- 1 oracle oinstall 1663492096 Mar  6 12:00 ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1  
  8. -rw-r----- 1 oracle oinstall 1368244224 Mar  6 12:02 ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1  
  9. -rw-r----- 1 oracle oinstall 1629069312 Mar  6 12:04 ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1  
  10. -rw-r----- 1 oracle oinstall 1629954048 Mar  6 12:06 ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1  
  11. -rw-r----- 1 oracle oinstall 1202192384 Mar  6 12:07 ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1  
  12. -rw-r----- 1 oracle oinstall 1189388288 Mar  6 12:10 ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1  
  13. -rw-r----- 1 oracle oinstall 1089257472 Mar  6 12:11 ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1  
  14. -rw-r----- 1 oracle oinstall 1097687040 Mar  6 12:12 ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1  
  15. -rw-r----- 1 oracle oinstall 1051009024 Mar  6 12:13 ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1  
  16. -rw-r----- 1 oracle oinstall 4294975488 Apr  3 15:07 ./oradata/epps/gmtinv_d07.dbf  
  17. -rw-r----- 1 oracle oinstall 4194312192 Apr  1 22:36 ./oradata/epps/gmtinv_d08.dbf  
  18. -rw-r----- 1 oracle oinstall 4294975488 Apr  3 15:54 ./oradata/epps/gmtinv_x01.dbf  
  19. -rw-r----- 1 oracle oinstall 4294975488 Apr  3 15:57 ./oradata/epps/gmtinv_x02.dbf  
  20. -rw-r----- 1 oracle oinstall 4294975488 Apr  1 22:35 ./oradata/epps/invsubmat_d08.dbf  
  21. -rw-r----- 1 oracle oinstall 8589942784 Apr  4 09:55 ./oradata/epps/undotbs01.dbf  
  22. -rw-r----- 1 oracle oinstall 8589942784 Apr  4 09:15 ./oradata/epps/undotbs02.dbf  

当我们只需要查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令:

C#代码
  1. [root@getlnx01 u03]# find . -type f -size +800M  -print0 | xargs -0 du -h  
  2. 1.3G    ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1  
  3. 1.1G    ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1  
  4. 1.2G    ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1  
  5. 1.2G    ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1  
  6. 1.5G    ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1  
  7. 1.1G    ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1  
  8. 1.3G    ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1  
  9. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1  
  10. 1004M   ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1  
  11. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1  
  12. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1  
  13. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1  
  14. 2.6G    ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1  
  15. 1.8G    ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1  
  16. 4.1G    ./oradata/epps/invsubmat_d08.dbf  
  17. 4.0G    ./oradata/epps/gmtinv_d08.dbf  
  18. 4.1G    ./oradata/epps/gmtinv_x01.dbf  
  19. 8.1G    ./oradata/epps/undotbs02.dbf  
  20. 4.1G    ./oradata/epps/gmtinv_d07.dbf  
  21. 8.1G    ./oradata/epps/undotbs01.dbf  
  22. 4.1G    ./oradata/epps/gmtinv_x02.dbf  

如果你还需要对查找结果按照文件大小做一个排序,那么可以使用下面命令:

C#代码
  1. [root@getlnx01 u03]# find . -type f -size +800M  -print0 | xargs -0 du -h | sort -nr  
  2. 1004M   ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1  
  3. 8.1G    ./oradata/epps/undotbs02.dbf  
  4. 8.1G    ./oradata/epps/undotbs01.dbf  
  5. 4.1G    ./oradata/epps/invsubmat_d08.dbf  
  6. 4.1G    ./oradata/epps/gmtinv_x02.dbf  
  7. 4.1G    ./oradata/epps/gmtinv_x01.dbf  
  8. 4.1G    ./oradata/epps/gmtinv_d07.dbf  
  9. 4.0G    ./oradata/epps/gmtinv_d08.dbf  
  10. 2.6G    ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1  
  11. 1.8G    ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1  
  12. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1  
  13. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1  
  14. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1  
  15. 1.6G    ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1  
  16. 1.5G    ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1  
  17. 1.3G    ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1  
  18. 1.3G    ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1  
  19. 1.2G    ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1  
  20. 1.2G    ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1  
  21. 1.1G    ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1  
  22. 1.1G    ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1  

不过如上截图所示,有时候排列的顺序并不完全是按大小一致,这个是因为du命令的参数h所致,你可以统一使用使用MB来显示,这样就能解决这个问题。到这里,这个在Linux系统查找大文件的命令已经非常完美了,当然如果你还有很多的需求,那么可以在这个命令上做修改、调整.

2: 如何查找Linux下的大目录

 

譬如有时候磁盘空间告警了,而你平时又疏于管理、监控文件的增长,那么我需要快速的了解哪些目录变得比较大,那么此时我们可以借助du命令来帮我们解决这个问题。

C#代码
  1. [root@getlnx01 u03]# du -h --max-depth=1  
  2. 16K     ./lost+found  
  3. 33G     ./flash_recovery_area  
  4. 37G     ./oradata  
  5. 70G     .  

如果你想知道flash_recovery_area目录下面有哪些大文件夹,那么可以将参数max-depth=2 ,如果你想对搜索出来的结果进行排序,那么可以借助于sort命令。如下所示

C#代码
  1. [root@getlnx01 u03]# du -h --max-depth=2 | sort -n  
  2. 3.5G    ./flash_recovery_area/EPPS  
  3. 16K     ./lost+found  
  4. 29G     ./flash_recovery_area/backup  
  5. 33G     ./flash_recovery_area  
  6. 37G     ./oradata  
  7. 37G     ./oradata/epps  
  8. 70G     .  
  9. [root@getlnx01 u03]# du -hm --max-depth=2 | sort -n  
  10. 1       ./lost+found  
  11. 3527    ./flash_recovery_area/EPPS  
  12. 29544   ./flash_recovery_area/backup  
  13. 33070   ./flash_recovery_area  
  14. 37705   ./oradata  
  15. 37705   ./oradata/epps  
  16. 70775   .  

[root@getlnx01 u03]# cd /

[root@getlnx01 /]# du -hm --max-depth=2 | sort -n

 

有时候搜索出来的结果太多了(譬如,我从根目录开始搜索),一直在刷屏,如果我只想查出最大的12个文件夹,怎么办呢?此时就要借助head命令来显示了

C#代码
  1. [root@getlnx01 /]# du -hm --max-depth=2 | sort -nr | head -12  
  2. 407480  .  
  3. 167880  ./u04  
  4. 158685  ./u02/oradata  
  5. 158685  ./u02  
  6. 152118  ./u04/oradata  
  7. 70775   ./u03  
  8. 37705   ./u03/oradata  
  9. 33070   ./u03/flash_recovery_area  
  10. 5995    ./u01/app  
  11. 5995    ./u01  
  12. 3551    ./usr  
  13. 1558    ./usr/share  
  14. [root@getlnx01 /]#   

查看具体目录:du -sh  /www/cnmo/

查看整体概况:df -h

Linux Shell 汇总

[不指定 2017/05/03 18:33 | by 刘新修 ]

 1、查看当前操作系统类型

C#代码
  1. #!/bin/sh  
  2. SYSTEM=`uname -s`  
  3. if [ $SYSTEM = "Linux" ] ; then  
  4. echo "Linux"  
  5. elif [ $SYSTEM = "FreeBSD" ] ; then  
  6. echo "FreeBSD"  
  7. elif [ $SYSTEM = "Solaris" ] ; then  
  8. echo "Solaris"  
  9. else  
  10. echo "What?"  
  11. fi  

 

C++代码
  1. hostname  
  2. ############### 最后一次修改的用户 ####################  
  3. cd /www/ftp/ysx/xfile/www  
  4. ls -lh  
  5. ############### 最后一次修改的用户 ####################  
  6. cat /etc/redhat-release  
  7. df -h  
  8. rsync -avzut --progress --delete /www/ftp/ycw/xfile/www/assets liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas  
  9. rsync -avzut --progress /www/ftp/ycw/xfile/www/json/assets.json liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas  
  10.   
  11. echo http://ysx.com/xfile/www/json/assets.json  
  12. UNAME=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .name)  
  13. VERSION=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .version)  
  14. VERSION=${VERSION//\"/}  
  15. UpdateTime=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .UpdateTime)  
  16. UpdateTime=${UpdateTime//[[:space:]]/_}  
  17. echo $UNAME  
  18. echo $UpdateTime  
  19. cp /www/ftp/ycw/xfile/www/json/assets.json /www/ftp/back/xfile/www/json/assets-$VERSION-$BUILD_USER_ID-v$BUILD_NUMBER.json  
  20. cd /www/ftp/ycw/xfile/www/ && zip -r -q /www/ftp/back/xfile/www/assets-json-$VERSION-$BUILD_USER_ID-v$BUILD_NUMBER.zip assets json/assets.json  
  21. echo "" > /www/ftp/back/xfile/www/sh/sh-$VERSION.txt  
  22. echo cp /www/ftp/back/xfile/www/json/assets-$VERSION-$BUILD_USER_ID-v$BUILD_NUMBER.json /www/ftp/ysx/xfile/www/json/assets.json >> /www/ftp/back/xfile/www/sh/sh-$VERSION.txt  
  23. echo unzip /www/ftp/back/xfile/www/assets-json-$VERSION-$BUILD_USER_ID-v$BUILD_NUMBER.zip -d /www/ftp/ysx/xfile/www >> /www/ftp/back/xfile/www/sh/sh-$VERSION.txt  

其他版本,不增加平台版本号:

C#代码
  1. hostname  
  2. ############### 最后一次修改的用户 ####################  
  3. cd /www/ftp/ysx/xfile/www  
  4. ls -lh  
  5. ############### 最后一次修改的用户 ####################  
  6. cat /etc/redhat-release  
  7. df -h  
  8. rsync -avzut --progress --delete /www/ftp/ycw/xfile/www/assets liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas  
  9. rsync -avzut --progress /www/ftp/ycw/xfile/www/json/assets.json liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas  
  10.   
  11. echo http://ysx.cnmo.me/xfile/www/json/assets.json  
  12. UNAME=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .name)  
  13. UNAME=${UNAME//\"/}  
  14. VERSION=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .version)  
  15. VERSION=${VERSION//\"/}  
  16. UpdateTime=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .UpdateTime)  
  17. UpdateTime=${UpdateTime//[[:space:]]/_}  
  18. UpdateTime=${UpdateTime//\"/}  
  19. cp /www/ftp/ycw/xfile/www/json/assets.json /www/ftp/back/xfile/www/json/assets-$VERSION-$UNAME-$UpdateTime.json  
  20. cd /www/ftp/ycw/xfile/www/ && zip -r -q /www/ftp/back/xfile/www/assets-json-$VERSION-$UNAME-$UpdateTime.zip assets json/assets.json  
  21. echo "" > /www/ftp/back/xfile/www/sh/sh-$VERSION-$UNAME-$UpdateTime.txt  
  22. echo cp /www/ftp/back/xfile/www/json/assets-$VERSION-$UNAME-$UpdateTime.json /www/ftp/ysx/xfile/www/json/assets.json >> /www/ftp/back/xfile/www/sh/sh-$VERSION-$UNAME-$UpdateTime.txt  
  23. echo unzip /www/ftp/back/xfile/www/assets-json-$VERSION-$UNAME-$UpdateTime.zip -d /www/ftp/ysx/xfile/www >> /www/ftp/back/xfile/www/sh/sh-$VERSION-$UNAME-$UpdateTime.txt  

 代码同步超级管理员

C#代码
  1. myPath="/www/ftp/${userName//\"/}"  
  2. ############### 这里的-d 参数判断$myPath是否存在 ###############  
  3. if [ ! -d "$myPath" ] ; then  
  4. echo "这个目录不存在呀!有问题请及时与管理员联系:liu.xinxiu@cnmo.com"  
  5. cat $myPath  
  6. exit  
  7. #else    
  8. #echo "目录存在!"  
  9. fi  
  10. ############### 这里的-d 参数判断$myPath是否存在 ###############  
  11. proName=${projectName//\"/}  
  12. proPath="$myPath/xfile/$proName" 
  13. ysxPath="/www/ftp/ysx/xfile/$proName" 
  14. backPath="/www/ftp/back/xfile/$proName" 
  15.  
  16. hostname 
  17. ############### 最后一次修改的用户 #################### 
  18. cd $proPath 
  19. ls -lh 
  20. ############### 最后一次修改的用户 #################### 
  21. cat /etc/redhat-release 
  22. df -h 
  23.  
  24. ############### 数据同步 #################### 
  25. rsync -avzut --progress --delete $proPath/assets liuxinxiu@127.0.0.1::ysx_xfile_$proName --password-file=/pas/rsync.pas 
  26. cp $proPath/json/assets.json $ysxPath/json/assets.json 
  27. ############### 数据同步 #################### 
  28.  
  29. echo http://ysx.cnmo.me/xfile/$proName/json/assets.json 
  30. UNAME=$(cat $proPath/json/assets.json | jq -c .name) 
  31. UNAME=${UNAME//\"/} 
  32. VERSION=$(cat $proPath/json/assets.json | jq -c .version) 
  33. VERSION=${VERSION//\"/} 
  34. UpdateTime=$(cat $proPath/json/assets.json | jq -c .UpdateTime) 
  35. UpdateTime=${UpdateTime//[[:space:]]/__} 
  36. UpdateTime=${UpdateTime//\:/_} 
  37. UpdateTime=${UpdateTime//\"/} 
  38.  
  39. ############### 数据备份操作 #################### 
  40. cp $proPath/json/assets.json $backPath/json/assets-${VERSION}__${UpdateTime}.json 
  41. cd $proPath/ && zip -r -q $backPath/assets-${VERSION}__${UpdateTime}.zip assets json/assets.json 
  42. echo "" > $backPath/sh/assets-${VERSION}__${UpdateTime}.txt 
  43. echo cp $backPath/json/assets-${VERSION}__${UpdateTime}.json $ysxPath/json/assets.json >> $backPath/sh/assets-${VERSION}__${UpdateTime}.txt 
  44. echo unzip -o $backPath/assets-${VERSION}__${UpdateTime}.zip -d $ysxPath >> $backPath/sh/assets-${VERSION}__${UpdateTime}.txt 
  45. echo sed -i "'"s/,'"addOth"':{/,'"Fallback"':'"'$BUILD_USER_ID-v${ENV, var="BUILD_ID"}'"','"addOth"':{/g"'" $ysxPath/json/assets.json >> $backPath/sh/assets-${VERSION}__${UpdateTime}.txt 
  46. ############### 数据备份操作 #################### 
  47.  
  48.  
  49. ############### 维护回退版本列表 #################### 
  50. versionList="$backPath/versionList.txt" 
  51. if [ ! -f "$versionList" ]; then 
  52.     #touch "$versionList" 
  53.     echo "vlist=assets-${VERSION}__${UpdateTime}" > $backPath/versionList.txt 
  54. else  
  55.     #grep -q "裸照" urfile  && echo "有的"  || echo "没的" 
  56.     grep -q "assets-${VERSION}__${UpdateTime}" $backPath/versionList.txt  && echo "相同代码在备份文件中已经存在,已再次执行了代码同步!您还可以选择代码回滚功能,一键回退指定版本~"  || sed -i "/^vlist.*$/s//& ,assets-${VERSION}__${UpdateTime}/g" $backPath/versionList.txt  
  57. fi  
  58. ############### 维护回退版本列表 ####################  

 

使用npm install -g 'xxx' 之后仍然报
Cannot find module 'xxx' 错误,可以通过设置环境变量来解决;

export NODE_PATH=/usr/local/lib/node_modules/  
echo $NODE_PATH  

Error: Cannot find module 'ftp'

#!/bin/sh  

myPath="/var/log/httpd/"  

myFile="/var /log/httpd/access.log"  

#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限  

if [ ! -x "$myPath"]; then  

  mkdir "$myPath"  

fi  

#这里的-d 参数判断$myPath是否存在  

if [ ! -d "$myPath"]; then  

  mkdir "$myPath"  

fi  

#这里的-f参数判断$myFile是否存在  

if [ ! -f "$myFile" ]; then  

  touch "$myFile"  

fi  

#其他参数还有-n,-n是判断一个变量是否是否有值  

if [ ! -n "$myVar" ]; then  

  echo "$myVar is empty"  

  exit 0  

fi  

#两个变量判断是否相等  

if [ "$var1" = "$var2" ]; then  

  echo '$var1 eq $var2'  

else  

  echo '$var1 not eq $var2'  

fi

CSS HACK整理

[不指定 2017/03/09 10:16 | by 刘新修 ]
.test{
color:#000000; /* FF,OP支持 */
color:#0000FF\9; /* 所有IE浏览器(ie6+)支持 ;但是IE8不能识别“*”和“_”的css hack;所以我们可以这样写hack */
[color:#000000;color:#00FF00; /* SF,CH支持 */
*color:#FFFF00; /* IE7支持 */
_color:#FF0000; /* IE6支持 */
}

 

网上也流传着这样一种ie hack方法

.color1{ color:#F00; color/*\**/:#00F /*\**/}/*IE6,IE7,IE8,FF,OP,SA识别*/
.color2{ color:#F00; color /*\**/:#00F /*\9**/}/*IE7,IE8,FF,OP,SA识别*/
.color3{ color:#F00; color/*\**/:#00F \9}/*IE6,IE7,IE8识别*/
.color4{ color:#F00; color /*\**/:#00F\9}/*IE7,IE8识别*//*“color”和“/*\**/”之间有个空格*/

分析下:
background-color:blue; 各个浏览器都认识,这里给firefox用;
background-color:red\9;\9所有的ie浏览器可识别;
background-color:yellow\0; \0 是留给ie8的,但笔者测试,发现最新版opera也认识,汗。。。不过且慢,后面自有hack写了给opera认的,所以,\0我们就认为是给ie8留的;
+background-color:pink; + ie7定了;
_background-color:orange; _专门留给神奇的ie6;
:root #test { background-color:purple\9; } :root是给ie9的,网上流传了个版本是 :root #test { background-color:purple\0;},呃。。。这个。。。,新版opera也认识,所以经笔者反复验证最终ie9特有的为:root 选择符 {属性\9;}
@media all and (min-width:0px){ #test {background-color:black\0;} } 这个是老是跟ie抢着认\0的神奇的opera,必须加个\0,不然firefox,chrome,safari也都认识。。。
@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }最后这个是浏览器新贵chrome和safari的。

好了就这么多了,特别注意以上顺序是不可以改变的。css hack虽然可以解决个浏览器之间css显示的差异问题,但是毕竟不符合W3C规范,我们平时写css最好是按照标准来,这样对我们以后维护也是大有好处的,实在不行再用。

区别不同浏览器的CSS hack写法: 

区别IE6与FF: 
background:orange;*background:blue; 

区别IE6与IE7: 
background:green !important;background:blue; 

区别IE7与FF: 
background:orange; *background:green; 

区别FF,IE7,IE6: 
background:orange;*background:green !important;*background:blue; 

注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*,但不能识别 !important, 
IE7能识别*,也能识别!important; 
FF不能识别*,但能识别!important;

 IE6IE7FF
*×
!important×



------------------------------------------------------ 
另外再补充一个,下划线"_", 
IE6支持下划线,IE7和firefox均不支持下划线。

 IE6IE7FF
*×
!important×
_××



于是大家还可以这样来区分IE6,IE7,firefox 
: background:orange;*background:green;_background:blue; 

注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。

 mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了。

造成这样的原因一般是sql操作的时间过长,或者是传送的数据太大(例如使用insert ... values的语句过长, 这种情况可以通过修改max_allowed_packed的配置参数来避免,也可以在程序中将数据分批插入)。

产生这个问题的原因有很多,总结下网上的分析:

原因一. MySQL 服务宕了

判断是否属于这个原因的方法很简单,进入mysql控制台,查看mysql的运行时长

mysql> show global status like 'uptime';
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Uptime        | 3414707 |
+---------------+---------+

1 row in set或者查看MySQL的报错日志,看看有没有重启的信息

如果uptime数值很大,表明mysql服务运行了很久了。说明最近服务没有重启过。
如果日志没有相关信息,也表名mysql服务最近没有重启过,可以继续检查下面几项内容。

原因二. mysql连接超时

即某个mysql长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。
此后再通过这个connection发起查询的时候,就会报错server has gone away
(大部分PHP脚本就是属于此类)

mysql> show global variables like '%timeout';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+
10 rows in set

wait_timeout 是28800秒,即mysql链接在无操作28800秒后被自动关闭

原因三. mysql请求链接进程被主动kill

这种情况和原因二相似,只是一个是人为一个是MYSQL自己的动作

mysql> show global status like 'com_kill';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_kill      | 21    |
+---------------+-------+
1 row in set原因四. Your SQL statement was too large.

当查询的结果集超过 max_allowed_packet 也会出现这样的报错。定位方法是打出相关报错的语句。

用select * into outfile 的方式导出到文件,查看文件大小是否超过 max_allowed_packet ,如果超过则需要调整参数,或者优化语句。

mysql> show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)

修改参数:

mysql> set global max_allowed_packet=1024*1024*16;
mysql> show global variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

以下是补充:

应用程序(比如PHP)长时间的执行批量的MYSQL语句。执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理。都容易引起MySQL server has gone away。 

今天遇到类似的情景,MySQL只是冷冷的说:MySQL server has gone away。 

大概浏览了一下,主要可能是因为以下几种原因: 
一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。 



还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一个连接,而且程序中某两次操作数据库的间隔时间超过了wait_timeout(SHOW STATUS能看到此设置),那么就可能出现问题。最简单的处理方式就是把wait_timeout改大,当然你也可以在程序里时不时顺手mysql_ping()一下,这样MySQL就知道它不是一个人在战斗。 

解决MySQL server has gone away 

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。 
解决方案: 
在my.cnf文件中添加或者修改以下两个变量: 
wait_timeout=2880000 
interactive_timeout = 2880000 
关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如: 
sql = "set interactive_timeout=24*3600"; 
mysql_real_query(...) 


2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理 
解决方案: 
在my.cnf文件中添加或者修改以下变量: 
max_allowed_packet = 10M(也可以设置自己需要的大小) 
max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。 


最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL的时候,发现MySQL的连接超时关闭了,于是就出现了“MySQL server has gone away”这样的错误提示,解决这个问题,我的经验有以下两点,或许对大家有用处: 
第 一种方法: 
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。 
第二种方法: 
这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。 
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧: 
这是我的的数据库操 作类中间的一个函数 

第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]