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

js 判断各种数据类型

[不指定 2017/05/17 11:28 | by 刘新修 ]

        了解js的都知道, 有个typeof  用来判断各种数据类型,有两种写法:typeof   xxx   ,typeof(xxx)

       如下实例:

       typeof   2      输出   number
       typeof   null   输出   object

       typeof   {}    输出   object

       typeof    []    输出   object

       typeof   (function(){})   输出  function

       typeof    undefined         输出  undefined

       typeof   '222'                 输出    string

      typeof  true                   输出     boolean

    这里面包含了js里面的五种数据类型  number   string    boolean   undefined     object和函数类型 function

     看到这里你肯定会问了:我怎么去区分对象,数组和null呢?

     接下来我们就用到另外一个利器:Object.prototype.toString.call

     这是对象的一个原生原型扩展函数,用来更精确的区分数据类型。

     我们来试试这个玩儿意儿:

     var   gettype=Object.prototype.toString

        gettype.call('aaaa')        输出      [object String]

        gettype.call(2222)         输出      [object Number]

        gettype.call(true)          输出      [object Boolean]

        gettype.call(undefined)  输出      [object Undefined]

        gettype.call(null)                  输出   [object Null]

         gettype.call({})                   输出   [object Object]

         gettype.call([])                    输出   [object Array]
         gettype.call(function(){})     输出   [object Function]

      看到这里,刚才的问题我们解决了。 

      其实js 里面还有好多类型判断      [object HTMLDivElement]     div 对象  ,    [object HTMLBodyElement]  body 对象    ,[object Document](IE)或者  [object HTMLDocument](firefox,google) ......各种dom节点的判断,这些东西在我们写插件的时候都会用到。

     可以封装的方法如下  :

      var   gettype=Object.prototype.toString

     var    utility={

          isObj:function(o){

               return    gettype.call(o)=="[object Object]";

          },

          isArray:function(o){

               return    gettype.call(o)=="[object Array]";

          },

          isNULL:function(o){

               return    gettype.call(o)=="[object Null]";

          },

          isDocument:function(){

                return    gettype.call(o)=="[object Document]"|| [object HTMLDocument];

          }

          ........

    }

 注:近日曝出大规模利用 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的写在最后面。

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