八月 3rd, 2015

Linux硬链接和软连接

1.1介绍

硬链接:(hard link)

只针对于文件,通过索引节点来进行链接,在系统每一个文件和目录都会有一个inode索引节点,可以通过ls –il来查看当前目录下所有文件和目录的inode,而系统中的所有文件都不会有相同的indoe。如果有相同的indoe那么这个文件链接着另一个文 件,内容是相同的并同步,称为硬链接。可以使用ls –l命令显示出它的硬链接数。删掉源文件,硬链接文件正常使用。

软连接:(symbolic link)也称为符号链接

文件和目录都可以,软连接类似于windows下的快捷方式,删掉源文件后,软连接将不能正常使用。

1.2实践

创建硬链接

#ln 源文件 目标文件

创建软连接

#ln –s 源文件 目标文件

1.2.1硬链接

#mkdir /test

#cd /test

#touch aaa.txt

#echo “I am system administrator” >> aaa.txt

#ln aaa.txt /test/aaa.txt_hard_link

#ls -il

1144062 -rw-r--r-- 2 root root 26 Feb 20 20:17 aaa.txt

1144062 -rw-r--r-- 2 root root 26 Feb 20 20:17 aaa.txt_hard_link

可以看到两个文件的索引节点完全相同,而且硬链接数为2,文件本身也是1个硬链接数,每增加一个硬链接就加1,而且里面的内容完全相同

#mkdir bbb

#ln bbb /test/bbb.txt_hard_link

