Debian/Ubuntu修改ulimit

使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
3.在/etc/security/limits.conf最后增加如下两行记录

* soft nofile 65535
* hard nofile 65535

RedHat系的使用第一种和第三种,修改完成后reboot,就会发现已经是65535了,至于Debian/Ubuntu,总是出问题,以下是针对deb系的Linux发行版修改方法:
第一步:配置/etc/security/limits.conf

sudo vim /etc/security/limits.conf
在文件尾部追加 
* hard nofile 40960
* soft nofile 40960

4096可以自己设置,四列参数的设置见英文,简单讲一下:
第一列,可以是用户,也可以是组,要用@group这样的语法,也可以是通配符如*%
第二列,两个值:hard,硬限制,soft,软件限制,一般来说soft要比hard小,hard是底线,决对不能超过,超过soft报警,直到hard数
第三列,打开文件数是nofile
第四列,数量,这个也不能设置太大

第二步:/etc/pam.d/su(官方)或/etc/pam.d/common-session(网络)

sudo vim /etc/pam.d/su
将session    required   pam_limits.so这一行注释去掉 

重启系统

sudo vim /etc/pam.d/common-session
加上以下一行
session required pam_limits.so

打开/etc/pam.d/su,发现是包含/etc/pam.d/common-session这个文件的,所以修改哪个文件都应该是可以的
这个觉得修改su这个文件比较好,取消注释就OK了,不容易出错,vim打开,定位,x一下即可
官方只到第二步,就重启系统了,没有第三步,好象不行,感觉是不是全是第三步的作用?!

2015年03月01日更新:
_
在这个网址里描述了同样的问题和解决办法:http://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user

At first I missed the wildcard on the end of /etc/pam.d/common-session* and just edited common-session, and even after a reboot it didn't work. But after adding the same line (for pam_limits.so) to common-session-noninteractive, ulimit -n displayed the new value after a fresh login (no reboot required). FWIW I was trying to change the limit for root (only).
_

第三步:配置/etc/profile
最后一行加上

ulimit -SHn 40960

重启,ulimit -n 验证,显示40960就没问题了

Debian SSH登录慢的解决办法

  偶然发现通过SSH登录无外网连接的Debian的时候,提示输入密码前会有一个延时。Google了一下,通常的答案是关闭GSSAPI认证。打开/etc/ssh/ssh_config

  修改其中的:

  GSSAPIAuthentication no

  但是为什么会这样哪?想到在有外网连接时正常,怀疑是DNS解析造成的影响,通过抓包验证了这个推断。原来在登录时,SSH服务端会对客户端的IP做反向解析,此时连接不到DNS就出现了延时。那么解决办法来了,打开/etc/ssh/sshd_config

  修改其中的(如果没有就新增一行):

  UseDNS no

  可参考 man 5 sshd_config,这个问题也提示我们,如果设置了DNS,但DNS不可用,也会带来的一些副作用的。

Win7 Win8 BIOS切换SATA模式为AHCI 蓝屏 解决方法

重新安装Windows 7或者Windows 8(Windows 8.1)后发现SATA模式选择的是IDE或者Compatible,因为改为AHCI模式可以显著提升运行速度,所以就在BIOS中直接修改了,重启时发现启动到一半就直接蓝屏,多次重启问题依旧,最后查到是因为没有安装AHCI的驱动所致,解决方法如下:

对于Windows 7,先在BIOS中将SATA模式改回IDE或者Compatible,启动系统,WIN+R打开运行,输入regedit,找到HKEY_LOCAL_MACHINESystemCurrentControlSetServicesMsahci下的 start,把数值数据改为0,然后重新启动,进入BIOS将SATA模式改为AHCI,再次重启系统,这时系统会发现新硬件并自动安装AHCI驱动,至此问题完美解决。

对于Windows 8和Windows 8.1,先在BIOS中将SATA模式改回IDE或者Compatible,启动系统,WIN+R打开运行,输入regedit,找到HKEY_LOCAL_MACHINESystemCurrentControlSetServicesstorahci,将其展开,删除StartOverride,再找到HKEY_LOCAL_MACHINESystemCurrentControlSetServicesiaStorV,将其展开,删除StartOverride,然后重新启动,进入BIOS将SATA模式改为AHCI,再次重启系统,这时系统会发现新硬件并自动安装AHCI驱动,至此问题完美解决。

