Vi/Vim查找替换使用方法

vi/vim 中可以使用 :s 命令来替换字符串。该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询。
 
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
 
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
 
  :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
 
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
 
  n 为数字,若 n 为 .,表示从当前行开始到最后一行
 
 :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
 
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
 
  可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
 
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
 
  :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
 
  1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
 
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
 
  2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
 
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
 
  (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
 
  3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
 
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
 
  4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
 
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
 
  5. 删除文本中的^M
 
  问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
 
  。 使用命令:cat filename1 | tr -d “^V^M” > newfile;
 
  。 使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必须要手工进行输入,而不是粘贴。
 
  。 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//.
 
  。 :%s/^M$//g
 
  如果上述方法无用,则正确的解决办法是: [Page]
 
  。 tr -d ”\r ” dest
 
  。 tr -d ”\015 ” dest
 
  。 strings A>B
6. 替换确认
我们有很多时候会需要某个字符(串)在文章中某些位置出现时被替换,而其它位置不被替换的有选择的操作,这就需要用户来进行确认,vi的查找替换同样支持
例如
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
在命令后面加上一个字母c就可以实现,即:s/vivian/sky/gc
顾名思意,c是confirm的缩写
 
  7. 其它
 
  利用 :s 命令可以实现字符串的替换。具体的用法包括:
 
  :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
 
  :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
 
  :。,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
 
  :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
 
  :g/str1/s//str2/g 功能同上
 
  从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
 
  字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作
来源:http://lwg2001s.iteye.com/blog/1182704

php无法发送邮件的原因

遇到过两次php mail无法发送邮件,第一次是没有正确设置hostname,http://devops.webres.wang/2011/10/wordpress-slow-comment-solution/,这次需要设置/etc/php.ini文件里sendmail的路径,设置php sendmail路径方法如下:
打开/etc/php.ini(不一定是这个路径),搜索;sendmail_path = 更改为sendmail_path = /usr/sbin/sendmail -t -i(不一定是这个路径,你可以通过whereis sendmail查找)。之后重启php就OK。

配置apache以fastcgi运行php

apache默认是用自带的mod_php模块运行php,现在我们介绍使用fastcgi来执行php脚本。先说下fastcgi的优点:
Fastcgi的优点:

  • 从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑.
  • · 从安全性上看,Fastcgi支持分布式运算. fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮.
  • · 从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态
  • IO处理完全不需要逻辑程序的参与.
  • · 从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序 (php,java,perl,ruby,c++,python…)
  • · 适用操作系统,可在任何平台上http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz使用
  • 安装apache

    1. wget http://apache.ziply.com//httpd/httpd-2.2.21.tar.gz
    2. tar xzf httpd-2.2.21.tar.gz
    3. cd httpd-2.2.21
    4. ./configure –prefix=/usr/local/apache
    5. make && make install

    安装fastcgi

    1. wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
    2. tar xzf mod_fastcgi-2.4.6.tar.gz
    3. cd mod_fastcgi-2.4.6
    4. cp Makefile.AP2 Makefile
    5. make top_dir=/usr/local/apache
    6. make top_dir=/usr/local/apache install

    完成之后编辑httpd.conf配置文件,加入fastcgi模块装载代码:

    1. LoadModule fastcgi_module modules/mod_fastcgi.so

    安装php5.2

    1. wget http://us2.php.net/get/php-5.2.17.tar.gz/from/am.php.net/mirror
    2. tar xzf php-5.2.17.tar.gz
    3. cd php-5.2.17
    4. ./configure –prefix=/usr/local/php –enable-fastcgi –disable-cli
    5. make && make install

    配置apache支持php

    编辑httpd.conf文件,加入如下代码:

    1. ### fastcgi ###
    2. ScriptAlias /fcgi-bin/ "/usr/local/php/bin/"
    3. AddHandler php-fastcgi .php
    4. Action php-fastcgi /fcgi-bin/php-cgi
    5. AddType application/x-httpd-php .php
    6.  
    7. <IfModule mod_fcgid.c>
    8.     AddHandler fcgid-script. .php .fcgi   ### 暂时只配置支持.php
    9.     IdleTimeout 300
    10.     ProcessLifeTime 1800
    11.     MaxProcessCount 100
    12.     DefaultMinClassProcessCount 3
    13.     DefaultMaxClassProcessCount 8
    14.     IPCConnectTimeout 15
    15.     IPCCommTimeout 300
    16.     MaxRequestsPerProcess 100
    17. </IfModule>
    18. ### fastcgi ###

    建立虚拟主机可以这样配置:

    1. <VirtualHost *:80>
    2.  DocumentRoot /usr/local/apache/htdocs
    3.  ServerName localhost
    4.  Options +ExecCGI
    5.  AddHandler fastcgi-script .fcgi
    6.  AddType application/x-httpd-php .php
    7.  Action application/x-httpd-php /fcgi-bin/php-cgi
    8.  <Directory /usr/local/apache/htdocs>
    9.  Options Indexes ExecCGI
    10.  Order allow,deny
    11.  allow from all
    12.  </Directory>
    13. </VirtualHost>

    详细的fastcgi指令配置请看:http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html

    Linux下DedeCMS详细安全设置

    经常会听到使用dedecms的站长抱怨,网站又被挂马了,dedecms真的很不安全。dedecms可能存在某些漏洞这不假,但主要责任真的是dedecms吗?我们知道,一个黑客想上传木马,首先得可以找到可写的目录,当然如果被黑客获取root密码和提权,那就没办法了。上传木马之后,又必须是php程序能解析。知道了这两个条件,我们就可以根据这两方面设置权限了。所以说,网站被挂马,主要问题还在于你安全设置方面做得不够好。下面我们详细的介绍Linux下DedeCMS程序安全的设置。

    目录权限设置

    web服务器运行的用户与目录所有者用户必须不一样,比如apache运行的用户为www,那么网站目录设置的所有者就应该不能设置为www,而是设置不同于www的用户,如centos。
    我们这里假设web服务器以www用户运行,网站分配的用户为centos,dedecms网站根目录为/home/centos/web。
    不建议用户把栏目目录设置在根目录, 原因是这样进行安全设置会十分的麻烦, 在默认的情况下,安装完成后,目录设置如下:
    1、首先设置网站目录所有者为centos,用户组为www,目录设置为750,文件为640。

    1. cd /home/centos
    2. chown -R centos.www web
    3. find web -type d -exec chmod 750 {} ;
    4. find web -not -type d -exec chmod 640 {} ;

    2、data、templets、uploads、a images目录, 设置可读写,不可执行的权限;
    设置可读写权限:

    1. cd /home/centos/web
    2. chmod -R 770 templets uploads a images

    设置不可执行权限:
    apache的设置,在apache配置文件中加入如下代码(以uploads目录为例,其它设置基本相同)。

    1. <Directory /home/centos/web/uploads>
    2. php_flag engine off
    3. </Directory>
    4. <Directory ~ "^/home/centos/web/uploads">
    5.  <Files ~ ".php">
    6.  Order allow,deny
    7.  Deny from all
    8.  </Files>
    9. </Directory>

    nginx的设置如下:

    1. location ~* ^/(templets|uploads|a|images)/.*.(php|php5)$
    2. {
    3. deny all;
    4. }

    3、不需要专题的,建议删除 special 目录, 需要可以在生成HTML后,删除 special/index.php 然后把这目录设置为可读写,不可执行的权限,上面介绍了如何设置可读写和不可执行的权限,这里就不重复了。

    data目录路径更改

    另外在DedeCMS V5.7中用户也可以设定data目录到上一级非web访问目录,基本操作如下:
    1.将data目录移动到上一级目录中,这里直接剪切过去就可以了;
    2.配置include/common.inc.php中DEDEDATA文件

    define(‘DEDEDATA’, DEDEROOT.’/data’);

    可以改成类如:

    define(‘DEDEDATA’, DEDEROOT.’/../../data’);
    3.后台设置模板缓存路径
    服务器安全

    其它需注意问题

    1、虽然对 install 目录已经进行了严格处理, 但为了安全起见,我们依然建议把它删除;
    2、不要对网站直接使用MySQL root用户的权限,给每个网站设置独立的MySQL用户帐号,许可权限为:
    SELECT, INSERT , UPDATE , DELETE,CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES
    由于DEDE并没有任何地方使用存储过程,因此务必禁用 FILE、EXECUTE 等执行存储过程或文件操作的权限。
    假设我们建立的数据库名为centosmysql,数据库用户为centosmysql,密码为123456,具体设置命令如下:

    1. mysql -uroot -p
    2. mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER,CREATE TEMPORARY TABLES ON centossql.* TO centossql@localhost IDENTIFIED BY 123456;
    3. mysql>FLUSH PRIVILEGES;
    4. mysql>exit

    3、更改默认管理目录dede,改到不易被猜到就好。
    4、关注后台更新通知,检查是否打上最新dedeCMS补丁。
    5、登录后台时使用禁止javascript的浏览器登录。

    禁止指定目录执行php文件

    我们设置网站权限的时候,有些目录不得不设置让http服务器有写入权限,这样安全隐患就来了。比如discuz x2的 data目录,这个必须要有写入限,论坛才能正常运行,但有的黑客可能就会利用这个目录上传php文件(你会说附件上传已经限制这种格式的文件,但谁知道黑客会利用什么手段上传呢,只有他们清楚了),进而到配置文件读取到mysql的连接信息,那么你的数据库就是他的了。下面介绍apache和nginx下禁止指定目录执行php文件。

    apache的配置

    1. <Directory /home/centos/web/data>
    2. php_flag engine off
    3. </Directory>
    4. <Directory ~ "^/home/centos/web/data">
    5.  <Files ~ ".php">
    6.  Order allow,deny
    7.  Deny from all
    8.  </Files>
    9. </Directory>

    nginx的配置

    1. location /data/ {
    2. location ~ .*.(php)?$ {
    3. deny all;
    4. }
    5. }
    6. location ~* ^/(attachments|upload)/.*.(php|php5)$
    7. {
    8. deny all;
    9. }

    参考:http://who0168.blog.51cto.com/253401/577309

    网站目录文件权限的简单安全设置

    网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定。
    我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web。
    1、我们首先设定网站目录和文件的所有者和所有组为centos,www,如下命令:

    1. chown -R centos:www /home/centos/web

    2、设置网站目录权限为750,750是centos用户对目录拥有读写执行的权限,这样centos用户可以在任何目录下创建文件,用户组有有读执行权限,这样才能进入目录,其它用户没有任何权限。

    1. find -type d -exec chmod 750 {} ;

    3、设置网站文件权限为640,640指只有centos用户对网站文件有更改的权限,http服务器只有读取文件的权限,无法更改文件,其它用户无任何权限。

    1. find -not -type d -exec chmod 640 {} ;

    4、针对个别目录设置可写权限。比如网站的一些缓存目录就需要给http服务有写入权限。例如discuz x2的/data/目录就必须要写入权限。

    1. find data -type d -exec chmod 770 {} ;

    logrotate无法自动轮询日志的原因

    上次介绍使用logrotate轮询nginx日志的方法。配置好之后,连续两天都没发现logrotate轮询nginx的日志,于是开始检查配置文件是否有问题,结果是配置文件一切正常。怀疑是cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。接着查看/etc/cron.daily/logrotate的内容:

    1. #!/bin/sh
    2.  
    3. /usr/sbin/logrotate /etc/logrotate.conf
    4. EXITVALUE=$?
    5. if [ $EXITVALUE != 0 ]; then
    6.     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    7. fi
    8. exit 0

    没有发现异常,系统日志等都是由这个脚本轮询的,一切运行正常,脚本应该就没问题。直接执行命令/usr/sbin/logrotate /etc/logrotate.conf系统日志是正常轮询了,但nginx日志却没反应。
    再man logrotate看下说明发现一个选项-f (–force),大概意思是:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
    那应该有可能是logroate认为nginx日志太小,不进行轮询,但我们需要轮询,加-f选项即可。即

    1. /usr/sbin/logrotate -f /etc/logrotate.conf

    不清楚logrotate轮询的条件是什么,还要强制轮询才行,搞不懂。

    解决mysql 5.5.x占用虚拟内存过高的问题

    5,5默认存储引擎是innodb,所以一起动就占用了三百多的虚拟内存,我们一般用的存储引擎是MyISAM,需要禁用innodb,设置默认的引擎为MyISAM。
    解决方法:
    在[mysqld]里面加入

    1. default-storage-engine = MyISAM
    2. innodb=OFF
    3. skip-innodb

    重启mysql即可。

    libmysqlclient.so.18: 无法打开共享对象文件: 没有那个文件或目录

    执行mysqlhotcopy的时候出现install_driver(mysql) failed: Can’t load ‘/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/DBD/mysql/mysql.so’ for module DBD::mysql: libmysqlclient.so.18: 无法打开共享对象文件: 没有那个文件或目录 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/DynaLoader.pm line 230.错误。这个错误是找不到libmysqlclient.so.18文件,于是find找了一下,发现在/usr/local/mysql/lib/libmysqlclient.so.18。

    1. 解决方法:cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/

    隐藏nginx版本号

    隐藏nginx版本号是为了防止黑客利用特定版本出现的漏洞攻击,现在介绍方法,主要修改两个地方。
    1、修改nginx.conf文件,在httpd区域中加入server_tokens off;如:

    1. http {
    2. ……省略
    3. sendfile on;
    4. tcp_nopush on;
    5. keepalive_timeout 60;
    6. tcp_nodelay on;
    7. server_tokens off;
    8. …….省略
    9. }

    2、修改/usr/local/nginx/conf/下的php-fpm配置文件。

    1. 找到:
    2. fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
    3. 改为:
    4. fastcgi_param SERVER_SOFTWARE nginx;

    最后重载nginx即可。