ln: `bbb': hard link not allowed for directory

硬链接是不能对目录操作

如果删掉aaa.txt源文件,它的硬链接文件aaa.txt_hard_link可以正常工作

1.2.2软链接

#ln –s aaa.txt /test/aaa.txt_soft_link

#ls –il

1144062 -rw-r--r-- 2 root root 26 Feb 20 20:17 aaa.txt

1144062 -rw-r--r-- 2 root root 26 Feb 20 20:17 aaa.txt_hard_link

1144065 lrwxrwxrwx 1 root root 7 Feb 20 20:55 aaa.txt_soft_link -> aaa.txt

文件类型是l链接文件,

可以对文件或目录使用软连接,删掉源文件aaa.txt.它的软连接文件aaa.txt_soft_link不能正常使用

1.3 作用

软链接:可以简短路径和文件名等

硬链接:可以对数据备份等,

文件链接数:创建出的新文件它的硬链接数是1,文件本身是一个硬链接。

目录链接数:目录硬链接是2因为目录本身也是一个硬链接,目录里的.点(当前目录)也是一个硬链接

八月 3rd, 2015

虽然通过 WordPress 强大的插件库,你几乎可以干任何的事情,但是有时候需要快速修复一些特定的问题的时候,直接操作数据库可能反而是方便的方法,所以这篇文章就给大家介绍 WordPress 数据库维护时常用到 12 个 SQL 语句。切记一点,操作前记得备份哦!!

*注:下面假设 WordPress 数据库的表的前缀都是默认的“wp_”。

1. 直接在数据库中修改密码

密码忘记了是经常的事情,博客密码忘记了进不去,可以直接在数据库里面修改:

UPDATE 'wp_users' SET 'user_pass' = MD5('PASSWORD') WHERE 'user_login' ='admin' LIMIT 1;

上面采用了 MySQL 的 MD5() 函数讲密码转成 MD5 Hash。

2. 将日志从一个作者转移到另外一个

假如你的博客的某个作者离开了,或者你不想让“admin”作为作者名,想把日志的作者从一个改到另外一个:

UPDATE wp_posts SET post_author=NEW_AUTHOR_ID WHERE post_author=OLD_AUTHOR_ID;

*注:你需要知道两个作者的 user id。

3. 删除数据库中日志修订记录和其相关的 post_meta 数据

特别是针对多人博客的时候,日志修订功能很重要,但是日志修订功能也在数据库里面添加了很多的数据,假设你的博客只有 100 篇日志,每篇日志有 10 个日志修订,你的 posts 表中就会有超过 1000 条记录,严重的数据冗余:

DELETE a,b,c FROM wp_posts a WHERE a.post_type = 'revision' LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);

*注:上面的 SQL 将删除数据库中所有的日志修订记录和其相关的 meta 信息(自定义字段)。

当然你还可以:彻底屏蔽日志修订功能。

4. 批量删除垃圾留言

如果你一段时间没有管理你的博客,刚好出去休假,没有办法上网,并且博客也没有装类似 Akismet 这类防垃圾留言插件,那么你回来的时候,你会发现博客后台有成千上万条垃圾留言需要你去审核。

这个时候,其实你只需要审核通过正常的留言,然后执行下面这条 SQL:

DELETE from wp_comments WHERE comment_approved = '0';

5. 查找没用的标签

你可能创建一些 WordPress 标签之后,就没有再使用,你可以通过下面这条 SQL 找到它们,然后安全的删除他们。

SELECT * From wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0;

6. 查找和替换数据

对于熟悉 MySQL 数据库的开发者来说,replace() 这个 MySQL 函数都应该很熟悉,它可以让你指定一个字段,然后替换它里面的字符串,一旦执行,所有这个字段里面的字符串都会被替换。对于 WordPress 博客来说,这个 SQL 则非常实用,它可以让你批量修改某些输入错误,或者某个邮件地址等等。

UPDATE table_name SET field_name = replace( field_name, 'string_to_find', 'string_to_replace' ) ;

替换日志内容中字符串:

UPDATE wp_posts SET post_content = replace( post_content, 'string_to_find', 'string_to_replace' ) ;

将某个留言者地址替换下:

UPDATE wp_comments SET comment_author_url = REPLACE( comment_author_url, 'http://oldurl.com', 'http://newurl.com' );

留言者邮箱:

UPDATE wp_comments SET comment_author_email = REPLACE( comment_author_email, 'old-email@address.com', 'new-email@address.com' );

还有一个 WordPress 插件 Search & Replace 还提供一个后台让你更加容易进行批量替换。

7. 获取所有留言者的邮件地址

有时候你想做点不是那么好的事情,比如给所有留言者发下邮件,告诉他们你博客做了一些新的功能,或者写了一个很不错的文章,那么你干坏事情之前,首先要获取所有留言者的邮件地址:

SELECT DISTINCT comment_author_email FROM wp_comments;

*注:上面的 DISTINCT 让你获取的邮件地址是唯一的,即使这个用户发过好几次留言,也不怕。

不过群发邮件这件事情个人建议还是不要这样做好。

8. 一次把所有插件都停了

网站出现问题了,需要一次把插件全部都先停了之后检测下:

UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';

9. 删除所有标签

有时候,你疯了,想删除博客所有的标签,这个时候你不能单纯的清空 wp_terms 表,因为 wp_terms 表同时存了分类和标签的数据,这样你就把分类信息也删除了,这样你就真的疯了。

DELETE a,b,c
FROM
	database.prefix_terms AS a
	LEFT JOIN database.prefix_term_taxonomy AS c ON a.term_id = c.term_id
	LEFT JOIN database.prefix_term_relationships AS b ON b.term_taxonomy_id = c.term_taxonomy_id
WHERE (
	c.taxonomy = 'post_tag' AND
	c.count = 0
	);

*注:上面 SQL 除了删除标签,还删除了所有标签和标签和日志关联的关系。

10. 列出没用的 post meta

wp_postmeta 中的数据是由一些插件或者自定义字段生成的,他是对 wp_posts 表的一种无限的扩展,但是可能由于某种原因,日志被删除了,但是它的 meta 信息还存在 wp_postmeta 表中,下面这条 SQL 将这些没有关联日志的 meta 数据列出:

SELECT * FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;

11. 关闭旧日志留言功能

厄,对于一些技术博客或者其他博客来说,一些旧日志的内容可能已经过时了,但是一些读者,还是对一些问题“纠缠不清”或者“喋喋不休”,怎么办,把留言关了就好了:

关闭留言:

UPDATE wp_posts SET comment_status = 'closed' WHERE post_date < '2009-01-01' AND post_status = 'publish';

关闭Trackback:

UPDATE wp_posts SET ping_status="closed" WHERE post_date < '2009-01-01' AND post_status = 'publish';

12. 删除所有 url 含有特定字符串的留言

一些留言者很烦,一次留几十个,其链接都指定到一些卖伟哥,起重机,SEO 的站点,烦人的很,一个一个删,又累,下面这条 SQL 可以来帮忙:

DELETE from wp_comments WHERE comment_author_url LIKE "%viagra%" ;

简单总结

这些 SQL 语句是直接对数据库进行操作的,如果你不是那么懂数据库或者 SQL 语言,建议你不要这么做,如果你还是比较自信 SQL 操作,建议操作之前备份下数据库。

 

TAGS: ,
七月 27th, 2015

使用cPanel安装过WordPress的不少朋友应该都有过类似经历,访问WordPress出现如下错误提示:Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate xxx bytes)。有的是访问网站出现,有的是访问后台时出现,还有的是登录后台后在dashboard里面看到的。这个提示是说,我们正在进行的操作需要这 么多的内存,但现在服务器分配的内存不足。正常情况下,修改下虚拟主机的默认配置就可以了,下面和大家分享下解决的方法:
1.修改虚拟主机的内存大小限制
到你的网站根目录下,建立一个php.ini文件,写入下面这句:memory_limit = 64M,之后可以通过phpinfo函数来查看memory_limit是否已经变成64M。方法为新建一个php文件,可以命名成info.php, 在其中写入phpinfo()函数,保存后访问此文件查看服务器的php配置。如果发现修改之后没有生效,可以试下在网站根目录的.htaccess文件 中写入:suPHP_ConfigPath /home/cpusername/public_html(这是针对suphp环境的Linux服务器,目录可以具体到网站所在的具体目录,默认情况 下,网站程序一般是放在public_html下的),这个设置是为了告诉mod_suphp向哪些路径传递php解释器(有时候可能还需要 在.htaccess中设置PHPRC环境变量,如SetEnv PHPRC /home/cpusername/public_html)。

2.修改WP配置文件。
这个比较简单,编辑wp-config.php这个配置文件,加上一句:define(‘WP_MEMORY_LIMIT’, ’64M’);其中64M可以写得更大,比如128M。一般64M肯定够用了。

如此,一般就可以解决这种错误提示了。解决之后还有部分朋友访问网站可能会出现:Warning: Cannot modify header information – headers already sent by (output started at /home/cpusername/public_html/wp-settings.php:327) in /home/cpusername/public_html/wp-admin/install.php on line 54类似的错误,不要紧,在php.ini中写上output_buffering=4096即可解决。

七月 27th, 2015

cPanel高级DNS区域编辑器提示You do not have permission to read the zone:

dont have permission

这个错误提示很奇怪,检查了下WHM的DNS Functions>>Edit DNS Zone中域名的解析记录均正常存在。服务器上/var/named下也能找到域名对应的.db文件。
执行/scripts/whoowns 域名的时候提示是空白,正常情况下会显示cPanel的用户名。于是判断应该是域名没有被识别导致的。最后经过比对发现了原来是cPanel账户的配置文件中丢失了域名的DNS记录。解决方法如下
#cd /var/cpanel/users (该目录下是服务器上的每个cPanel用户的账户配置文件)
# vi test(假设用户的cPanel用户名是test)
再最后将不能查看DNS解析的域名按照如下格式添加:
DNS1=test2.com
DNS2=test2.com
….
添加完成之后保存退出,再执行:
/scripts/updateuserdomains

然后等几十秒再尝试在DNS高级编辑器中查看域名的解析,会发现虽然还存在这个错误,但是解析记录都能显示了。如果显示出来的A记录IP和主机IP不一致,可以重置下DNS区域文件

 

重置之后同样等待几十秒,解析就正常了。

七月 27th, 2015

某些时候,可能会用到记录命令的执行时间的问题,所以在这里来给大家介绍一下

编辑/etc/bashrc,添加以下配置信息:

# 让系统记录每条历史命令的执行时间。注意最后的”号前面要放个空格,否则时间就与命令在一起,不方便也不美观

export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "

# 以下是关于记录文件大小与命令条数的设置,根据需要来设置

# 设置保存历史命令的文件大小

export HISTFILESIZE=1000000

# 保存历史命令条数

export HISTSIZE=2000

 

执行下面的命令使配置立即生效:

source /etc/bashrc

 

再次查看历史命令记录:

history
就可以看到了。

 

TAGS: ,
七月 27th, 2015

最近发现登录Wordpress后台异常缓慢,经常卡在fonts.googleapis.com,这是由于Wordpress后台外链加载了谷歌字体 (代码位置在wordpress\wp-includes\script-loader.php第580行),而谷歌服务器大家都知道的原因国内访问困 难,严重影响页面加载速度。

google

解决办法:
将下面代码添加到主题functions.php文件中:

function coolwp_remove_open_sans_from_wp_core() {    wp_deregister_style( ‘open-sans’ );    wp_register_style( ‘open-sans’, false );    wp_enqueue_style(‘open-sans’,”);}add_action( ‘init’, ‘coolwp_remove_open_sans_from_wp_core’ );

之后,再次登录后台速度明显提升。

原因:

因Google字库中只有英文,对国人无任何用处,换用国内某字体服务的方法同样意义不大,禁掉最实用。

上述方法对前台主题加载Google字体无效,国外主题也多采用外链Google字体,自行手动修改模板删除相关代码。

注:这已是目前国内使用Wordpress所必须做的,建议国内主题设计者直接集成在主题中,不然刚接触WP的新手,会因此放弃,瓷瓶国又一悲剧!

七月 11th, 2015

1.使用安全密码
编辑/etc/login.defs配置密码选项。一般来说,建议密码至少设置8位或者8位以上,包含大小字母和数字,有特殊符号更好。如果你想知道你设置的密码是否安全,可以用 JTR cracker之类工具来破解下,如果几个小时被破解了,说明密码不够安全。也可以使用pam_passwdqc工具来检测密码强度。

2.加固SSH安全
启用SSH的公共密钥并禁用密码验证。
编辑/etc/ssh/sshd_config文件修改SSH的默认22端口为其它端口比如1653。
使用SSHv2而不是SSHv1,方法为修改/etc/ssh/sshd_config中##Protocol 2,1为#Protocol 2。
编辑/etc/security/limits.conf限制用户Shell资源的使用。

3.安全Apache
使用mod_security。通过EasyApache即可编译mod_security。
编译Apache的时候,将suexec编辑进去确保CGI程序和脚本以拥有者的身份被拥有和执行。这样出问题的时候容易判断是哪个用户引起的。
通过PHPsuexec编辑Apache和PHP。PHPsuexec强制所有的PHP脚本以拥有者的身份执行。
启用PHP open_basedir保护,这样用户就不能通过PHP打开他们主目录之外的文件。
为PHP 5启用safe_mode,保证PHP脚本的拥有者与所操作到的任何文件的拥有者是一直的。编辑php.ini文件,设置safe_mode = On即可。

4.加固/tmp目录安全
为/tmp目录使用单独的nosetuid分区,这样会强制让进程仅以执行者拥有的权限运行。cPanel安装之后以noexec方式载入/tmp。
执行/scripts/securetmp将/tmp分区载入到一个临时文件。

5.升级邮件到邮件maildir格式
Maildir格式更安全并且能够加速邮件系统。目前最新的cPanel版本均会自动使用Maildir。如果你的cPanel版本比较老的话,可以通过 /scripts/convert2maildir来升级到Maildir。如果执行的时候提示Maildir已经启用,就不需要再执行了。

6.关闭系统的编译器
大多数用户都不需要使用C和C++编译器。使用Security Center中的Complier Access功能关闭未授权使用编译器的用户使用它们,或者仅仅关闭特定用户使用编译器的权限。

7.关闭不使用的服务和进程
检查/etc/xinetd.conf看下哪些服务你不在使用。比如cupsd和nfs/statd这些一般都不会用到。
你可以到Service Configuration中的Service Manager里关闭不用的服务。

8.监控你的系统
要实时监控你的系统,确保你能知道有哪些账户被创建了,哪些软件被安全了,或者哪些软件需要更新等。

定期检查你的系统比如检查下面这些:
netstat -anp:查找你没有安装或者授权的端口在运行的程序。
find / ( -perm -a+w ) ! -type l >> world_writable.txt:查找world_wirtable.txt文件来查看所有的可写文件和目录。这样有助于发现攻击者藏在你系统上的文件。
find / -nouser -o -nogroup>> no_owner.txt:查找那些不属于任何用户或者组的文件。所有的文件都必须属于某个特定用户或者组。
ls /var/log/:系统日志所在目录。这里可以检查系统日志,apache日志,邮件日志等等。

有一些简单易用的工具能够扫描出系统的rootkits,backdoors等:

10.保持cPanel更新
确保你使用的cPanel版本能够不断更新,始终保持使用最新的稳定版本。同时确保内核、用户应用程序(如用户的CMS等)、系统软件。
cPanel的自动升级更新以及系统软件的更新可以在WHM中的Server Configuration中的Update Preferences里设置。

七月 11th, 2015

为了提高WordPress网站文章的排版和美观性,我们经常会把每段文章的首行缩进两个字符,每次手动修改又比较麻烦,其实只需在css文件里添加一段代码即可实现。

此方法对大部分主题都有效,当然某些强大的老外企业、CMS主题除外…

方法:进入WP后台 – 主题 – 编辑,找到 style.css 文件,在最下方插入如下代码:

.content p{text-indent:2em;}

或者

#content p{text-indent:2em;}

 

第一行代码如果不行就试试第二行,其实它们的原理都一样,代码中的“2em”可以随意修改。

 

七月 11th, 2015

WordPress默认的管理员用户名就是admin,而且修改都需要通过数据表,但是其实WordPress也很早就已经可以让用户在注册的时候选择自己的用户名,而不是默认的 admin,但是在给一些收费用户提供技术支持的时候发现,他们提供的用户基本都是admin,原来大家都习惯了把网站的管理员用户名设置成 admin,这样的方式是非常的流行和被大家习惯的去使用。

为了防止安全隐患,子凡建议不论是做什么网站,管理员的用户名最好都不要使用admin这个用户名,或者只是在网站后台添加一个这样的一个用户名而 已,但是不给予管理员权限,这样可以防止网络上一些扫描和尝试网站的登录,所以我们可以禁止使用admin用户名尝试登录WordPress,当机器使用 admin扫描博客的时候,直接把登陆界面屏蔽了,不让其扫描。

具体可以当前主题的 functions.php 文件中加入如下代码:

//WordPress禁止使用admin用户名尝试登录

add_filter( ‘wp_authenticate’, ‘fanly_no_admin_user’ );function

fanly_no_admin_user($user){

if($user == ‘admin’){

exit;    }

}

add_filter(‘sanitize_user’, ‘fanly_sanitize_user_no_admin’,10,3);function fanly_sanitize_user_no_admin($username, $raw_username, $strict){

if($raw_username == ‘admin’ || $username == ‘admin’){

exit;    }

return $username;}

 

 

 

如果你的WordPress还在使用admin这样的用户名,建议你通过后台新建一个管理员账户,然后删除admin这个用户。

 

七月 11th, 2015

从国外的论坛上找到的一份cPanel服务器系统目录及文件的说明,很详细,供使用cPanel服务器的童鞋参考:

 

Apache

/usr/local/apache

+ bin- apache binaries are stored here – httpd, apachectl, apxs

+ conf – configuration files – httpd.conf

+ cgi-bin

+ domlogs – domain log files are stored here

+ htdocs

+ include – header files

+ libexec – shared object (.so) files are stored here – libphp4.so,mod_rewrite.so

+ logs – apache logs – access_log, error_log, suexec_log

+ man – apache manual pages

+ proxy –

+ icons –

 

CPanel

/usr/local/cpanel

+ 3rdparty/ – tools like fantastico, mailman files are located here

+ addons/ – AdvancedGuestBook, phpBB etc

+ base/ – phpmyadmin, squirrelmail, skins, webmail etc

+ bin/ – cpanel binaries

+ cgi-sys/ – cgi files like cgiemail, formmail.cgi, formmail.pl etc

+ logs/ – cpanel access log and error log

+ whostmgr/ – whm related files

 

WHM

/var/cpanel – whm files

+ bandwidth/ – rrd files of domains

+ username.accts – reseller accounts are listed in this files

+ packages – hosting packages are listed here

+ root.accts – root owned domains are listed here

+ suspended – suspended accounts are listed here

+ users/ – cpanel user file – theme, bwlimit, addon, parked, sub-domains all are listed in this files

+ zonetemplates/ – dns zone template files are taken from here

 

Important CPanel/WHM files

/etc/domainips    独立ip                如果共享ip被当成了独立ip删除这里的就可以了

/etc/httpd/conf/httpd.conf – apache configuration file

/etc/exim.conf – mail server configuration file

/etc/named.conf – name server (named) configuration file

/etc/proftpd.conf – proftpd server configuration file

/etc/pure-ftpd.conf – pure-ftpd server configuration file

/etc/valiases/domainname – catchall and forwarders are set here

/etc/vfilters/domainname – email filters are set here

/etc/userdomains – all domains are listed here – addons, parked,subdomains along with their usernames

/etc/localdomains – exim related file – all domains should be listed here to be able to send mails

/var/cpanel/users/username – cpanel user file

/var/cpanel/cpanel.config – cpanel configuration file ( Tweak Settings )

/etc/cpbackup-userskip.conf –

/etc/sysconfig/network – Networking Setup

/etc/hosts –

/var/spool/exim –

/var/spool/cron –

/etc/resolv.conf – Networking Setup Resolver Configuration

/etc/nameserverips – Networking Setup Nameserver IPs ( For resellers to give their nameservers )

/var/cpanel/resellers – For addpkg, etc permissions for resellers.

/etc/chkserv.d – Main >> Service Configuration >> Service Manager

/var/run/chkservd – Main >> Server Status >> Service Status

/var/log/dcpumon – top log process

/root/cpanel3-skel – skel directory. Eg: public_ftp, public_html.

/etc/wwwacct.conf – account creation defaults file in WHM (Basic cPanel/WHMSetup)

/etc/cpupdate.conf – Update Config

/etc/cpbackup.conf – Configure Backup

/etc/clamav.conf – clamav (antivirus configuration file )

/etc/my.cnf – mysql configuration file

/usr/local/Zend/etc/php.ini OR /usr/local/lib/php.ini – php configuration file

/etc/ips – ip addresses on the server (except the shared ip)

/etc/ipaddrpool – ip addresses which are free

/etc/ips.dnsmaster – name server ips

/var/cpanel/Counters – To get the counter of each users.

/var/cpanel/bandwidth – To get bandwith usage of domains

 

PHP

Program :/usr/local/bin/php, /usr/bin/php

ini file: /usr/local/lib/php.ini – apache must be restarted after any change to this file

 

Exim

Conf : /etc/exim.conf – exim main configuration file

/etc/localdomains – list of domains allowed to relay mail

Log : /var/log/exim_mainlog – incoming/outgoing mails are logged here

/var/log/exim_rejectlog – exim rejected mails are reported here

/var/log/exim_paniclog – exim errors are logged here

Mail queue: /var/spool/exim/input

Cpanel script to restart exim – /scripts/restartsrv_exim

Email forwarders and catchall address file – /etc/valiases/domainname.com

Email filters file – /etc/vfilters/domainname.com

POP user authentication file – /home/username/etc/domainname/passwd

catchall inbox – /home/username/mail/inbox

POP user inbox – /home/username/mail/domainname/popusername/inbox

POP user spambox – /home/username/mail/domainname/popusername/spam

Program : /usr/sbin/exim (suid – -rwsr-xr-x 1 root root )

Init Script: /etc/rc.d/init.d/exim

 

MySQL

Program : /usr/bin/mysql

Init Script : /etc/rc.d/init.d/mysql

Conf : /etc/my.cnf, /root/.my.cnf

Data directory – /var/lib/mysql – Where all databases are stored.

Database naming convention – username_dbname (eg: john_sales)

Permissions on databases – drwx 2 mysql mysql

Socket file – /var/lib/mysql/mysql.sock, /tmp/ mysql.sock