Content Security Policy介绍

csp,防止xss攻击

本文介绍的是W3C的Content Security Policy,简称CSP。顾名思义,这个规范与内容安全有关,主要是用来定义页面可以加载哪些资源,减少XSS的发生。

Chrome扩展已经引入了CSP,通过manifest.json中的content_security_policy字段来定义。一些现代浏览器也支持通过响应头来定义CSP。下面我们主要介绍如何通过响应头来使用CSP,Chrome扩展中CSP的使用可以参考Chrome官方文档

浏览器兼容性

早期的Chrome是通过X-WebKit-CSP响应头来支持CSP的,而firefox和IE则支持X-Content-Security- Policy,Chrome25和Firefox23开始支持标准的的Content-Security-Policy,见下表。

响应头 Chrome Firefox Safari IE
Content-Security-Policy 25+ 23+
X-Content-Security-Policy 4.0+ 10.0(有限的)
X-Webkit-CSP 14+ 6+

完整的浏览器CSP支持情况请移步CanIUse

如何使用

要使用CSP,只需要服务端输出类似这样的响应头就行了:

Content-Security-Policy: default-src 'self'

default-src是CSP指令,多个指令之间用英文分号分割;’self’是指令值,多个指令值用英文空格分割。目前,有这些CSP指令:

指令 指令值示例 说明
default-src ‘self’ cnd.a.com 定义针对所有类型(js、image、css、web font,ajax请求,iframe,多媒体等)资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认的。
script-src ‘self’ js.a.com 定义针对JavaScript的加载策略。
style-src ‘self’ css.a.com 定义针对样式的加载策略。
img-src ‘self’ img.a.com 定义针对图片的加载策略。
connect-src ‘self’ 针对Ajax、WebSocket等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应。
font-src font.a.com 针对Web Font的加载策略。
object-src ‘self’ 针对<object>、<embed>或<applet>等标签引入的flash等插件的加载策略。
media-src media.a.com 针对<audio>或<video>等标签引入的html多媒体的加载策略。
frame-src ‘self’ 针对frame的加载策略。
sandbox allow-forms 对请求的资源启用sandbox(类似于iframe的sandbox属性)。
report-uri /report-uri 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。

特别的:如果只想让浏览器汇报日志,而不阻止任何内容。可以改用Content-Security-Policy-Report-Only响应头。

指令值可以由下面这些内容组成:

指令值 指令示例 说明
* img-src * 允许任何内容。
‘none’ img-src ‘none’ 不允许任何内容。
‘self’ img-src ‘self’ 允许来自相同来源的内容(相同的协议、域名和端口)。
data img-src data 允许data:协议(例如base64编码的图片)。
www.a.com img-src img.a.com 允许加载指定域名的资源。
*.a.com img-src *.a.com 允许加载a.com任何子域的资源。
https://img.com img-src https://img.com 允许加载img.com的https资源(协议需匹配)。
https: img-src https: 允许加载https资源。
‘unsafe-inline’ script-src ‘unsafe-inline’ 允许加载inline资源(例如常见的style属性,onclick,inline js和inline css等等)。
‘unsafe-eval’ script-src ‘unsafe-eval’ 允许加载动态js代码,例如eval()。

从上面的介绍可以看到,CSP协议可以控制的内容非常多。而且如果不特别指定’unsafe-inline’时,页面上所有inline的样式和脚 本都不会执行;不特别指定’unsafe-eval’,页面上不允许使用new Function,setTimeout,eval等方式执行动态代码。在限制了页面资源来源之后,被XSS的风险确实小不少。

当然,仅仅依靠CSP来防范XSS是远远不够的,不支持全部浏览器是它的硬伤。不过,鉴于低廉的开发成本,加上也没什么坏处。如果担心影响面太大,也可以像下面这样,仅收集不匹配规则的日志,先观察下:

Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://test/

这样,如果页面上有inline的JS,依然会执行,只是浏览器会向指定地址发送一个post请求,包含这样的信息:

{"csp-report":{"document-uri":"http://test/test.php","referrer":"","violated-directive":"script-src 'self'","original-policy":"script-src 'self'; report-uri http://test/","blocked-uri":""}}

文章来源:http://www.2cto.com/Article/201307/230739.html

