js 判断各种数据类型
了解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 漏洞进行入侵的事件,会给用户的 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服务。
根据 ZoomEye 最新于2015年11月12日0点探测结果显示:
总的存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中被明着写入crackit的,也就是已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。
1.1. 漏洞分析与利用
首先在本地生产公私钥文件:
- ? 1 $ssh-keygen –t rsa
然后将公钥写入foo.txt文件
- ? 1 $ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
再连接Redis写入文件
这样就可以成功的将自己的公钥写入/root/.ssh文件夹的authotrized_keys文件里,然后攻击者直接执行:
- ? 1 $ ssh –i id_rsa root@192.168.1.11
即可远程利用自己的私钥登录该服务器。
当然,写入的目录不限于/root/.ssh 下的authorized_keys,也可以写入用户目录,不过Redis很多以root权限运行,所以写入root目录下,可以跳过猜用户的步骤。
Redis 未授权的其他危害与利用
数据库数据泄露
Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等
代码执行
Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下
一旦攻击者能够在服务器端执行任意代码, 攻击方式将会变得多且复杂, 这是非常危险的.
通过Lua代码攻击者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。
敏感信息泄露
通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫
可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。
全球无验证可直接利用 Redis 分布情况
Linux-以指定用户运行redis
redis中无配置启动用户信息,需要添加redis用户,后以其启动(1):
useradd -s /bash/false -M redis sudo -u redis /xxx/redis-server /xxx/etc/redis.conf >/dev/null 2>&1 &
以Linux下指定sun用户在linux开机时执行/home/sun/startrun.sh为例:
/bin/false和/sbin/nologin的区别
不会有任何提示,用户切换不过去
Linux如何查找大文件或目录总结
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件夹的方法。
1: 如何查找大文件?
其实很多时候,你需要了解当前系统下有哪些大文件,比如文件大小超过100M或1G(阀值视具体情况而定)。那么如何把这些大文件搜索出来呢?例如我要搜索当前目录下,超过800M大小的文件
- [root@getlnx01 u03]# pwd
- /u03
- [root@getlnx01 u03]# find . -type f -size +800M
- ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1
- ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1
- ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1
- ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1
- ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1
- ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1
- ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1
- ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1
- ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1
- ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1
- ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1
- ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1
- ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1
- ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1
- ./oradata/epps/invsubmat_d08.dbf
- ./oradata/epps/gmtinv_d08.dbf
- ./oradata/epps/gmtinv_x01.dbf
- ./oradata/epps/undotbs02.dbf
- ./oradata/epps/gmtinv_d07.dbf
- ./oradata/epps/undotbs01.dbf
- ./oradata/epps/gmtinv_x02.dbf
如上命令所示,我们仅仅能看到超过800M大小的文件的文件名称,但是对文件的信息(例如,文件大小、文件属性)一无所知,那么能否更详细显示一些文件属性或信息呢,当然可以,如下所示
- [root@getlnx01 u03]# find . -type f -size +800M -print0 | xargs -0 ls -l
- -rw-r----- 1 oracle oinstall 2782846976 Mar 6 11:51 ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1
- -rw-r----- 1 oracle oinstall 1878433792 Mar 6 11:53 ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1
- -rw-r----- 1 oracle oinstall 1378492416 Mar 6 11:54 ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1
- -rw-r----- 1 oracle oinstall 1641381888 Mar 6 11:56 ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1
- -rw-r----- 1 oracle oinstall 1564065792 Mar 6 11:58 ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1
- -rw-r----- 1 oracle oinstall 1663492096 Mar 6 12:00 ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1
- -rw-r----- 1 oracle oinstall 1368244224 Mar 6 12:02 ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1
- -rw-r----- 1 oracle oinstall 1629069312 Mar 6 12:04 ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1
- -rw-r----- 1 oracle oinstall 1629954048 Mar 6 12:06 ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1
- -rw-r----- 1 oracle oinstall 1202192384 Mar 6 12:07 ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1
- -rw-r----- 1 oracle oinstall 1189388288 Mar 6 12:10 ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1
- -rw-r----- 1 oracle oinstall 1089257472 Mar 6 12:11 ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1
- -rw-r----- 1 oracle oinstall 1097687040 Mar 6 12:12 ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1
- -rw-r----- 1 oracle oinstall 1051009024 Mar 6 12:13 ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1
- -rw-r----- 1 oracle oinstall 4294975488 Apr 3 15:07 ./oradata/epps/gmtinv_d07.dbf
- -rw-r----- 1 oracle oinstall 4194312192 Apr 1 22:36 ./oradata/epps/gmtinv_d08.dbf
- -rw-r----- 1 oracle oinstall 4294975488 Apr 3 15:54 ./oradata/epps/gmtinv_x01.dbf
- -rw-r----- 1 oracle oinstall 4294975488 Apr 3 15:57 ./oradata/epps/gmtinv_x02.dbf
- -rw-r----- 1 oracle oinstall 4294975488 Apr 1 22:35 ./oradata/epps/invsubmat_d08.dbf
- -rw-r----- 1 oracle oinstall 8589942784 Apr 4 09:55 ./oradata/epps/undotbs01.dbf
- -rw-r----- 1 oracle oinstall 8589942784 Apr 4 09:15 ./oradata/epps/undotbs02.dbf
当我们只需要查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令:
- [root@getlnx01 u03]# find . -type f -size +800M -print0 | xargs -0 du -h
- 1.3G ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1
- 1.1G ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1
- 1.2G ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1
- 1.2G ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1
- 1.5G ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1
- 1.1G ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1
- 1.3G ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1
- 1004M ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1
- 2.6G ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1
- 1.8G ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1
- 4.1G ./oradata/epps/invsubmat_d08.dbf
- 4.0G ./oradata/epps/gmtinv_d08.dbf
- 4.1G ./oradata/epps/gmtinv_x01.dbf
- 8.1G ./oradata/epps/undotbs02.dbf
- 4.1G ./oradata/epps/gmtinv_d07.dbf
- 8.1G ./oradata/epps/undotbs01.dbf
- 4.1G ./oradata/epps/gmtinv_x02.dbf
如果你还需要对查找结果按照文件大小做一个排序,那么可以使用下面命令:
- [root@getlnx01 u03]# find . -type f -size +800M -print0 | xargs -0 du -h | sort -nr
- 1004M ./flash_recovery_area/backup/backupsets/ora_df873524162_s46823_s1
- 8.1G ./oradata/epps/undotbs02.dbf
- 8.1G ./oradata/epps/undotbs01.dbf
- 4.1G ./oradata/epps/invsubmat_d08.dbf
- 4.1G ./oradata/epps/gmtinv_x02.dbf
- 4.1G ./oradata/epps/gmtinv_x01.dbf
- 4.1G ./oradata/epps/gmtinv_d07.dbf
- 4.0G ./oradata/epps/gmtinv_d08.dbf
- 2.6G ./flash_recovery_area/backup/backupsets/ora_df873513413_s46809_s1
- 1.8G ./flash_recovery_area/backup/backupsets/ora_df873514789_s46810_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873520789_s46817_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873519953_s46816_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873518302_s46814_s1
- 1.6G ./flash_recovery_area/backup/backupsets/ora_df873516500_s46812_s1
- 1.5G ./flash_recovery_area/backup/backupsets/ora_df873517396_s46813_s1
- 1.3G ./flash_recovery_area/backup/backupsets/ora_df873519197_s46815_s1
- 1.3G ./flash_recovery_area/backup/backupsets/ora_df873515765_s46811_s1
- 1.2G ./flash_recovery_area/backup/backupsets/ora_df873522876_s46820_s1
- 1.2G ./flash_recovery_area/backup/backupsets/ora_df873521714_s46818_s1
- 1.1G ./flash_recovery_area/backup/backupsets/ora_df873523646_s46822_s1
- 1.1G ./flash_recovery_area/backup/backupsets/ora_df873523321_s46821_s1
不过如上截图所示,有时候排列的顺序并不完全是按大小一致,这个是因为du命令的参数h所致,你可以统一使用使用MB来显示,这样就能解决这个问题。到这里,这个在Linux系统查找大文件的命令已经非常完美了,当然如果你还有很多的需求,那么可以在这个命令上做修改、调整.
2: 如何查找Linux下的大目录
譬如有时候磁盘空间告警了,而你平时又疏于管理、监控文件的增长,那么我需要快速的了解哪些目录变得比较大,那么此时我们可以借助du命令来帮我们解决这个问题。
- [root@getlnx01 u03]# du -h --max-depth=1
- 16K ./lost+found
- 33G ./flash_recovery_area
- 37G ./oradata
- 70G .
如果你想知道flash_recovery_area目录下面有哪些大文件夹,那么可以将参数max-depth=2 ,如果你想对搜索出来的结果进行排序,那么可以借助于sort命令。如下所示
- [root@getlnx01 u03]# du -h --max-depth=2 | sort -n
- 3.5G ./flash_recovery_area/EPPS
- 16K ./lost+found
- 29G ./flash_recovery_area/backup
- 33G ./flash_recovery_area
- 37G ./oradata
- 37G ./oradata/epps
- 70G .
- [root@getlnx01 u03]# du -hm --max-depth=2 | sort -n
- 1 ./lost+found
- 3527 ./flash_recovery_area/EPPS
- 29544 ./flash_recovery_area/backup
- 33070 ./flash_recovery_area
- 37705 ./oradata
- 37705 ./oradata/epps
- 70775 .
[root@getlnx01 u03]# cd /
[root@getlnx01 /]# du -hm --max-depth=2 | sort -n
有时候搜索出来的结果太多了(譬如,我从根目录开始搜索),一直在刷屏,如果我只想查出最大的12个文件夹,怎么办呢?此时就要借助head命令来显示了
- [root@getlnx01 /]# du -hm --max-depth=2 | sort -nr | head -12
- 407480 .
- 167880 ./u04
- 158685 ./u02/oradata
- 158685 ./u02
- 152118 ./u04/oradata
- 70775 ./u03
- 37705 ./u03/oradata
- 33070 ./u03/flash_recovery_area
- 5995 ./u01/app
- 5995 ./u01
- 3551 ./usr
- 1558 ./usr/share
- [root@getlnx01 /]#
查看具体目录:du -sh /www/cnmo/
查看整体概况:df -h
Linux Shell 汇总
1、查看当前操作系统类型
- #!/bin/sh
- SYSTEM=`uname -s`
- if [ $SYSTEM = "Linux" ] ; then
- echo "Linux"
- elif [ $SYSTEM = "FreeBSD" ] ; then
- echo "FreeBSD"
- elif [ $SYSTEM = "Solaris" ] ; then
- echo "Solaris"
- else
- echo "What?"
- fi
执行SHELL同步代码到预上线和代码回退
- hostname
- ############### 最后一次修改的用户 ####################
- cd /www/ftp/ysx/xfile/www
- ls -lh
- ############### 最后一次修改的用户 ####################
- cat /etc/redhat-release
- df -h
- rsync -avzut --progress --delete /www/ftp/ycw/xfile/www/assets liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas
- rsync -avzut --progress /www/ftp/ycw/xfile/www/json/assets.json liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas
- echo http://ysx.com/xfile/www/json/assets.json
- UNAME=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .name)
- VERSION=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .version)
- VERSION=${VERSION//\"/}
- UpdateTime=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .UpdateTime)
- UpdateTime=${UpdateTime//[[:space:]]/_}
- echo $UNAME
- echo $UpdateTime
- cp /www/ftp/ycw/xfile/www/json/assets.json /www/ftp/back/xfile/www/json/assets-$VERSION-$BUILD_USER_ID-v$BUILD_NUMBER.json
- 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
- echo "" > /www/ftp/back/xfile/www/sh/sh-$VERSION.txt
- 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
- 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
其他版本,不增加平台版本号:
- hostname
- ############### 最后一次修改的用户 ####################
- cd /www/ftp/ysx/xfile/www
- ls -lh
- ############### 最后一次修改的用户 ####################
- cat /etc/redhat-release
- df -h
- rsync -avzut --progress --delete /www/ftp/ycw/xfile/www/assets liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas
- rsync -avzut --progress /www/ftp/ycw/xfile/www/json/assets.json liuxinxiu@127.0.0.1::ysx_xfile_www --password-file=/pas/rsync.pas
- echo http://ysx.cnmo.me/xfile/www/json/assets.json
- UNAME=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .name)
- UNAME=${UNAME//\"/}
- VERSION=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .version)
- VERSION=${VERSION//\"/}
- UpdateTime=$(cat /www/ftp/ycw/xfile/www/json/assets.json | jq -c .UpdateTime)
- UpdateTime=${UpdateTime//[[:space:]]/_}
- UpdateTime=${UpdateTime//\"/}
- cp /www/ftp/ycw/xfile/www/json/assets.json /www/ftp/back/xfile/www/json/assets-$VERSION-$UNAME-$UpdateTime.json
- cd /www/ftp/ycw/xfile/www/ && zip -r -q /www/ftp/back/xfile/www/assets-json-$VERSION-$UNAME-$UpdateTime.zip assets json/assets.json
- echo "" > /www/ftp/back/xfile/www/sh/sh-$VERSION-$UNAME-$UpdateTime.txt
- 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
- 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
代码同步超级管理员
- myPath="/www/ftp/${userName//\"/}"
- ############### 这里的-d 参数判断$myPath是否存在 ###############
- if [ ! -d "$myPath" ] ; then
- echo "这个目录不存在呀!有问题请及时与管理员联系:liu.xinxiu@cnmo.com"
- cat $myPath
- exit
- #else
- #echo "目录存在!"
- fi
- ############### 这里的-d 参数判断$myPath是否存在 ###############
- proName=${projectName//\"/}
- proPath="$myPath/xfile/$proName"
- ysxPath="/www/ftp/ysx/xfile/$proName"
- backPath="/www/ftp/back/xfile/$proName"
- hostname
- ############### 最后一次修改的用户 ####################
- cd $proPath
- ls -lh
- ############### 最后一次修改的用户 ####################
- cat /etc/redhat-release
- df -h
- ############### 数据同步 ####################
- rsync -avzut --progress --delete $proPath/assets liuxinxiu@127.0.0.1::ysx_xfile_$proName --password-file=/pas/rsync.pas
- cp $proPath/json/assets.json $ysxPath/json/assets.json
- ############### 数据同步 ####################
- echo http://ysx.cnmo.me/xfile/$proName/json/assets.json
- UNAME=$(cat $proPath/json/assets.json | jq -c .name)
- UNAME=${UNAME//\"/}
- VERSION=$(cat $proPath/json/assets.json | jq -c .version)
- VERSION=${VERSION//\"/}
- UpdateTime=$(cat $proPath/json/assets.json | jq -c .UpdateTime)
- UpdateTime=${UpdateTime//[[:space:]]/__}
- UpdateTime=${UpdateTime//\:/_}
- UpdateTime=${UpdateTime//\"/}
- ############### 数据备份操作 ####################
- cp $proPath/json/assets.json $backPath/json/assets-${VERSION}__${UpdateTime}.json
- cd $proPath/ && zip -r -q $backPath/assets-${VERSION}__${UpdateTime}.zip assets json/assets.json
- echo "" > $backPath/sh/assets-${VERSION}__${UpdateTime}.txt
- echo cp $backPath/json/assets-${VERSION}__${UpdateTime}.json $ysxPath/json/assets.json >> $backPath/sh/assets-${VERSION}__${UpdateTime}.txt
- echo unzip -o $backPath/assets-${VERSION}__${UpdateTime}.zip -d $ysxPath >> $backPath/sh/assets-${VERSION}__${UpdateTime}.txt
- 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
- ############### 数据备份操作 ####################
- ############### 维护回退版本列表 ####################
- versionList="$backPath/versionList.txt"
- if [ ! -f "$versionList" ]; then
- #touch "$versionList"
- echo "vlist=assets-${VERSION}__${UpdateTime}" > $backPath/versionList.txt
- else
- #grep -q "裸照" urfile && echo "有的" || echo "没的"
- grep -q "assets-${VERSION}__${UpdateTime}" $backPath/versionList.txt && echo "相同代码在备份文件中已经存在,已再次执行了代码同步!您还可以选择代码回滚功能,一键回退指定版本~" || sed -i "/^vlist.*$/s//& ,assets-${VERSION}__${UpdateTime}/g" $backPath/versionList.txt
- fi
- ############### 维护回退版本列表 ####################
Node.js Cannot find module 'xxx' 问题解决(MAC)
使用npm install -g 'xxx' 之后仍然报
Cannot find module 'xxx' 错误,可以通过设置环境变量来解决;
export NODE_PATH=/usr/local/lib/node_modules/
echo $NODE_PATH
Error: Cannot find module 'ftp'
Linux shell判断文件和文件夹是否存在
#!/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整理
.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;
IE6 | IE7 | FF | |
* | √ | √ | × |
!important | × | √ | √ |
------------------------------------------------------
另外再补充一个,下划线"_",
IE6支持下划线,IE7和firefox均不支持下划线。
IE6 | IE7 | FF | |
* | √ | √ | × |
!important | × | √ | √ |
_ | √ | × | × |
于是大家还可以这样来区分IE6,IE7,firefox
: background:orange;*background:green;_background:blue;
注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。