欲速则不达,切记
dedecms 嵌套dsql
织梦CMS中嵌套查询语句,SetQuery和GetObject传入不同的参数就可以了。
if($keyword != '') { $query2 = "SELECT id,title,typeid FROM `#@__archives` where arcrank>-1 AND ($keyword) ORDER BY id desc limit 0,5"; } else { $query2 = "SELECT id,title,typeid FROM `#@__archives` where arcrank>-1 ORDER BY id desc limit 0,5"; } $dsql->SetQuery($query2); $dsql->Execute(1); while($row=$dsql->GetObject(1)) { $dsql->SetQuery("Select typedir From `#@__arctype` where id='$row->typeid'"); $dsql->Execute(2); $ttrow=$dsql->GetObject(2); $tpdir=substr($ttrow->typedir,10); $likearticle .= "
使用Denyhosts防止SSHD和VSFTPD暴力破解
Denyhosts防止暴力破解主要是根据登录的日志/var/log/secure(centos为例),登录失败次数超过一定的阀值将IP写入/etc/hosts.deny文件中。文件格式如下:
#服务名称:ip地址 sshd: 180.97.239.49 ALL: 180.78.180.186
Denyhosts是专门用于防止SSHD登录,默认也是防止sshd登录的配置;如果想让vsftpd也添加一个安全的墙,需要在配置中添加以下信息,主要是格式化了匹配的正则表达式。
denyhosts.cfg: SSHD_FORMAT_REGEX=.* (sshd.*:|[sshd]|vsftpd.*:) (?P.*) USERDEF_FAILED_ENTRY_REGEX=authentication failure.* ruser=(?P S+) rhost=(?P S+) BLOCK_SERVICE = ALL
修改后,需要重启denghosts服务。
vsftpd如果使用这种机制需要开启tcp_wrappers(默认是开启的)
tcp_wrappers=YES
dizcuz 不能加载模板问题
今天帮朋友迁移一个教育网站,在目标主机上面搭建好LNMP后,把网站打包上传,数据库备份上传,把数据库导入,网站文件和目录设置好,还有一些乱七八糟的设置设置。配置弄好后,启动程序,测试一下网站是否和原来的功能是否一致,页面是否都正常,需要和没迁移前保持一样。经过测试,其他的几个模块都没有问题,有一个BBS的模块,使用的dizcuz的程序,版本有些老了,打开首页直接显示模板内容了。看了对应的php是可以解析的,php解析没有问题,再看权限,设置的也合理。最后看了看解析的代码页没有问题,网站的文件都是打包过来的,文件一致性肯定能保证,肯定是环境哪里设置的问题。最好找了半天发现一个php的参数没有修改,原来是short_open_tag = Off,修改为On,重启一下php-fpm,(如果你是apache+php模块,就重启apache),再次访问就正常了。关于这个参数区别如下:
php.ini ; This directive determines whether or not PHP will recognize code between ; and ?> tags as PHP source which should be processed as such. It's been ; recommended for several years that you not use the short tag "short cut" and ; instead to use the full tag combination. With the wide spread use ; of XML and use of these tags by other languages, the server can become easily ; confused and end up parsing the wrong code in the wrong context. But because ; this short cut has been a feature for such a long time, it's currently still ; supported for backwards compatibility, but we recommend you don't use them. ; Default Value: On ; Development Value: Off ; Production Value: Off ; http://php.net/short-open-tag short_open_tag = On
这种情况也只有迁移的时候会遇到,如果重新安装,discuz检查php参数的时候肯定是报错不通过的。
git 设置HTTP代理
git设置HTTP代理,很简单,网上有些比较复杂,应该版本低的问题。一条命令即可。
git config --global http.proxy http://10.196.61.92:8080
Dedecms GBK版本后台系统设置无法输入中文问题
最近用dedecms搭建了一个简单的站,主要用于测试。发现在后台系统-系统基础参数。很多选项没有办法成功设置中文。
实际上提交已成功,看数据库dede_sysconfig记录已成功插入,应该属于显示问题。看显示代码
dede/templets/sys_info.htm: echo "{$addstr}";
用于转换html特殊字符,网上查询了一下,是PHP5.4以上版本会有这个问题,必须指定编号类型。需修改为
echo "{$addstr}";
修改后,再修改系统基础参数就可以显示了。
因为代码中太多类似的代码了,最好还是降低一下php的版本。
py2exe error [Errno 2] No such file or directory 'MSVCP90.dll'
使用py2exe生产windows可执行程序时,报错:error: [Errno 2] No such file or directory: ‘MSVCP90.dll’
原脚本:
#!/usr/bin/env python __author__ = 'key1088' __date__ = '15-3-7' from distutils.core import setup import py2exe setup(console=["overtime.py"])
使用生产命令:
F:workdirpython1>D:Python27python.exe mysetup.py py2exe running py2exe creating F:workdirpython1build creating F:workdirpython1buildbdist.win32 creating F:workdirpython1buildbdist.win32winexe creating F:workdirpython1buildbdist.win32winexecollect-2.7 creating F:workdirpython1buildbdist.win32winexebundle-2.7 creating F:workdirpython1buildbdist.win32winexetemp creating F:workdirpython1dist *** searching for required modules *** *** parsing results *** creating python loader for extension 'unicodedata' (D:Python27DLLsunicodedata.pyd -> unicodedata.pyd) creating python loader for extension 'wx._misc_' (D:Python27libsite-packageswx-3.0-mswwx_misc_.pyd -> wx._misc_.pyd) creating python loader for extension 'select' (D:Python27DLLsselect.pyd -> select.pyd) creating python loader for extension 'wx._windows_' (D:Python27libsite-packageswx-3.0-mswwx_windows_.pyd -> wx._windows_.pyd) creating python loader for extension '_hashlib' (D:Python27DLLs_hashlib.pyd -> _hashlib.pyd) creating python loader for extension 'wx._gdi_' (D:Python27libsite-packageswx-3.0-mswwx_gdi_.pyd -> wx._gdi_.pyd) creating python loader for extension 'wx._controls_' (D:Python27libsite-packageswx-3.0-mswwx_controls_.pyd -> wx._controls_.pyd) creating python loader for extension '_sqlite3' (D:Python27DLLs_sqlite3.pyd -> _sqlite3.pyd) creating python loader for extension 'bz2' (D:Python27DLLsbz2.pyd -> bz2.pyd) creating python loader for extension 'wx._core_' (D:Python27libsite-packageswx-3.0-mswwx_core_.pyd -> wx._core_.pyd) *** finding dlls needed *** error: [Errno 2] No such file or directory: 'MSVCP90.dll'
修改代码最后一行:
setup(console=["overtime.py"],options = { "py2exe":{"dll_excludes":["MSVCP90.dll"]}})
生成exe文件成功。
为了使py2exe打出来的可执行文件不出现中文乱码,每次输出要采用以下格式:print unicode(“中文”,”utf-8”)
用tcgetattr、tcsetattr实现密码输入框
在读ptrunnel的代码时,发现一个很好的用法记录一下,可用于密码的输入框,不回显输入内容,可用于很多场景。
代码如下:
static int terminal_echo_off(int fd) { struct termios term; if (isatty(fd) == 0) { #ifdef DEBUG printf("the file %i is not a terminaln", fd); #endif /* DEBUG */ return -1; } if (tcgetattr(fd, &term) < 0) { #ifdef DEBUG perror("tcgetattr: "); #endif /* DEBUG */ return -1; } term.c_lflag &= ~ECHO; if (tcsetattr(fd, TCSANOW, &term) < 0) { #ifdef DEBUG perror("tcsetattr: "); #endif /* DEBUG */ return -1; } return 0; } static int terminal_echo_on(int fd) { struct termios term; if (isatty(fd) == 0) { #ifdef DEBUG printf("the file %i is not a terminaln", fd); #endif /* DEBUG */ return -1; } if (tcgetattr(fd, &term) < 0) { #ifdef DEBUG perror("tcgetattr: "); #endif /* DEBUG */ return -1; } term.c_lflag |= ECHO; if (tcsetattr(fd, TCSANOW, &term) < 0) { #ifdef DEBUG perror("tcsetattr: "); #endif /* DEBUG */ return -1; } return 0; }
LINUX 设置库优先级变量LD_PRELOAD
在Unix操作系统的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。
大家想到着就邪恶了吧,今天看proxychanis代码发现的,和win平台sockscap32类似。
看代码test.c
#include#include #include int main(void) { char *passwd="abcd"; char in_buff[10]; printf("-->input your passwd:"); scanf("%s", in_buff); if( strcmp(passwd,in_buff) != 0) { printf("passwd errn"); exit(-1); } printf("ok!. open doorn"); }
库代码hack.c
#includeint strcmp(const char *s1, const char *s2) { printf("hack function invoked. s1=[%s],s2=[%s]n", s1, s2); return 0; }
[root@localhost preload]# gcc -o test test.c [root@localhost preload]# ./test -->input your passwd:123 passwd err [root@localhost preload]# gcc -shared -o hack.o hack.c [root@localhost preload]# ls -l hack.so -rwxr-xr-x 1 root root 4116 Apr 13 15:52 hack.so [root@localhost preload]# LD_PRELOAD="./hack.so" [root@localhost preload]# ./test -->input your passwd:123 passwd err [root@localhost preload]# export LD_PRELOAD="./hack.so" [root@localhost preload]# ./test -->input your passwd:123 hack function invoked. s1=[abcd],s2=[123] ok!. open door [root@localhost preload]#
这是一种思路,还有一种最直接的办法用ltrace
ltrace是跟踪调用库函数的工具
[root@localhost preload]# export LD_PRELOAD= [root@localhost preload]# ltrace ./test (0x69951c, 0x699ab0, 0, 0, 0x699e58) = 0x6998e4 __libc_start_main(0x80484a4, 1, 0xbf948364, 0x8048530, 0x8048520printf("-->input your passwd:") = 21 __isoc99_scanf(0x80485ff, 0xbf9482a2, 0x9acce0, 0x9abff4, 0x8048530-->input your passwd:123 ) = 1 strcmp("abcd", "123") = 1 puts("passwd err"passwd err ) = 11 exit(1 +++ exited (status 1) +++ [root@localhost preload]#
perl 命令行常用语法
替换
将所有C程序中的foo替换成bar,旧文件备份成.bak
perl -p -i.bak -e ‘s/bfoob/bar/g’ *.c
很强大的功能,特别是在大程序中做重构。记得只有在UltraEdit用过。 如果你不想备份,就直接写成 perl -p -i -e 或者更简单 perl -pie, 恩,pie这个单词不错
将每个文件中出现的数值都加一
perl -i.bak -pe ‘s/(d+)/ 1 + $1 /ge’ file1 file2 ….
将换行符rn替换成n
perl -pie ‘s/rn/n/g’ file
同dos2unix命令。
将换行符n替换成rn
perl -pie ‘s/n/rn/g’ file
同unix2dos命令。
取出文件的一部分
显示字段0-4和字段6,字段的分隔符是空格
perl -lane ‘print “@F[0..4] $F[6]”‘ file
很好很强大,同 awk ‘print $1, $2, $3, $4, $5, $7’。参数名称lane也很好记。
如果字段分隔符不是空格而是冒号,则用
perl -F: -lane ‘print “@F[0..4]n”‘ /etc/passwd
显示START和END之间的部分
perl -ne ‘print if /^START$/ .. /^END$/‘ file
恐怕这个操作只有sed才做得到了吧……
相反,不显示START和END之间的部分
perl -ne ‘print unless /^START$/ .. /^END$/‘ file
显示开头50行:
perl -pe ‘exit if $. > 50’ file
同命令 head -n 50
不显示开头10行:
perl -ne ‘print unless 1 .. 10’ file
显示15行到17行:
perl -ne ‘print if 15 .. 17’ file
每行取前80个字符:
perl -lne ‘print substr($, 0, 80) = “”‘ file
每行丢弃前10个字符:
perl -lne ‘print substr($, 10) = “”‘ file
搜索
查找comment字符串:
perl -ne ‘print if /comment/‘ duptext
这个就是普通的grep命令了。
查找不含comment字符串的行:
perl -ne ‘print unless /comment/‘ duptext
反向的grep,即grep -v。
查找包含comment或apple的行:
perl -ne ‘print if /comment/ || /apple/‘ duptext
相同的功能就要用到egrep了,语法比较复杂,我不会……
计算
计算字段4和倒数第二字段之和:
perl -lane ‘print $F[4] + $F[-2]’
要是用awk,就得写成 awk ‘{i=NF-1;print $5+$i}’
排序和反转
文件按行排序:
perl -e ‘print sort <>’ file
相当于简单的sort命令。
文件按段落排序:
perl -00 -e ‘print sort <>’ file
多个文件按文件内容排序,并返回合并后的文件:
perl -0777 -e ‘print sort <>’ file1 file2
文件按行反转:
perl -e ‘print reverse <>’ file1
相应的命令有吗?有……不过挺偏,tac(cat的反转)
数值计算
10进制转16进制:
perl -ne ‘printf “%xn”,$‘
10进制转8进制: perl -ne ‘printf “%on”,$‘
16进制转10进制:
perl -ne ‘print hex($).”n”‘
8进制转10进制:
perl -ne ‘print oct($).”n”‘
简易计算器。
perl -ne ‘print eval($_).”n”‘
其他
启动交互式perl:
perl -de 1
查看包含路径的内容:
perl -le ‘print for @INC’
备注
与One-Liner相关的Perl命令行参数:
-0<数字>
(用8进制表示)指定记录分隔符($/变量),默认为换行
-00
段落模式,即以连续换行为分隔符
-0777
禁用分隔符,即将整个文件作为一个记录
-a
自动分隔模式,用空格分隔$_并保存到@F中。相当于@F = split ‘’。分隔符可以使用-F参数指定
-F
指定-a的分隔符,可以使用正则表达式
-e
执行指定的脚本。
-i<扩展名>
原地替换文件,并将旧文件用指定的扩展名备份。不指定扩展名则不备份。
-l
对输入内容自动chomp,对输出内容自动添加换行
-n
自动循环,相当于 while(<>) { 脚本; }
-p
自动循环+自动输出,相当于 while(<>) { 脚本; print; }