mysql数据库配置文件和Can’t create/write to file(errno13)

Can’t create/write to file ‘/tmp/#sql_8e6_0.MYI’ (Errcode: 13)

在ubuntu8。04环境下用新立得安装了mysql,启动服务器没有问题,登录创建数据库,创建表也没有问题
就是有一点,我describe 表的时候出现错误:
mysql> desc pet;
ERROR 1 (HY000): Can’t create/write to file ‘/tmp/#sql_157f_0.MYI’ (Errcode: 13);

sudo /etc/init.d/mysql start启动服务器

mysql -u root -p +密码登录
我已经给root用户增设了权限
mysql> grant allprivileges on *.* to root@localhost;
对于下面我附加的我的my.cnf文件中的
tmpdir = /tmp
我已经修改了她的权限
桌面$ sudo chown root:root /tmp
桌面$ sudo chmod 1777 /tmp
但是无论如何还是不能desc +表;
还有就是我向表中添加数据,删除数据,查询数据都没有问题,真是急死人。
下面是我的附加的my.cnf文件
我的是在/etc/mysql目录下

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# – “/etc/mysql/my.cnf” to set global options,
# – “~/.my.cnf” to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.
#
# For explanations see
http://dev.mysql.com/doc/mysql/en/serve … ables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain “#” chars…
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
# If you make changes to these settings and your system uses apparmor, you may
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#

user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
#
# * Fine Tuning
#
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
#max_connections = 100
#table_cache = 64
#thread_concurrency = 10
#
# * Query Cache Configuration
#
query_cache_limit = 1M
query_cache_size = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log = /var/log/mysql/mysql.log
#
# Error logging goes to syslog. This is a Debian improvement :)
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * BerkeleyDB
#
# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.
skip-bdb
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# You might want to disable InnoDB to shrink the mysqld process by circa 100MB.
#skip-innodb
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer = 16M

#
# * NDB Cluster
#
# See /usr/share/doc/mysql-server-*/README.Debian for more information.
#
# The following configuration is read by the NDB Data Nodes (ndbd processes)
# not from the NDB Management Nodes (ndb_mgmd processes).
#
# [MYSQL_CLUSTER]
# ndb-connectstring=127.0.0.1

#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with ‘.cnf’, otherwise they’ll be ignored.
#
!includedir /etc/mysql/conf.d/

解决方法:

Try the following:
1.mkdir /var/lib/mysql/tmp
2.chmod mysql:mysql /var/lib/mysql/tmp
3.Add the following line into the[mysql]section:tmpdir = /var/lib/mysql/tmp
4.restart the server

我尝试上面建议的操作:
1.肯定没有问题,创建一个文件夹/var/lib/mysql/tmp
2.肯定有问题,压根就没有发现过这样的用法,可能这个帖子是给高手看的,反思了半天,我才知道说的是:
chown mysql:mysql /var/lib/mysql/tmp(自己查看chmod和chown的作用和用法)
3.看似没有问题,其实是有问题,他说的是Add,其实不是添加的意思,而是修改的意思
4.没有问题
经过修改中的修改我的mysql正常运行了
mysql> desc pet;
+———+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———+———-+——+—–+———+——-+
| name | char(10) | YES | | NULL | |
| address | char(20) | YES | | NULL | |
+———+———-+——+—–+———+——-+

这个问题困扰了我一个月之久,希望对遇到或者将来有可能遇到这类问题的有志之士有所帮助。
当然,系统和机子不一样可能有所不同,望因事而异!

 

文章来源:http://blog.csdn.net/samxx8/article/details/7608136

nginx 重启

nginx重启,nginx查看帮助

# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
# /usr/local/nginx/sbin/nginx -s  reload

安裝 CentOS 7 後必做的七件事

安装centos7后必做的事,ssh秘钥方式登录,禁止root登录

CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7。当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事,是你进一步配置系统和安装其他软件前必须做的。

1. 更改 root 密码

如果你是自行安装 CentOS 7 的话,安装程序会让你自行设定 root 的密码。不过很多 VPS 服务商只会提供预先安装好的 CentOS 7 映像档,这种情况下他们会透过主控界面告诉你 root 的密码,这个密码的安全性谁也不知道,它是如何产生的呢?随机性可靠吗?复杂性足够吗?服务商的服务器是否记录了密码的副本?我们实在有必要第一时间重设这个密码。

