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
作者:Specs
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的优点:
安装apache
- wget http://apache.ziply.com//httpd/httpd-2.2.21.tar.gz
- tar xzf httpd-2.2.21.tar.gz
- cd httpd-2.2.21
- ./configure –prefix=/usr/local/apache
- make && make install
安装fastcgi
- wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
- tar xzf mod_fastcgi-2.4.6.tar.gz
- cd mod_fastcgi-2.4.6
- cp Makefile.AP2 Makefile
- make top_dir=/usr/local/apache
- make top_dir=/usr/local/apache install
完成之后编辑httpd.conf配置文件,加入fastcgi模块装载代码:
- LoadModule fastcgi_module modules/mod_fastcgi.so
安装php5.2
- wget http://us2.php.net/get/php-5.2.17.tar.gz/from/am.php.net/mirror
- tar xzf php-5.2.17.tar.gz
- cd php-5.2.17
- ./configure –prefix=/usr/local/php –enable-fastcgi –disable-cli
- make && make install
配置apache支持php
编辑httpd.conf文件,加入如下代码:
- ### fastcgi ###
- ScriptAlias /fcgi-bin/ "/usr/local/php/bin/"
- AddHandler php-fastcgi .php
- Action php-fastcgi /fcgi-bin/php-cgi
- AddType application/x-httpd-php .php
- <IfModule mod_fcgid.c>
- AddHandler fcgid-script. .php .fcgi ### 暂时只配置支持.php
- IdleTimeout 300
- ProcessLifeTime 1800
- MaxProcessCount 100
- DefaultMinClassProcessCount 3
- DefaultMaxClassProcessCount 8
- IPCConnectTimeout 15
- IPCCommTimeout 300
- MaxRequestsPerProcess 100
- </IfModule>
- ### fastcgi ###
建立虚拟主机可以这样配置:
- <VirtualHost *:80>
- DocumentRoot /usr/local/apache/htdocs
- ServerName localhost
- Options +ExecCGI
- AddHandler fastcgi-script .fcgi
- AddType application/x-httpd-php .php
- Action application/x-httpd-php /fcgi-bin/php-cgi
- <Directory /usr/local/apache/htdocs>
- Options Indexes ExecCGI
- Order allow,deny
- allow from all
- </Directory>
- </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。
- cd /home/centos
- chown -R centos.www web
- find web -type d -exec chmod 750 {} ;
- find web -not -type d -exec chmod 640 {} ;
2、data、templets、uploads、a images目录, 设置可读写,不可执行的权限;
设置可读写权限:
- cd /home/centos/web
- chmod -R 770 templets uploads a images
设置不可执行权限:
apache的设置,在apache配置文件中加入如下代码(以uploads目录为例,其它设置基本相同)。
- <Directory /home/centos/web/uploads>
- php_flag engine off
- </Directory>
- <Directory ~ "^/home/centos/web/uploads">
- <Files ~ ".php">
- Order allow,deny
- Deny from all
- </Files>
- </Directory>
nginx的设置如下:
- location ~* ^/(templets|uploads|a|images)/.*.(php|php5)$
- {
- deny all;
- }
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,具体设置命令如下:
- mysql -uroot -p
- mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER,CREATE TEMPORARY TABLES ON centossql.* TO centossql@localhost IDENTIFIED BY 123456;
- mysql>FLUSH PRIVILEGES;
- mysql>exit
3、更改默认管理目录dede,改到不易被猜到就好。
4、关注后台更新通知,检查是否打上最新dedeCMS补丁。
5、登录后台时使用禁止javascript的浏览器登录。
禁止指定目录执行php文件
我们设置网站权限的时候,有些目录不得不设置让http服务器有写入权限,这样安全隐患就来了。比如discuz x2的 data目录,这个必须要有写入限,论坛才能正常运行,但有的黑客可能就会利用这个目录上传php文件(你会说附件上传已经限制这种格式的文件,但谁知道黑客会利用什么手段上传呢,只有他们清楚了),进而到配置文件读取到mysql的连接信息,那么你的数据库就是他的了。下面介绍apache和nginx下禁止指定目录执行php文件。
apache的配置
- <Directory /home/centos/web/data>
- php_flag engine off
- </Directory>
- <Directory ~ "^/home/centos/web/data">
- <Files ~ ".php">
- Order allow,deny
- Deny from all
- </Files>
- </Directory>
nginx的配置
- location /data/ {
- location ~ .*.(php)?$ {
- deny all;
- }
- }
- 或
- location ~* ^/(attachments|upload)/.*.(php|php5)$
- {
- deny all;
- }
网站目录文件权限的简单安全设置
网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定。
我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web。
1、我们首先设定网站目录和文件的所有者和所有组为centos,www,如下命令:
- chown -R centos:www /home/centos/web
2、设置网站目录权限为750,750是centos用户对目录拥有读写执行的权限,这样centos用户可以在任何目录下创建文件,用户组有有读执行权限,这样才能进入目录,其它用户没有任何权限。
- find -type d -exec chmod 750 {} ;
3、设置网站文件权限为640,640指只有centos用户对网站文件有更改的权限,http服务器只有读取文件的权限,无法更改文件,其它用户无任何权限。
- find -not -type d -exec chmod 640 {} ;
4、针对个别目录设置可写权限。比如网站的一些缓存目录就需要给http服务有写入权限。例如discuz x2的/data/目录就必须要写入权限。
- 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的内容:
- #!/bin/sh
- /usr/sbin/logrotate /etc/logrotate.conf
- EXITVALUE=$?
- if [ $EXITVALUE != 0 ]; then
- /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
- fi
- exit 0
没有发现异常,系统日志等都是由这个脚本轮询的,一切运行正常,脚本应该就没问题。直接执行命令/usr/sbin/logrotate /etc/logrotate.conf系统日志是正常轮询了,但nginx日志却没反应。
再man logrotate看下说明发现一个选项-f (–force),大概意思是:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
那应该有可能是logroate认为nginx日志太小,不进行轮询,但我们需要轮询,加-f选项即可。即
- /usr/sbin/logrotate -f /etc/logrotate.conf
不清楚logrotate轮询的条件是什么,还要强制轮询才行,搞不懂。
解决mysql 5.5.x占用虚拟内存过高的问题
5,5默认存储引擎是innodb,所以一起动就占用了三百多的虚拟内存,我们一般用的存储引擎是MyISAM,需要禁用innodb,设置默认的引擎为MyISAM。
解决方法:
在[mysqld]里面加入
- default-storage-engine = MyISAM
- innodb=OFF
- 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。
- 解决方法:cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/
隐藏nginx版本号
隐藏nginx版本号是为了防止黑客利用特定版本出现的漏洞攻击,现在介绍方法,主要修改两个地方。
1、修改nginx.conf文件,在httpd区域中加入server_tokens off;如:
- http {
- ……省略
- sendfile on;
- tcp_nopush on;
- keepalive_timeout 60;
- tcp_nodelay on;
- server_tokens off;
- …….省略
- }
2、修改/usr/local/nginx/conf/下的php-fpm配置文件。
- 找到:
- fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
- 改为:
- fastcgi_param SERVER_SOFTWARE nginx;
最后重载nginx即可。