Python通过证书调用基于SSL的Webservice

首先,普及一下各种类型的证书知识,以及格式之间的转换方法:http://liuleijsjx.iteye.com/blog/433853
然后就是调用代码了:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tan9le'
 
import urllib2 as u2
from suds.client import Client
from suds.transport.http import HttpTransport, Reply, TransportError
import httplib
 
 
class HTTPSClientAuthHandler(u2.HTTPSHandler):
    def __init__(self, key, cert):
        u2.HTTPSHandler.__init__(self)
        self.key = key
        self.cert = cert
 
    def https_open(self, req):
        #Rather than pass in a reference to a connection class, we pass in
        # a reference to a function which, for all intents and purposes,
        # will behave as a constructor
        return self.do_open(self.getConnection, req)
 
    def getConnection(self, host, timeout=300):
        return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)
 
 
class HTTPSClientCertTransport(HttpTransport):
    def __init__(self, key, cert, *args, **kwargs):
        HttpTransport.__init__(self, *args, **kwargs)
        self.key = key
        self.cert = cert
 
    def u2open(self, u2request):
        tm = self.options.timeout
        url = u2.build_opener(HTTPSClientAuthHandler(self.key, self.cert))
        if self.u2ver() < 2.6:
            socket.setdefaulttimeout(tm)
            return url.open(u2request)
        else:
            return url.open(u2request, timeout=tm)
 
# These lines enable debug logging; remove them once everything works.
def getClient(url, key, cert):
    import logging
    logging.basicConfig(level=logging.INFO)
    logging.getLogger('suds.client').setLevel(logging.DEBUG)
    logging.getLogger('suds.transport').setLevel(logging.DEBUG)
    c = Client(url,transport = HTTPSClientCertTransport(key, cert))
    return c
 
def websevicewithcer(url):
    #key文件是从pfx导出的,命令是:openssl pkcs12 -in xxx.pfx -nocerts -nodes -out private.key
    key = 'D:/Work/cer/private.key' #这里换成你调用端的私钥文件
    #cer是IE导出的,记得要用Base64编码格式的
    cert = 'D:/Work/cer/public.cer' #这里换成你要调用的网址的客户端证书文件
    client = getClient(url, key, cert)
    result = client.service
    return result
 
def 自定义方法(param):
    wsdl_url = 'https://ip:port/xxx/services/portname?wsdl'
    websev = websevicewithcer(wsdl_url)
    #调用方式websev.方法名(参数)
    ws = websev.方法名(param)
    return ws
 
if __name__ == '__main__':
    result = 自定义方法('参数')
    print result

领取51CTO下载豆的Python脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tan9le'
import urllib2
import cookielib
import urllib
import random
import re
 
def freedown(username,passwd):
    header = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1'),('Referer','http://home.51cto.com/index.php?s=/Index/index/reback/http%253A%252F%252Fdown.51cto.com')]
    cj = cookielib.LWPCookieJar()
    cookie_suppot = urllib2.HTTPCookieProcessor(cj)
    opener = urllib2.build_opener(cookie_suppot,urllib2.HTTPHandler)
    opener.addheaders = header
    urllib2.install_opener(opener)
    postdata = {
        'email': username,
        'passwd': passwd,
        'reback':'http%3A%2F%2Fdown.51cto.com',
    }
    request = urllib2.Request("http://home.51cto.com/index.php?s=/Index/doLogin",urllib.urlencode(postdata))
    conn = opener.open(request)
    partner = re.compile(r'src="(.+?)"')
    match = partner.findall(conn.read())
    for item in match:
        #print item
        opener.open(item)
    url = 'http://down.51cto.com/download.php'
    data = {'do':'getfreecredits','t':random.random()}
    req = urllib2.Request(url,data)
    r = opener.open(req,urllib.urlencode(data))
    print r.read()
 
if __name__ == "__main__":
    freedown('用户名','密码')