首先使用 ssh 登入服务器,在 Windows 可以使用 Putty、Tera Term、或者在 Cygwin 环境下执行 OpenSSH。在 Mac 和 Linux 上只需在终端机 (terminal) 中执行以下指令便可以了,比 Windows 简单得多:

010

由于你从来没有使用过 ssh 联系到这台服务器,你的电脑会把服务器的加密公钥下载,然后询问你是否信任它,这台新鲜安装好的 CentOS 7 应该还未引起黑客的兴趣,也不大可能在这么短的时间内被攻陷,所以可以放心接受这个加密公钥。跟着输入 root 的密码登入服务器:

020

登入后立即更改 root 的密码,你需要输入新密码两次:

030

好的密码应该同时包含数字、小写英文字母、大写英文字母、和标点符号,最少 15 个字符,这样的密码强度大概有 90 bit,勉强可以应付密码被「暴力破解」,当然我假设了你的密码是真正随机产生,有些人喜欢把个人资料例如名字、出生日期、车牌号码、地址、配偶和子女的名字等等崁入密码中,或者使用字典里的字词拼凑密码,这样密码的强度将会大幅下降,甚至不堪一击,这些问题我曾经在《如何管理密码?》讨论过。

网上有很多随机密码产生器,例如 RANDOM.ORG,大都可用,但记紧必须使用 HTTPS 造访这些网站。如果你有使用「密码夹万」一类的软件,不妨使用它们内建的密码产生器。

完成后不要登出系统,使用另一个视窗用新密码尝试登入,即使失败也可以在原来的视窗重复以上步骤。

2. 新增一个普通帐号

这一步连同下一步,相当于为一个城市筑起两道城墙,既可加强防卫,也建立了一道警报机制,当敌人(黑客)卒然来袭,第一道城墙被袭击和破坏,我们还有第二道城墙阻延一下,有时间部署防卫甚至反击。所以这是一个很多人忽略,但其实非常重要的步骤。

首先我们新增一个帐号:

040

这个新帐号 ahhang 没有预设密码,即是说登入 ahhang 时系统不用输入密码!所以我们立即要设定密码:

050

有些人认为不应该把建立帐号和设定密码两件事分开来做,一来可能会不慎遗忘,二来也给黑客一道时间缝隙登入这个新帐号,所以他们会在 adduser 指令中一并提供加密后的预设密码,方法是加入 -p 参数,不过这样做也有风险,因为黑客可以透过列出系统的进程,得知加密了的新密码,然后把密码破解。

3. 禁止 root 使用 ssh 登入

CentOS 7 预设容许任何帐号透过 ssh 登入,包括 root 和一般帐号,为了不让 root 帐号被黑客暴力入侵,我们必须禁止 root 帐号的 ssh 功能,事实上 root 也没有必要 ssh 登入服务器,因为只要使用 su 或 sudo (当然需要输入 root 的密码) 普通帐号便可以拥有 root 的权限。使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,寻找:

#PermitRootLogin yes

修改为:

PermitRootLogin no

最后输入以下指令重新启动 sshd:

systemctl restart sshd.service

这样黑客要取得 root 的权限,必须破解 root 和一个普通用户的密码,难度增加了。

完成后不要登出系统,使用另一个视窗尝试登入 root 和普通帐号,测试无误便可进行下一步。

4. 使用非常规的 ssh 端口

Ssh 预设使用端口 22,这是在 IANA 注册的官方端口,但没有人说 ssh 不能使用其他端口,很多黑客专门向服务器的 22 端口发动攻击,即使你的服务器固若金汤、牢不可破,但是要系统日以继夜接受攻击,消耗的系统资源(网络、处理器、记忆体等等)也不会少,何况它是否真的牢不可破还说不定呢!所以有必要让 ssh 使用其他端口,只让有权使用 ssh 的用户知道。

使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,寻找:

Port 22

修改为:

Port 10837

你可以把 10837 改为任何 1024 – 65535 之间的任何数字,若果怕与某些系统服务发生冲突,可以参考一下这里。

跟着重新启动 sshd:

systemctl restart sshd.service

