• EarthLiveSharp中cloudinary的CDN图片缓存自动清理

    最近总是对地球宇宙着迷。

    恰巧发现有个叫“EarthLiveSharp”,可用将日本向日葵8号卫星的地球实时图片设为屏保。向日葵8号卫星的地球实时图片官网为:http://himawari8.nict.go.jp/,EarthLiveSharp的项目地址是:https://github.com/bitdust/EarthLiveSharp。

    为了减轻向日葵8号的服务器负担,同时也是提高地球实时图片的获取成功率,需要使用cloudinary来做CDN。注册配置都在软件里有说明。

    目前EarthLiveSharp暂时没有清理cloudinary的CDN图片缓存的功能,于是我用python写了一个,并尝试用gist管理,地址为:https://gist.github.com/creke/c5a8a18fa41b8f5c1a0719a7e0cf4de6

    同时,为了大家方便,顺便编译成了Windows可执行文件,下载: https://pan.baidu.com/s/1c27fXEo 提取码:k33n

    为了自己检索方便,顺便在这里附上python脚本源码,可以作为python如何使用RESTful接口的例子,相关工具类函数也便于参考。

    EarthLiveCleanCloudinary.py

    # -*- coding: utf-8 -*-
    # Author: Creke
    # HomePage: http://blog.creke.net

    import sys
    import urllib, urllib2
    import base64
    import json

    URLLIB_DEBUG_LEVEL = 1
    URLLIB_TIMEOUT = 5

    def Dict2Uri(dic):
    return urllib.urlencode(dic)

    def GenUrllibReq(url, method, api_key, api_secret, post_data=None):
    urlreq = None
    if post_data is None:
    urlreq = urllib2.Request(url)
    else:
    urlreq = urllib2.Request(url, post_data)
    urlreq.get_method = lambda: method
    auth_str = base64.b64encode('%s:%s' % (api_key, api_secret))
    urlreq.add_header("Authorization", "Basic %s" % auth_str)
    urlreq.add_header('Cache-Control', 'no-cache')
    return urlreq

    def GetApiDelUrl(cloud_name, img_type):
    url = "https://api.cloudinary.com/v1_1/%s/resources/image/%s" % (cloud_name, img_type)
    params = {"prefix": "http://himawari8-dl"}
    url = url + "?" + Dict2Uri(params)
    return url

    def main(argv):
    arg_idx = 1
    api_key = argv[arg_idx]
    arg_idx += 1
    api_secret = argv[arg_idx]
    arg_idx += 1
    cloud_name = argv[arg_idx]

    while True:
    del_url = GetApiDelUrl(cloud_name, 'fetch')
    urlreq = GenUrllibReq(del_url, 'DELETE', api_key, api_secret)

    print "==========================="
    print "Requesting %s" % (del_url)
    opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel=URLLIB_DEBUG_LEVEL))
    urllib_open = opener.open(urlreq, timeout=URLLIB_TIMEOUT)
    response = urllib_open.read()
    print "==========================="
    print "Response:"
    print "%s" % (response)
    print "==========================="
    urllib_open.close()
    print "Done Requesting"

    res_json = json.loads(response)
    deleted_cnt = len(res_json['deleted'])
    print "Deleted %u himawari8 pics" % (deleted_cnt)
    print "==========================="
    if 'next_cursor' in res_json and deleted_cnt>0:
    print "Due to Cloudinary limits, we're starting a new round"
    else:
    break

    return 0

    def PrintHelp(argv):
    print "\t USAGE: %s [api_key] [api_secret] [cloud_name]" % (argv[0])

    if __name__ == '__main__':
    if len(sys.argv) < 4:
    PrintHelp(sys.argv)
    exit(1)
    print "RUNNING main"
    main(sys.argv)
    print "DONE main"

    EarthLiveCleanCloudinary2exe.py

    # -*- coding: utf-8 -*-
    # Author: Creke
    # HomePage: http://blog.creke.net

    from distutils.core import setup
    import py2exe

    setup(console=['EarthLiveCleanCloudinary.py'])

     

    2016.09.12 / 暂无评论 / 974 次点击 / 分类: 所谓技术

  • WordPress取消英文标点符号自动替换中文标点符号的优雅方法

    众所周知,WordPress中文版有个特性,会将每一处英文引号("")都稀里哗啦转化为中文引号(“”)。不仅仅是英文引号,在WordPress翻译文件定义了不少自动转换符号,具体可以参考这里

    对文字博客来说,这是个好功能,这样会避免用错英文标点。

    然而,WordPress是独立的php程序,中文社区中懂得使用者,大部分都是技术博客。而技术博客会经常贴出代码,里面包含各种英文标点是再正常不过的事情。这时候,英文标点符号自动转换就是一个恼人的画蛇添足功能了。

    网上很多文章都是让该WordPress核心文件。只不过,WordPress是一个高度模块化的系统,肯定有更优雅的解决方案。

    一番搜寻之后,发现最简单的办法,就是安装一个叫Quotmarks Replacer的插件,地址在这里

    插件很简单,就是将WordPress自动转换标点符号的函数用系统接口去掉。核心代码如下:

    <?php
    /*
    Plugin Name: Quotmarks Replacer
    Plugin URI: http://sparanoid.com/work/quotmarks-replacer/
    Description: Quotmarks Replacer disables wptexturize function that keeps all quotation marks and suspension points in half-width form.
    Version: 2.6.17
    Author: Tunghsiao Liu
    Author URI: http://sparanoid.com/
    Author Email: t@sparanoid.com
    License: GPLv2 or later

    Copyright 2016 Tunghsiao Liu, aka. Sparanoid (t@sparanoid.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */

    $qmr_work_tags = array(
    'the_title',             // http://codex.wordpress.org/Function_Reference/the_title
    'the_content',           // http://codex.wordpress.org/Function_Reference/the_content
    'the_excerpt',           // http://codex.wordpress.org/Function_Reference/the_excerpt
    // 'list_cats',          Deprecated. http://codex.wordpress.org/Function_Reference/list_cats
    'single_post_title',     // http://codex.wordpress.org/Function_Reference/single_post_title
    'comment_author',        // http://codex.wordpress.org/Function_Reference/comment_author
    'comment_text',          // http://codex.wordpress.org/Function_Reference/comment_text
    // 'link_name',          Deprecated.
    // 'link_notes',         Deprecated.
    'link_description',      // Deprecated, but still widely used.
    'bloginfo',              // http://codex.wordpress.org/Function_Reference/bloginfo
    'wp_title',              // http://codex.wordpress.org/Function_Reference/wp_title
    'term_description',      // http://codex.wordpress.org/Function_Reference/term_description
    'category_description',  // http://codex.wordpress.org/Function_Reference/category_description
    'widget_title',          // Used by all widgets in themes
    'widget_text'            // Used by all widgets in themes
    );

    foreach ( $qmr_work_tags as $qmr_work_tag ) {
    remove_filter ($qmr_work_tag, 'wptexturize');
    }

     

    2016.09.01 / 2 条评论 / 1,065 次点击 / 分类: 所谓技术

  • 安装aria2及使用yaaw配置WebGUI界面

    现在一般的linux发行版的gcc都不太新,而aria2 1.18之后需要gcc 4.8,所以只能装之前的版本咯。反正下载功能没有区别,都支持http、ftp、bt、magnet磁力链接等协议。

    wget http://jaist.dl.sourceforge.net/project/aria2/stable/aria2-1.17.1/aria2-1.17.1.tar.gz
    tar zxf aria2-1.17.1.tar.gz
    cd aria2-1.17.1
    ./configure --prefix=/usr/local/blog.creke.net/aria2 --enable-static=true --enable-shared=true --enable-libaria2 --with-tcmalloc --with-sqlite3=/usr/local
    #注:configure输出最主要看Xml-RPC是yes就行
    make
    make install

    然后摸一下session文件:

    touch /home/blog.creke.net/work/aria2/aria2.session

    配置(/home/blog.creke.net/work/aria2/aria2.conf):

    #Basic
    dir=/home/blog.creke.net/work/aria2/download
    continue=true

    #HTTP
    user-agent=Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0

    #BT
    enable-dht=true
    seed-time=0
    dht-listen-port=6882
    dht-entry-point=loki.uplinklabs.net:33445

    #network
    max-overall-download-limit=5M
    max-overall-upload-limit=1M
    max-upload-limit=512K

    #RPC
    enable-rpc=true
    #rpc-listen-all=true
    rpc-allow-origin-all=true
    rpc-listen-port=35002
    #rpc-user=none
    #rpc-passwd=none

    #Advanced

    配置nginx代理aria2的jsonrpc:

    location /aria2/jsonrpc {
    proxy_pass http://localhost:35002/jsonrpc;
    proxy_redirect off;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    安装web gui:

    wget https://github.com/binux/yaaw/archive/master.zip
    mv master yaaw.zip
    unzip yaaw.zip
    mv yaaw-master/ yaaw/

    值得一提的是,yaaw不支持用户名密码,所以用nginx进行反向代理。修改
    打开yaaw的js目录中aria2.js和yaaw.js,搜寻端口号,改成自己定义的端口号和路径。

    附:init.d适用的自动启动脚本如下:

    #! /bin/sh
    # chkconfig: 2345 55 25
    # Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
    # run 'update-rc.d -f nginx defaults', or use the appropriate command on your
    # distro. For CentOS/Redhat run: 'chkconfig --add aria2'

    ### BEGIN INIT INFO
    # Provides:          aria2c
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts aria2c
    # Description:       starts aria2c as a service
    ### END INIT INFO

    # Author:   Creke
    # website:  http://blog.creke.net/

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DESC="aria2c daemon"
    NAME=aria2c
    DAEMON=/usr/local/blog.creke.net/aria2/bin/$NAME
    CONFPATH=/home/blog.creke.net/work/aria2/aria2.conf
    SESSION=/home/blog.creke.net/work/aria2/aria2.session
    #PIDFILE=/usr/local/haproxy/etc/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    USER="blog.creke.net"

    set -e
    [ -x "$DAEMON" ] || exit 0

    do_start() {
    su - $USER -c "$DAEMON --conf-path=$CONFPATH -D --input-file=$SESSION --save-session=$SESSION" || echo -n "aria2c already running"
    }

    do_stop() {
    killall -INT $NAME || echo -n "aria2c not running"
    }

    do_reload() {
    kill -HUP $NAME || echo -n "aria2c can't reload"
    }

    case "$1" in
    start)
    echo -n "Starting $DESC: $NAME"
    do_start
    echo "."
    ;;
    stop)
    echo -n "Stopping $DESC: $NAME"
    do_stop
    echo "."
    ;;
    reload|graceful)
    echo -n "Reloading $DESC configuration..."
    do_reload
    echo "."
    ;;
    restart)
    echo -n "Restarting $DESC: $NAME"
    do_stop
    do_start
    echo "."
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
    exit 3
    ;;
    esac

    exit 0

     

    2016.08.30 / 暂无评论 / 806 次点击 / 分类: 所谓技术

  • Zabbix安装简记

    安装zabbix:

    wget http://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.6/zabbix-2.2.6.tar.gz
    tar zxf zabbix-2.2.6.tar.gz
    cd zabbix-2.2.6
    ./configure --prefix=/usr/local/zabbix --enable-server --with-mysql=/usr/local/mysql/bin/mysql_config --with-libcurl --enable-proxy --enable-agent
    make
    make install

    配置zabbix:

    编辑/usr/local/zabbix/conf/zabbix_server.conf。按照自己的需求对照编辑即可。

    配置开机自动启动服务:

    cd zabbix-2.2.6/misc/init.d/fedora
    cp core5/zabbix_server /etc/init.d/

    编辑/etc/init.d/zabbix_server其中的ZABBIX_BIN的值为"/usr/local/zabbix/sbin/zabbix_server"

    增加用户组及用户:

    groupadd -g 601 zabbix
    useradd -u 601 -s /sbin/nologin -d /dev/null -M -g zabbix zabbix

    导入初始数据库:

    cd zabbix-2.2.6/database/mysql
    mysql -ucreke -p
    > use creke_zabbix;
    > source schema.sql;
    > source images.sql;
    > source data.sql;
    > quit;

    复制php前端:

    cp -r zabbix-2.2.6/frontends/php /home/wwwroot/default/zabbix
    cd /home/wwwroot/default/zabbix
    cp conf/zabbix.conf.php.example conf/zabbix.conf.php
    编辑conf/zabbix.conf.php的数据库配置

    默认帐号:admin,密码:zabbix

    Zabbix简要安装说明,也只是装着玩玩,并没有深究。一般情况下,个人的服务器监控需求,还是使用监控宝、360网站监控之类的服务,会比自己搭建维护成本低。

     

    2016.08.29 / 暂无评论 / 678 次点击 / 分类: 所谓技术

  • WordPress垃圾评论大作战

    自从把博客搬到独立服务器之后,垃圾评论有日益增长的趋势。

    上次集中清理垃圾评论的时间,刚好是6月初的一天。到8月下旬,居然积攒了5000多条垃圾评论!

    WordPress的用户应该都深有感触,这个博客程序还是挺招惹垃圾评论的。因此WordPress自带了一个叫Akismet的插件。

    Akismet插件工作原理是,将垃圾评论通过API上报到云端(想当年,Akismet诞生时云还不叫云,叫远程服务器),然后也会把垃圾评论存到垃圾评论数据库中。

    不过像我这样几个月收几千条垃圾评论的用户来说,存起来显然不是个好办法。那么,怎么解决呢?

    不急不急,解决之前,不如先分析一下问题吧!

    垃圾评论也分三六九等的,定义如下:

    1. 机器人瞎子一样直接向WordPress的评论接口发数据包
    2. 机器人先解析页面,然后构造请求
    3. 机器人解析页面,还模拟浏览器运行脚本,然后构造请求
    4. 人工手打垃圾评论

    分析了几千条垃圾评论,我觉得,像我这种小博客,99.99%都是第一、第二种情况。第三种几乎没有。第四种的话……也太看得起本站了。

    分析之后,豁然开朗,针对第一种的情况,其实只需要在页面加一些隐含的字段就可以了。不过现在的机器人似乎比较聪明,还是会看一下评论表单的隐藏字段。那么就用脚本再加另外一个隐含字段——只有运行脚本的浏览器,才能正确解析,也才能正确发送这一个由脚本填充的隐藏字段。

    但是,这种方案也有缺点,如果用户的浏览器不支持脚本,也就无法正确发送脚本填充的隐藏字段,同样会被拦截。关键在于,这样的用户有多少呢?

    这时候,大数据(误)就派上用场了。我看了一下来访用户统计,大部分都是chrome或chrome核心,其它移动端的用户也是智能设备。也就是说,感谢科技发展,大部分用户的浏览器都是支持脚本的。那么,这个措施还是可以实施的。

    于是乎,总结上面啰啰嗦嗦的一大串文字结论如下:

    1. 使用脚本在评论表单添加隐藏字段,发表评论时验证字段。
    2. 其余漏网之鱼,交给Akismet拦截。

    参考代码如下:

    <?php

    defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

    define('DEFAULT_JQUERY_BEFORE', 'jQuery(function($) {');
    define('DEFAULT_JQUERY_AFTER', '});');

    function creke_cal_comment_val($k)
    {
    return strval(crc32('CrekeComment'.$k));
    }

    function creke_get_comment_form()
    {
    if(is_user_logged_in())
    {
    return;
    }

    $k = time(NULL);
    $v = creke_cal_comment_val($k);
    return "
    <input type='hidden' name='creke_comment_k' value='$k' />
    <input type='hidden' name='creke_comment_v' id='creke_comment_v' creke_comment_v='$v' value='$k'/>
    ";
    }

    function creke_get_comment_script($jQueryBefore=DEFAULT_JQUERY_BEFORE, $jQueryAfter=DEFAULT_JQUERY_AFTER)
    {
    if(is_user_logged_in())
    {
    return;
    }

    return "
    <script type='text/javascript'>
    $jQueryBefore
    var id='#creke_';
    id+='comment_v';
    $(id).val($(id).attr('creke_comment_v'));
    $jQueryAfter
    </script>
    ";
    }

    function creke_comment_form()
    {
    echo creke_get_comment_form();
    echo creke_get_comment_script();
    }

    add_action('comment_form', 'creke_comment_form');

    function creke_comment_check($commentdata)
    {
    $dieMsg = 'do not spam';
    $dieTitle = 'title';
    $isSpam = FALSE;

    $type = comment_type('comment', 'trackback', 'pingback');

    if(is_user_logged_in() || $type == 'pingback' || $type == 'trackback')
    {
    return $commentdata;
    }

    $k = $_POST['creke_comment_k'];
    $v = $_POST['creke_comment_v'];
    if((time(NULL) - $k) > 86400)
    {
    $isSpam = true;
    }
    if(!$isSpam)
    {
    $isSpam = (creke_cal_comment_val($k) != $v);
    }

    if($isSpam)
    {
    wp_die($dieMsg, $dieTitle);
    }

    return $commentdata;
    }

    if(!is_admin()) {
    add_filter('preprocess_comment', 'creke_comment_check', 1);
    }

    ?>

    2016.08.26 / 4 条评论 / 1,140 次点击 / 分类: 所谓技术

  • 博客装修之升级wordpress:从2.8.6到4.5.3

    博客很久没有更新了,不管是程序还是文章。博客程序用的是wordpress 2.8.6,那是2009年11月12日发布的,转眼间近7年了,想想还真是一段很长的时间啊。

    最近垃圾评论陡然增多,反垃圾插件太旧了跟不上时代,于是盘算着把长草的博客里里外外装修一番。

    就从博客程序先开始吧。

    参考文档:https://codex.wordpress.org/Upgrading_WordPress_-_Extended_Instructions,里面详细描述了如何升级wordpress,总的来说有以下几个要点:

    1. 备份数据库
    2. 备份当前所有wordpress文件,特别提醒别忘了.htaccess文件
    3. 验证上面两步的备份是可用的
    4. 停用所有插件
    5. 确保前面4步没问题
    6. 下载解压缩新版wordpress
    7. 从备份中拷出下列目录/文件,覆盖新版:wp-config.php、wp-content目录(除了wp-content/cache和wp-content/plugins/widgets目录)、wp-images(如果有的话)、wp-includes/languages/、.htaccess、robots.txt
      上传上面准备好的新文件
    8. 访问wordpress更新程序:你的博客/wp-admin/upgrade.php
    9. 检查.htaccess是否需要更新,一般不需要
    10. 更新插件到新版本
    11. 重新启用插件
    12. 更新wp-config.php的安全秘钥,就是AUTH_KEY那堆配置啦
    13. 再确认wordpress变更是否正常

    里面还有一章,叫“Upgrading Across Multiple Versions”即“跨版本升级”一节,其中提到:

    • wordpress向后兼容
    • 如果要跨好多版本升级,那么建议间隔一个版本来慢慢升级,例如:从2.5开始升级到4.5,那么先升级到2.7,再升级到2.9,再升级到3.1……以此类推
    • wordpress3.7之后有个一键升级(话说之前不是有吗?),支持从3.7直达4.5.3;不过,为了稳妥起见,我还是按照上面第2点的方法,跨版本慢慢升级

    按照wordpress的官方指引,再加上自己的小窍门,我的升级步骤如下。

    备份:

    1. 备份网站
    2. 备份数据库

    准备环境:

    1. 在本地启动Apache+PHP+MySQL环境,创建blog.creke.net的虚拟主机
    2. 更改blog.creke.net的host到127.0.0.1
    3. 恢复blog.creke.net网站和数据库到本地的虚拟主机
    4. 检查本地的环境真的真的没问题

    升级:

    1. 开始跨版本升级,每次都删除所有内容——解压新版——从备份中拷贝自定义内容——访问升级程序
    2. 看看后台是否正常,看看登入环境中前台是否正常,看看未登录环境中前台是否正常,注意用ctrl+F5刷新
      备份升级好的数据库,这个很重要,毕竟wordpress大量依赖数据库
    3. 从步骤1开始重复轮回,直到升级到最新版
    4. 升级了最后一个版本的时候,最后按照https://codex.wordpress.org/Editing_wp-config.php的文档,重新从wp-config-sample.php和旧的wp-config.php对照,编辑一个新的wp-config.php,保证设置的最新
    5. 更新必要的插件

    上线更新:

    1. 在网站上挂升级公告
    2. 查看第一步到现在有没有人留言,有的话注意增量备份留言
    3. 恢复文件和数据库
    4. 下线公告,恢复网站正常访问
    5. 稳定运行一段时间后,使用插件清理文章的草稿等数据

    于是乎,博客程序终于升级到了wordpress新版,旧的主题还能用,归功于wordpress向后兼容的设计哲学。

    当然主题也是要装修的,下次有时间继续吧。

    2016.08.25 / 暂无评论 / 648 次点击 / 分类: 所谓技术

  • CentOS使用VNC查看X11图形界面窗口

    上篇文章《CentOS在SSH中运行GUI图形界面程序》提到了怎么在SSH中转发X11窗口,但是在实际应用过程中,特别是网络不好的时候,往往会发现SSH的X11转发速度很慢。而如果我们能在服务器中启动一个VNC服务,通过连接服务器提供的VNC来查看窗口内容,则在网络不好时仍能有比较流畅的远程窗口界面。

    我的CentOS服务器是通过SSH连接,而且没有安装图形窗口的,即Headless System。因此我决定使用x11vnc和Xvfb两个轻量级的应用来实现我的需求。其中,x11vnc是一个VNC服务程序,本身就比较轻量级,因此对于只需要运行一两个图形界面窗口程序的轻量级需求就更加贴切了。我们知道,在Linux中显示窗口,首先要创建一个display服务。而Xvfb就是一个轻量级的,不产生实际屏幕输出的虚拟display服务程序。因此整个方案的原理是,Xvfb创建display,x11vnc连上去并转换成vnc协议。

    首先,安装必要组件:

    yum install xorg-x11-xauth xterm libXi libXp libXtst libXtst-devel libXext libXext-devel

    接着安装x11vnc,脚本如下:

    wget http://softlayer-ams.dl.sourceforge.net/project/libvncserver/x11vnc/0.9.13/x11vnc-0.9.13.tar.gz

    tar zxf x11vnc-0.9.13.tar.gz

    cd tar zxf x11vnc-0.9.13

    ./configure --prefix=/usr/local/blog.creke.net/x11vnc

    make

    make install

    然后我们通过yum来安装Xvfb,脚本如下:

    yum install Xvfb

    然后通过x11vnc的一条简单的命令就可以很简单地把Xvfb也使用进来了,如下:

    /usr/local/x11vnc/bin/x11vnc -rfbport 12345 -passwd 连接密码 -create -forever

    运行起来后,用vnc客户端链接服务器12345端口,输入正确的密码就可以看到终端窗口了。而在终端中启动窗口程序,也能够在VNC中直接显示出来了。如果希望在登出SSH后窗口还能用,则可以在screen中运行上面的脚本。如果希望多个人能够同时连进VNC,可以加上“-shared”参数。具体的详细参数说明参阅x11vnc参数说明文档

    2014.02.11 / 3 条评论 / 2,722 次点击 / 分类: 所谓技术

  • CentOS在SSH中运行GUI图形界面程序

    最近需要在CentOS中运行FreeRapid,是一个图形界面的网盘下载器。

    一般情况来说,设置好JAVA_HOME、PATH等系统环境变量后,运行以下命令即可:

    java -jar frd.jar > /dev/null 2>&1 &

    但我的CentOS是无桌面环境的服务器系统,那怎么配置运行呢?步骤如下。

    首先,打开/etc/ssh/sshd_config,修改:

    X11Forwarding yes
    X11UseLocalhost yes

    然后重启sshd:

    service sshd restart

    重新登入ssh,若出现“WARNING! The remote SSH server rejected X11 forwarding request.”,则需要安装以下组件:

    yum install xorg-x11-xauth xterm

    若运行Java程序时出现“No X11 DISPLAY variable was set, but this program performed an operation which requires it.”,则:

    export DISPLAY=localhost:10.0

    localhost:10.0只是一个常用的例子,具体要根据用户本机的X11 server来设定;如果用Xmanager,在SSH的属性设置的Tunneling中forward到Xmanager了,登录SSH会自动设置好这个系统环境变量的。

    若出现“libXtst.so.6: cannot open shared object file: No such file or directory”,则安装必要组件:

    yum install libXi libXp libXtst

    还有个问题,SSH中用screen是很方便的,但是screen中运行X11图形界面程序就很麻烦了,解决方案有以下几个:

    1、用proxy-display这个小脚本,不过兼容性有点问题。https://blog.nelhage.com/2010/05/using-x-forwarding-with-screen/

    2、用xpra,号称是“X窗口环境中的screen”,相关网址是http://xpra.org

    3、不用X11转发,改用VNC进行远程图形界面传输,这是个很好的方案。还可以弥补X11 forwarding的性能卡顿问题。这个解决方案我会整理另一篇文章,参见《CentOS使用VNC查看X11图形界面窗口》:。

    2014.02.11 / 暂无评论 / 2,880 次点击 / 分类: 所谓技术

  • CentOS安装gcc 4.4并保留原有版本

    其实在CentOS中,yum库已经独立出了gcc 4.4,可以单独安装:

    yum install gcc44 gcc44-c++

    在使用gcc 4.4编译时,要进行必要环境变量设置:

    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
    export CC=gcc44
    export CXX=g++44
    export PKG_CONFIG=/usr/bin/pkg-config

    2014.02.11 / 暂无评论 / 993 次点击 / 分类: 所谓技术

  • CentOS VPS安装PPTP VPN(适用于XEN和OpenVZ)

    开始安装PPTP前,有一些基本前提需要知道,比如VPS是否支持PPP啦,是否支持MPPE啦等等。怎么知道呢?最简单的办法,就是直接咨询VPS提供商。

    安装ppp

    yum install ppp

    安装PPTPd,这个有两种办法安装,一种在RPM二进制包的安装,一种是从源码编译安装。一般而言我都会推荐自己编译源码,但是PPTPd的源码编译略坑,所以还是推荐安装RPM包。

    rpm版安装:

    前往http://poptop.sourceforge.net/yum/stable/packages/或 https://code.google.com/p/acelnmp/downloads/list,下载rpm后,执行

    rpm -ivh pptpd-1.3.4-2.rhel5.i386.rpm

    编译安装pptpd,不建议

    wget http://nchc.dl.sourceforge.net/project/poptop/pptpd/pptpd-1.3.4/pptpd-1.3.4.tar.gz

    tar zxf pptpd-1.3.4.tar.gz

    cd  pptpd-1.3.4

    rpm -ivh pptpd-1.3.4-2.rhel5.i386.rpm

    查看/usr/lib/pptpd是否存在,如果不存在,则执行:

    mkdir /usr/lib/pptpd

    ln -s /usr/local/lib/pptpd/pptpd-logwtmp.so /usr/lib/pptpd/pptpd-logwtmp.so

    配置文件/etc/pptpd.conf:

    option /etc/ppp/options.pptpd
    logwtmp
    localip 192.168.2.1
    remoteip 192.168.2.2-250

    配置文件/etc/ppp/options.pptpd:

    name pptpd

    refuse-pap
    refuse-chap
    refuse-mschap
    # Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
    # Challenge Handshake Authentication Protocol, Version 2] authentication.
    require-mschap-v2
    # Require MPPE 128-bit encryption
    # (note that MPPE requires the use of MSCHAP-V2 during authentication)
    require-mppe-128
    # }}}

    ms-dns 8.8.8.8
    ms-dns 8.8.4.4

    proxyarp

    lock

    nologfd

    设置自动启动脚本/etc/init.d/pptpd:

    #!/bin/sh
    #
    # Startup script for pptpd
    #
    # chkconfig: - 85 15
    # description: PPTP server
    # processname: pptpd
    # config: /etc/pptpd.conf

    # Source function library.
    . /etc/rc.d/init.d/functions
    # See how we were called.
    case "$1" in
    start)
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo 0 > /proc/sys/net/ipv4/tcp_syncookies

    iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
    iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT

    echo -n "Starting pptpd: "
    if [ -f /var/lock/subsys/pptpd ] ; then
    echo
    exit 1
    fi
    daemon /usr/sbin/pptpd
    echo
    touch /var/lock/subsys/pptpd
    ;;
    stop)
    iptables -t nat -D POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
    iptables -D INPUT -p udp -m udp --dport 53 -j ACCEPT

    echo -n "Shutting down pptpd: "
    killproc pptpd
    echo
    rm -f /var/lock/subsys/pptpd
    ;;
    status)
    status pptpd
    ;;
    condrestart)
    if [ -f /var/lock/subsys/pptpd ]; then
    $0 stop
    $0 start
    fi
    ;;
    reload|restart)
    $0 stop
    $0 start
    echo "Warning: a pptpd restart does not terminate existing "
    echo "connections, so new connections may be assigned the same IP "
    echo "address and cause unexpected results.  Use restart-kill to "
    echo "destroy existing connections during a restart."
    ;;
    restart-kill)
    $0 stop
    ps -ef | grep pptpd | grep -v grep | grep -v rc.d | awk '{print $2}' | uniq | xargs kill 1> /dev/null 2>&1
    $0 start
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|restart-kill|status}"
    exit 1
    esac

    exit 0

    最后让脚步开机启动:

    chmod +x /etc/init.d/pptpd

    chkconfig --level 345 pptpd on

    service pptpd start

    如果你的VPS是OpenVZ,应该把上面的“iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE”改为:

    iptables -t nat -A POSTROUTING -s  192.168.2.0/24 -j SNAT --to-source 你的VPS的IP

    同时把上面的“iptables -t nat -D POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE”改为:

    iptables -t nat -D POSTROUTING -s  192.168.2.0/24 -j SNAT --to-source 你的VPS的IP

    设置pptp的密码:

    vi /etc/ppp/chap-secrets
    格式为“用户名 pptpd 密码 *”

    常见问题:

    1:如果连接的时候,出现619错误,则运行:

    rm -r /dev/ppp
    mknod /dev/ppp c 108 0

    然后重新启动你的VPS。

    2:如果连接的时候,出现800错误,这是因为虚拟机内核不支持MPPE,这时候PPTP也没意义了,因为已经是明文的了。

    3:如果还有其他错误或上述错误一直存在,请使用

    tail /var/log/messages

    查看系统日志解决

    2013.09.09 / 1 条评论 / 1,313 次点击 / 分类: 所谓技术