Posts Tagged ‘linux’

ssh -R 反向隧道

使用ssh -R 8022:localhost:22 -N username@server.com 就能在远程服务器打开一个端口8022,发送给这个端口数据将转发给本机22端口。
默认情况下远程服务器端口绑定在lo网卡上,所以只有远程服务自己可以使用8022端口。
如果需要其他机器也能访问服务器8022端口,需要这样写:ssh -R *:8022:localhost:22 -N username@server.com, 要开启这个选项需要服务器sshd config :GatewayPorts option is enabled(我自己没有成功)
我自己的使用情况:

自己家里的电脑A和公司测试服务器B 都处于内网,正常时访问不到的。
国外服务器C(server.com)
电脑A 执行 ssh -R 8022:localhost:22 -N username@server.com
电脑B 执行 ssh -R 8023:localhost:22 -N username@server.com

这样我在任何地方都能通过服务器C去访问电脑A或者电脑B

memcache 丢数据解决方案

最近开发游戏希望使用memcache 实现数据的延迟写入。比如一小时以内数据变化都存放到memcached中,无论数据读取或者写入只与memcached交互。但实际情况是,memcached的LRU淘汰算法,把内存分为很多slab, 当某个slab空间已经被使用完了,即使其他slab里面还有空间,仍然存在数据被踢的可能。一小时内,memcached内存占用不到50%,已经能检测到数据丢失。
为了保证数据的完整, memcached 在启动时候应该开启 -M 参数。该参数含义是 return error on memory exhausted (rather than removing items)。看memcached源代码可以知道,开启该参数后,当某个slab写满,新数据将无法写入。保护了原数据不丢失。程序这边如果检测到新数据,就触发把数据回写人数据库的操作,并主动释放一部分内存。
memcached 另外一个问题是,设置了永不过期的数据也会被踢掉,这个问题就得修改memcached 源代码了。
文件 items.c,找到一下代码
for (search = tails[id]; tries > 0 && search != NULL; tries–, search=search->prev) {
if (search->refcount == 0) {
   if (search->exptime == 0 || search->exptime > current_time) {
   itemstats[id].evicted++;
   itemstats[id].evicted_time = current_time – search->time;
   STATS_LOCK();
   stats.evictions++;
   STATS_UNLOCK();
   }
   [...]

转:Crontab实例

原文链接:Crontab实例
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:
1、直接用crontab命令编辑
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)
小時 (0-23)
[...]

删除.svn目录

find ./ -name “.svn” | xargs rm -Rf

djabberd 的安装

djabberd 的安装
本次安装在centos测试通过
1. 更新源代码
>svn co http://code.sixapart.com/svn/djabberd/trunk/ ~/djabberd
2 . 导出一份代码
>svn export ~/djabberd ~/tmp/djabberd
3. 安装
>cd ~/tmp/djabberd
>perl Makefile.PL
Warning: prerequisite Digest::HMAC_SHA1 0 not found.
Warning: prerequisite Log::Log4perl 0 not found.
Warning: prerequisite Net::DNS 0.48 not found.
Warning: prerequisite Net::SSLeay 0 not found.
Warning: prerequisite XML::LibXML::SAX 0 not found.
Warning: prerequisite XML::SAX 0 not found
4. 使用cpan 把缺少的perl模块补全
>perl -MCPAN -e shell
第一次执行是要进行初始化工作,在初始化最后一步选一个离您最近的CPAN镜像站点。例如我选的是位于国内的中国自由软件库ftp://freesoft.cgi.gov.cn/pub/languages/perl/CPAN
cpan> i /HMAC_SHA1/
Module Digest::HMAC_SHA1 (G/GA/GAAS/Digest-HMAC-1.01.tar.gz)
Module Net::OAuth::SignatureMethod::HMAC_SHA1 (K/KG/KGRENNAN/Net-OAuth-0.14.tar.gz)
Module OAuth::Lite::SignatureMethod::HMAC_SHA1 (L/LY/LYOKATO/OAuth-Lite-1.14.tar.gz)
3 items [...]

linux下的一些命令

列出已连接的网络连机状态
netstat -tun
列出网络连接的服务名称
netstat -tulp
如结果:
udp 1904 0 60.173.11.133:7971 202.102.192.68:53 ESTABLISHED 14465/php-cgi
php-cgi即服务名称
grep 使用正则时要用引号
如locate openssl |grep ‘/openssl$’
本地文件同步
rsync -av ./a ./b
从远程同步文件
rsync -av -e ssh root@sub.com:/tmp/a_ ~/tmp/b/
同步文件到远程
rsync -av ~/tmp/b -e ssh root@sub.com:/tmp/a_

不需要密码登录的ssh

该文章是转载文章。原文链接 http://mineral.javaeye.com/blog/134103
感谢邓威同学的帮助。
1.配置openSSH为允许PubkeyAuthentication认证
编辑sshd_config配置文件
#vim /etc/ssh/sshd_config
找到#PubkeyAuthentication yes并把注释去掉
找到#AuthorizedKeysFile ~/.ssh/authorized_keys,去掉注释
#找到useDNS yes
改为useDNS no
不改的话ssh客户端连接的时候会很慢。
这两行的意思是打开Pubkey认证方式,把pubkey放在~/.ssh/authorized_keys ,在我的机器上对应的是/root/.ssh/authorized_keys
2.生成登录用的key,就是登录时用到的公钥和私钥
#ssh-keygen -t dsa
会有提示,直接按回车就行了;
在提示输入passwdphrase的时候,你可以输入一个密码,如果使用空密码也行,直接按回车即可。
这样,会在/root/.ssh/下生成两个文件   id_dsa 和id_dsa.pub   .pub是公钥文件
3.把公钥加入到authorized_keys中,以让服务端认识你的公钥
#cd ~/.ssh
#cat id_dsa.pub >> authorized_keys
4.重启sshd服务
#/etc/init.d/sshd restart
再把id_dsa和id_dsa.pub 通过scp或者其它支持sftp的客户端ssh软件,下载到本地
5.客户端使用测试连接性
以SecureCRT这个ssh的客户端为例,我是Windows XP.
在QuickConnect的连接对话框里,认证方式里勾选 PublicKey,并且往上挪到第一个,在Properties里选择刚才下载到id_dsa私钥文件,然后”OK”,再点”Connect”,是不是登录进去了,很方便吧。再也不用你输密码了。
6.其它选项
为了安全起见,如果你的主机只有你一两个人需要登录主机,可以禁用掉其它的Passord认证方式。方法是:sshd_config配置文件里。
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes    #======》这里把注释去掉,并改成no
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes #========>把注释去掉,并改成no
另外最好把id_dsa和id_dsa.pub备份一下。服务器端生成后就删除掉,以免后患。

万恶的OpenSSL 0.9.8h

curl: (35) error:140773F2:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert unexpected message
以上错误是系统装了OpenSSL 0.9.8h,而你去访问 sslv3 的数据时产生的。
产生原因是 这个版本的不能自动检测出ssl版本,使用时必须手工指定。低版本则不需要指定。
如果使用shell脚本 需要 这样写 curl -3 -k “https://xxxx”
使用php curl 需要设置 curl_setopt($ch, CURLOPT_SSLVERSION, 3);
为这个问题花费了我2天时间。运营服务器使用最近版本软件要慎重啊。太难找问题了。

svn钩子post-commit不执行

自己配置的svn hook post-commit 已经给了可执行权限,可惜每次提交时post-commit 脚本中的 svn up 没有执行。直接运行 post-commit却没有问题。
我在 post-commit 最后加入 touch /tmp/a.txt , 发现svn 提交时 post-commit脚本运行了,而且是以root权限运行的。
费了两天时间才发现在 post-commit 脚本开头加入 export LANG=zh_CN.UTF-8 即可。原因是svn代码用有中文,而svn触发的post-commit 并没有导入中文语言。
linux系统一定要学会看系统日志,不然错在哪里都不知道。

服务器配置脚本

刚刚配置了一台服务器,顺便把所有配置流程记录下来。

nginx 一个非常不错的web服务器。配置脚本点击这里下载
php一种快速开发动态网页的脚本程序,这里是使用fast_cgi协议启动的。 配置脚本点击这里下载
mysql 一个很不错的sql服务器。配置脚本点击这里下载
memcached 内存缓存,大访问量网站必不可少的利器。配置脚本点击这里下载
php的memcached 模块。 置脚本点击这里下载
svn 服务器。 置脚本点击这里下载