然后是设定防火墙,CentOS 7 的内核已经有防火墙 netfilter,但你的系统未必安装了用户界面,较前版本的 CentOS 预设使用 iptables,但 CentOS 7 开始使用效能更高、稳定性更好的 firewalld,若果服务器尚未安装 firewalld,可以使用以下指令安装,不确定是否已经安装的话也可以输入这个指令,它会告诉你已经安装然后退出。

yum install firewalld

跟着启动:

systemctl start firewalld

设定 firewalld 的方法有两个,第一个是修改 firewalld 有关 sshd 的设定,把端口 22 改为 10837,这是正统的做法,但步骤比较多;第二个是要求 firewalld 开启端口 10837,不指定它属于哪一个服务,这个做法通常处理临时的端口开启/封锁,步骤简单,但是日后你要是忘记了这个端口为甚么开启了呢?什么时候开启的呢?为了哪一项服务开启呢?可能有点麻烦。我两种方法都会介绍一下,但作为专业的系统管理员(即使不是真正的专业,也应该具备这样的心态),我推荐使用第一种方法。

设定防火墙方法一:

复制 firewalld 有关 sshd 的设定档案:

cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

使用 vim (或任何文本编辑器) 开启 /etc/firewalld/services/ssh.xml,寻找:

<port protocol="tcp" port="22"/>

修改为:

<port protocol="tcp" port="10837"/>

储存后重新载入 firewalld:

firewall-cmd --reload

设定防火墙方法二:

输入以下指令:

firewall-cmd --zone=public --add-port=10837/tcp --permanent

不论使用哪种方法,完成后不要登出系统,使用另一个视窗尝试登入,例如:

ssh -p 10837 ahhang@192.168.1.188

5. 启用公钥验证登入 ssh

现在只有普通帐号才能透过 ssh 登入服务器,但是 ssh 提供一个更先进更安全的验证方法:公钥验证法。

首先每一名用户建立一对加密钥匙(密钥和公钥),密钥储存在日常使用的电脑,公钥则储存在服务器,使用 ssh 联系到服务器的时候,电脑会把一些建立连线请求的资料,其中包括帐号名称和公钥,并且把部分资料用密钥制作数码签署,一股脑儿送到服务器,服务器检查自己的「公钥库」是否包含送来的公钥,有的话再验证数码签署,成功的话便直接登入服务器,无需输入帐号密码。

第一步在日常使用的电脑上使用 ssh-keygen 指令建立一对加密钥匙,它会询问储存加密钥匙的档案名称,和把钥匙加密的密码,档案名称使用预设的路径和名称便可以,密码则无需输入:

060

这个指令会创造两个档案,一个名为 id_rsa,是你的 RSA 密钥,另一个是 id_rsa.pub,是你的 RSA 公钥。公钥必需上传到服务器并且附加于用户帐号里面的 .ssh/authorized_keys 档案中,这个档案储存所有可透过 ssh 登入到这一个帐号的公钥,一行一条公钥:

070-600x103

顺便一提,目录 .ssh 和 authorized_keys 除了 owner 之外,其他人均不能有写入的权限,否则 sshd 不会读取,换句话说,两者最宽松的权限是 755:

080-600x91

使用公钥验证法登入 ssh 又省力又安全,因为我们不用输入密码,自然也没有密码被盗取的忧虑,简简单单地输入连线指令便可以了。

但是存放在日常电脑中的密钥却带来新的安全隐患,万一密钥被盗取了,其他人岂不是可以随便登入服务器?现在是「双重验证」(two-factor authentication) 隆重登场的时候,双重验证的理念是我们必须向服务器证明两种不同性质的东西,才能成功验证身分,第一样是我们知道什么,第二样是我们拥有什么。首先服务器会要求我们输入密码,我们知道密码,过了第一关。跟着服务器要求我们证明拥有公钥验证法中的密钥,透过上面的设定程序我们也通过了验证,过了第二关。现在服务器才会让我们进入系统。

设定 ssh 的双重验证法很简单,使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,在档案的末端假如这一行:

AuthenticationMethods publickey,password

它告诉服务器用户必须拥有合法的公钥,和输入正确的密码才能成功登入。修改完成后重新启动 sshd:

systemctl restart sshd.service

完成后不要登出系统,使用另一个视窗尝试登入,测试无误便可进行下一步。

6. 更新、更新、每天更新、每天自动更新

每一天都有成千上万的黑客在世界各地寻找 Linux 系统和常见软件的安全漏洞,一有发现便会发动规模庞大而迅速的网络攻击,务求在我们来得及反应前把系统攻陷。不要以为黑客都只是十来岁的年轻小毛头,大部分黑客背后都有势力庞大、资源几乎无限的国家机构支持,有些甚至属于这些机构的雇员,美国的 NSA,英国的 GQHC,中国的无名黑客队伍,都是比较明目张胆由国家支持的网络黑帮,可见我们的系统时时刻刻都被凶狠之徒盯着,保持软件在最新的状态是其中一项我们必须做,也很容易做到的工作。

首先我们立即手动更新所有预先安装的软件:

yum -y update

跟着设定系统定时自动更新,第一步确定服务器是否安装了自动执行指令的工具,跟着使用 yum 一个名叫 yum-cron 插件。

CentOS 7 使用数个软件来自动执行指令:cron、anacron、at 和 batch,其中 cron 和 anacron 用来定期重复执行指令,At 和 batch 则用来在特定时间执行一次性的指令。我们将会使用 cron 和 anacron,两者的分别这里不细表了,将来有机会再讨论,现在使用以下指令安装 cron 和 anacron:

yum -y install cronie

下一步就是安装 yum-cron:

yum -y install yum-cron

其实你可以使用一个指令同时安装 cronie 和 yum-cron,甚至单独安装 yum-cron 也可以,因为 yum 会自动检测到 yum-cron 需要 cronie 然后自动替你安装,上面分开两个指令纯粹令大家容易明白。

完成后系统多了数个档案,比较重要的包括:

/etc/cron.daily/0yum.cron
Anacron 每天执行这个档案一次,它根据配置档案 /etc/yum/yum-cron.conf 来更新软件
/etc/yum/yum-cron.conf
这是每天执行 yum-cron 的配置档案,预设只会下载更新的软件,并不安装,用意是让管理员检视 yum-cron 的输出,选取需要更新的软件进行手动安装。

跟着我们修改配置档案,让 yum-cron 自动更新软件,使用 vim (或任何文本编辑器) 开启 /etc/yum/yum-cron.conf,寻找:

apply_updates = no

修改为:

apply_updates = yes

确认一下 update_messages = yes, download_updates = yes, apply_updates = yes,正如下图:

090

最后,启动 crond 和 yum-cron:

systemctl start crond
systemctl start yum-cron

7. 防火墙

防火墙的作用好比网络警察,它监察所有进出系统的 IP 封包,哪些端口容许封包进入,哪些端口容许封包外出等等,都由防火墙控制,保护使用这些端口的应用程式,所以设定防火墙是极重要的工作。

过滤封包功能的 netfilter 已经内建在 CentOS 7 的内核,但是配置 netfilter 的界面程式 firewalld 却未必有安装,不论是否已经安装,都可以执行下面的安装指令:

yum install firewalld

跟着查看一下防火墙现在开启了哪些服务和端口:

firewall-cmd --list-all

100
上图可见防火墙只开启了 DHCP 客户端和 ssh 两个服务的通讯端口,倘若日后安装了其他网络软件,例如网站服务器、域名服务器等等,必须要检查安装程式有否开启他们的通讯端口,没有的话便要手动开启。如果好像前面第四点那样使用了非常规的通讯端口,也可能要手动配置防火墙,防火墙详细的配置方法超出了本文的讨论范围,将来有机会再谈。

cent os 下安装配置redis

centos 上 redis的安装配置

1、下载安装

  1. wget http://redis.googlecode.com/files/redis-2.2.13.tar.gz
  2. tar -zxf redis-2.2.13.tar.gz
  3. cd redis-2.2.13
  4. make
  5. sudo make install
  6. cp redis.conf /etc

install的时候,redis的命令会被拷贝到/usr/local/bin下面
2,建立用户与日志目录
第一次启动Redis前,建议为Redis单独建立一个用户,并新建data和日志文件夹

  1. sudo useradd redis
  2. sudo mkdir -p /var/lib/redis
  3. sudo mkdir -p /var/log/redis
  4. sudo chown redis.redis /var/lib/redis #db文件放在这里,要修改redis.conf
  5. sudo chown redis.redis /var/log/redis

3,配置init脚本
其实github上很多老外写好的启动脚本,不过大部分都是ubuntu的,对于Centos,也有一份
https://gist.github.com/1335694
经过修改,如下:

  1. ###########################
  2. PATH=/usr/local/bin:/sbin:/usr/bin:/bin
  3. REDISPORT=6379
  4. EXEC=/usr/local/bin/redis-server
  5. REDIS_CLI=/usr/local/bin/redis-cli
  6. PIDFILE=/var/run/redis.pid
  7. CONF=“/etc/redis.conf”
  8. case “$1” in
  9.     start)
  10.         if [ -f $PIDFILE ]
  11.         then
  12.                 echo “$PIDFILE exists, process is already running or crashed”
  13.         else
  14.                 echo “Starting Redis server…”
  15.                 $EXEC $CONF
  16.         fi
  17.         if [ “$?”=”0” ]
  18.         then
  19.               echo “Redis is running…”
  20.         fi
  21.         ;;
  22.     stop)
  23.         if [ ! -f $PIDFILE ]
  24.         then
  25.                 echo “$PIDFILE does not exist, process is not running”
  26.         else
  27.                 PID=$(cat $PIDFILE)
  28.                 echo “Stopping …”
  29.                 $REDIS_CLI -p $REDISPORT SHUTDOWN
  30.                 while [ -x ${PIDFILE} ]
  31.                do
  32.                     echo “Waiting for Redis to shutdown …”
  33.                     sleep 1
  34.                 done
  35.                 echo “Redis stopped”
  36.         fi
  37.         ;;
  38.    restart|force-reload)
  39.         ${0} stop
  40.         ${0} start
  41.         ;;
  42.   *)
  43.     echo “Usage: /etc/init.d/redis {start|stop|restart|force-reload}” >&2
  44.         exit 1
  45. esac
  46. ##############################

把上述代码存为redis,放到/etc/init.d/下面

  1. chmod +x /etc/init.d/redis

其实做成服务启动,也是调用redis-server,如果想让它在后台作为daemon运行,那么
需要修改redis.conf,将 daemonize no 改为 daemonize yes
4,设定开机启动服务

  1. sudo chkconfig redis on

5,启动,停止redis

  1. service redis start   #或者 /etc/init.d/redis start
  2. service redis stop   #或者 /etc/init.d/redis stop

6,测试redis

  1. redis-cli
  2. redis 127.0.0.1:6379> set foo 123
  3. OK
  4. redis 127.0.0.1:6379> get foo
  5. “123”
  6. redis 127.0.0.1:6379> exit

文章来源:http://blog.csdn.net/mlks_2008/article/details/19001595

SSH实现无密码登陆

假设你是hostA上的一个用户”aliceA”,想以用户“aliceB”的身份ssh到hostB上,但又不想输入密码。那么,你可以参考这篇教程实现ssd无密码登录。

首先,你需要以用户“aliceA”的身份登录到hostA上。

然后,使用ssh-keygen生成一对rsa公私钥,生成的密钥对会存放在~/.ssh目录下。

$ ssh-keygen -t rsa

接下来,使用下面的命令在目标主机hostB上的aliceB用户目录下创建~/.ssh目录。如果在aliceB@hostB上已经存在.ssh目录,这一步会被略过。

$ ssh aliceB@hostB mkdir -p .ssh

最后,将hostA上用户“aliceA”的公钥拷贝到aliceB@hostB上,来实现无密码ssh。

$ cat .ssh/id_rsa.pub | ssh aliceB@hostB 'cat >> .ssh/authorized_keys'

自此以后,从aliceA@hostA上ssh到aliceB@hostB上再也不需要输入密码。(LCTT 译注:上述的创建目录并复制的操作也可以通过一个 ssh-copy-id 命令一步完成:ssh-copy-id -i ~/.ssh/id_rsa.pub aliceB@hostB

疑难解答

即使在密钥认证生效后,你可能仍然需要输入SSH密码。如果遇到这种情况,请检查系统日志(如/var/log/secure)以查看是否出现下面的异常。

  1. Authentication refused: bad ownership or modes for file /home/aliceB/.ssh/authorized_keys

    在这种情况下,密钥认证的失败是由于~/.ssh/authorized_keys文件的权限或拥有者不正确。一般情况,如果这个文件对除了你之外的所有用户都可读,就会出现这个错误。用下面的方式改变文件的权限以修正错误。

    $ chmod 700 ~/.ssh/authorized_keys 

via: http://xmodulo.com/how-to-enable-ssh-login-without.html

作者:Dan Nanni 译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

centos下强制修改密码

1.停止mysql服务:service mysqld stop;

2. mysqld_safe –skip-grant-tables

3. 重新打一个开个SSH连接(即重新打一个新的黑色窗口);

 4.输入以下命令:

  [ root@localhost ~]# mysql
  mysql>use mysql
  mysql>update user set password=password(“123456″) where user=”root”;
 mysql>flush privileges;
 mysql>exit

pkill -KILL -t pts/0 可将pts为0的**用户(之前运行mysqld_safe的用户窗口)强制踢出
正常启动 MySQL:service mysql start.

linux 别名命令——alias

linux的别名功能

功能说明:设置指令的别名。
语  法:alias[别名]=[指令名称]

参  数 :若不加任何参数,则列出目前所有的别名设置。
举    例 :ermao@lost-desktop:~$ alias
                alias egrep=’egrep –color=auto’
               alias fgrep=’fgrep –color=auto’
                
alias grep=’grep –color=auto’
                alias l=’ls -CF’
                alias la=’ls -A’
                alias ll=’ls -alF’
                alias ls=’ls –color=auto’

说     明:用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。 alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名。

    还有,如果你想给每一位用户都生效的别名,请把alias la=’ls -al’ 一行加在/etc/bashrc最后面,bashrc是环境变量的配置文件 /etc/bashrc和~/.bashrc 区别就在于一个是设置给全系统一个是设置给单用户使用.

    利用alias可以把很长的命令变成任意我们喜欢的简短的,
比如:alias cd=’rm -rf’     0.0! ,呵呵开个玩笑

    如果想永久生效,就把这条写入到 /etc/bashrc里面

php二维数组排序

php二维数组排序

一般用于无法通过数据库进行排序的多行数据,不废话了,直接上代码

// 二维数组
$arr = array(
‘d' => array(‘id' => 5, ‘name' => 1, ‘age' => 7),
‘b' => array(‘id' => 2,'name' => 3,'age' => 4),
‘a' => array(‘id' => 8,'name' => 10,'age' => 5),
‘c' => array(‘id' => 1,'name' => 2,'age' => 2)
);

// 排序方法
function multi_array_sort($multi_array,$sort_key,$sort=SORT_ASC){
  if(is_array($multi_array)){
    foreach ($multi_array as $row_array){
      if(is_array($row_array)){
        $key_array[] = $row_array[$sort_key];
      }else{
        return false;
      }
    }
  }else{
    return false;
  }
  array_multisort($key_array,$sort,$multi_array);
  return $multi_array;
}

// 调用
print_r(multi_array_sort($arr,'age'));exit;

// 输出
Array
(
[c] => Array
(
[id] => 1
[name] => 2
[age] => 2
)
[b] => Array
(
[id] => 2
[name] => 3
[age] => 4
)
[a] => Array
(
[id] => 8
[name] => 10
[age] => 5
)
[d] => Array
(
[id] => 5
[name] => 1
[age] => 7
)
) 

html5 语音输入功能

html5语音搜索

使用bootstrap输入框事,在本上看到输入框的后方出现了一个小小的麦克图标,我的台式机上是没有的,感觉很怪异,于是详细查看input标签的属性,发现一个陌生的属性x-webkit-speech,
删除该属性,麦克图标随机消失,感觉好神奇……
网上查了下该属性的信息,原来是html5中特有的属性,支持输入框可用语音输入,不禁感叹,又后退了,赶紧学习……
下面是用法:

1:判断是否支持语音输入功能
if(document.createElement("input").webkitSpeech === undefined) {
    alert("Speech input is not supported in your browser.");
}

2:使用方法
<input type="text" /> 

3:设置语种
<input lang="zh-CN" type="text" />

4:响应事件
<input type="text" />
function foo(){
  alert('changed');
}

暂时还没时间测试,先记录下,后面再细用^_^!