分类 "工具软件" 下的文章

如果我添加的设置是:
XX-Netstart.bat

浏览器运行后,会出现一个cmd的窗口,电脑右下角无XX-Net的图标,但是关闭浏览后,XX-Net也会关闭呢

如果我添加的设置是:XX-Netstart.vbs

浏览器运行后,显示正常,电脑右下角有XX-Net图标,但是我关闭浏览器后,XX-Net不会自动退出

请问下有什么办法可以修改XX-Net,使它随着MyChrome的运行,自动运行XX-Net,MyChrome退出,XX-Net也自动退出,需要有右下角的图标

终于在MyChrome的原作者的帮助下解决了这个问题:

解决办法如下:
MyChrome 支持外部程序带参数,这样的试试:

"D:\Program Files\PiaoYun.CC\XX-Net\python27\1.0\pythonw.exe" "D:\Program Files\PiaoYun.CC\XX-Net\launcher\start.py"

在MyChrome.ini配置文件里面的显示如下:

ExApp="".\ShadowsocksR\PiaoYun.CC-ShadowsocksR-dotnet4.0.exe"||"D:\Program Files\Google Chrome\PiaoYun.CC\XX-Net\python27\1.0\pythonw.exe" "D:\Program Files\Google Chrome\PiaoYun.CC\XX-Net\launcher\start.py""

在这里十分感谢MyChrome原创作者:甲壳虫 的帮助!

Git介绍

分布式 : Git版本控制系统是一个分布式的系统, 是用来保存工程源代码历史状态的命令行工具;
保存点 : Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目额状态; 可以在该保存点将多人提交的源码合并, 也可以会退到某一个保存点上;
Git离线操作性 :Git可以离线进行代码提交, 因此它称得上是完全的分布式处理, Git所有的操作不需要在线进行; 这意味着Git的速度要比SVN等工具快得多, 因为SVN等工具需要在线时才能操作, 如果网络环境不好, 提交代码会变得非常缓慢;
Git基于快照 : SVN等老式版本控制工具是将提交点保存成补丁文件, Git提交是将提交点指向提交时的项目快照, 提交的东西包含一些元数据(作者, 日期, GPG等);
Git的分支和合并 : 分支模型是Git最显著的特点, 因为这改变了开发者的开发模式, SVN等版本控制工具将每个分支都要放在不同的目录中, Git可以在同一个目录中切换不同的分支;
分支即时性 : 创建和切换分支几乎是同时进行的, 用户可以上传一部分分支, 另外一部分分支可以隐藏在本地, 不必将所有的分支都上传到GitHub中去;
分支灵活性 : 用户可以随时 创建 合并 删除分支, 多人实现不同的功能, 可以创建多个分支进行开发, 之后进行分支合并, 这种方式使开发变得快速, 简单, 安全。

Git通用客户端官方下载地址

http://git-scm.com/

Git软件安装

欢迎界面 : 直接下一步;

01
协议 : 必须接受;
02

安装位置 : 预留100M空间, 自定义安装位置;
03

选择安装组件 :也可以默认选择;
— 图标组件(Addition icons) : 选择是否创建快速启动栏图标 或者 是否创建桌面快捷方式;
— 桌面浏览(Windows Explorer integration) : 浏览源码的方法, 单独的上下文浏览 只使用bash 或者 只用Git GUI工具; 高级的上下文浏览方法 使用git-cheetah plugin插件;
— 关联配置文件 : 是否关联git配置文件, 该配置文件主要显示文本编辑器的样式;
— 关联shell脚本文件 : 是否关联Bash命令行执行的脚本文件;
— 使用TrueType编码 : 在命令行中是否使用TruthType编码, 该编码是微软和苹果公司制定的通用编码;
04
git客户端版本控制软件4

开始菜单快捷方式目录 : 设置开始菜单中快捷方式的目录名称, 也可以选择不再开始菜单中创建快捷方式;
05
git客户端版本控制软件5

设置环境变量 : 选择使用什么样的命令行工具, 一般情况下我们默认使用Git Bash即可, 默认选择;
— Git自带 : 使用Git自带的Git Bash命令行工具;
— 系统自带CMD : 使用Windows系统的命令行工具;
— 二者都有 : 上面二者同时配置, 但是注意, 这样会将windows中的find.exe 和 sort.exe工具覆盖, 如果不懂这些尽量不要选择;
06
git客户端版本控制软件6

选择换行格式 :
— 检查出windows格式转换为unix格式 : 将windows格式的换行转为unix格式的换行在进行提交;
— 检查出原来格式转为unix格式 : 不管什么格式的, 一律转为unix格式的换行在进行提交;
— 不进行格式转换 : 不进行转换, 检查出什么, 就提交什么;
07

开始安装 :
08

安装结束 : over;
09

配置GitHub

在开始菜单找到Git Bash右键属性,修改Git Bash的配置 : 将Git Bash设置为快速编辑模式, 可以更好的使用该命令行工具 :
git客户端版本控制软件10
QQ截图20151108234053

创建本地ssh

一种传输代码的方法,速度快安全。详细可去百度查资料、也可以选择HTTPS传输,那就跳过此步。

ssh-keygen -t rsa -C "piaoyun@piaoyun.cc"

GitHub邮箱 : 该命令后面的邮箱就是GitHub的注册邮箱;
路径选择 : 使用该命令之后, 会出现提示选择ssh-key生成路径, 这里直接点回车默认即可, 生成的ssh-key在默认路径中;
密码确认 : 这里我们不使用密码进行登录, 用密码太麻烦;
git客户端版本控制软件11
QQ截图20151108233315

将ssh配置到GitHub中

进入生成的ssh目录 : C:\Documents and Settings\piaoyun\.ssh (或者 C:\Users\自己电脑用户名\.ssh)中, 使用记事本打开 id_rsa.pub 文件, 将该文件中的内容复制;

id_rsa.pub 文件内容 :

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtT1YCeaNulpfC+ARqAWrCdfpi6CpW3gkGT0hp6Q8by7NnEfy4dah9CwSrNbWJH5eS4tiqckE+bdbSVNvAboFD1MtGZjtzE4GDweG/6J/SDYV/ADFN/RLWGb+5rQ8wMCjc/fODgLJDFxk1Fwk/TTqTcbtLab1toLcts3zGIW5DstA3RQ0CCX/sPew5m7vh7DcKXluj2TBd9hw== piaoyun@piaoyun.cc

进入GitHub网站 : 登录GitHub, 选择Account Setting 用户设置:
git客户端版本控制软件12

选择左侧的SSH-KEY选项 :

git客户端版本控制软件13
点击右侧的Add SSH key :
git客户端版本控制软件14

将上面复制好的ssh-key复制进去 :
git客户端版本控制软件15

验证是否配置成功 :

ssh -T git@github.com

验证时可能让你输入YES。

成功提示 : 如果出现Hi han1202012! You’ve successfully authenticated, but GitHub does not provide shell access. 就说明配置成功, 可以连接上GitHub;
git客户端版本控制软件16

配置本地用户和邮箱

用户名邮箱作用 : 我们需要设置一个用户名 和 邮箱, 这是用来上传本地仓库到GitHub中, 在GitHub中显示代码上传者;
使用命令 :

git config --global user.name "PiaoYun" //设置用户名
git config --global user.email "piaoyun@piaoyun.cc" //设置邮箱

到此Git客户端已安装及GitHub配置完成,现在可以从GitHub传输代码了。
QQ截图20151108233250

设置Git默认目录为本地项目开发库

如果设置了,就不用每次打开Git再cd打开目录了。方法:右键git快捷图标(名叫:Git Bash),找到快捷方式-起始位置,把你的项目地址放在这里就可以了。

新版Git设置如下图:
074

windows 2008系统 Jdk版本1.6

用鼠标右击“我的电脑”->属性->高级->环境变量
系统变量->新建->变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0_12(这只是我的JDK安装路径)
系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;(若已经有Path项,无须另外新建,直接在后面加,但需用;与前面已有的项分隔开)
系统变量->新建->变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

最后测试下环境变量是否设置成功
在左下角的搜索框中键入
cmd

回车
输入javac

如果出现关于javac命令的相关使用信息,则表示安装成功了。

如果出现:’javac’ 不是内部或外部命令,也不是可运行的程序或批处理文件。则表示没有安装成功,需要重新检查配置是否正确。

FileZilla Server 0.9.39升级后, 进入管理面板, 会出现如下警告提示:
You appear to be behind a NAT router. Please configure the passive mode settings and forward a range of ports in your router.
Warning: FTP over TLS is not enabled, users cannot securely log in.
表示未启用tls模式, 为此今天特别实地操作了一次.
01

进入设置->ssl/tls设置.
02

生成一个新证书. 服务器地址用机器的ip即可.
03

点击生成证书, 一会儿就提示成功.
04

密钥的密码随意输入一个. 注意看下面有一个端口. 这是表示ssl, tls连接端口.
最后点击左下的确认即可.
05

当你用sll 或者 tls连接时, 它会提示你证书信息, 你选择通过并且保存即可
06

FTP日志显示, tls加密连接成功..
07

默认的ftp模式, 21端口是无法连接的.
08

你会收到它的异常信息.
09

Implicit SSL 端口为990, 可以连接. 这端口号也就是刚才设置中那个.
explicit SSL 端口为21, 可以连接.
explicit TLS 端口为21, 可以连接.
10

个人推荐用: Implicit SSL

<h2>近日使用“git add”出现如下错误:</h2>

$ git add . warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal', whose behaviour will change in Git 2.0 with respect to paths you removed. Paths like 'inc/jquery2.1.1/jquery.min.js' that are removed from your working tree are ignored with this version of Git. * 'git add --ignore-removal <pathspec>', which is the current default, ignores paths you removed from your working tree. * 'git add --all <pathspec>' will let you also record the removals. Run 'git status' to check the paths you removed from your working tree.

使用“git status”查看状态:

$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: app/js/app.js new file: app/tpl/admin.html new file: app/tpl/home.html new file: inc/jquery.2.1.1/jquery.min.js modified: index.html Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: inc/jquery2.1.1/jquery.min.js

解决方法很简单:
$ git add -A #或 git add -all

warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as Lucida Console!
解决办法: $ git config --global core.autocrlf true
warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use: git config --global push.default matching To squelch this message and adopt the new behavior now, use: git config --global push.default simple

错误信息:warning: LF will be replaced by CRLF in XXXXXXXXXXXXXX.
解决办法:
$ git config --global core.autocrlf false

事实上这并不会影响你push的结果,最终push还会成功,因为这只是一个”warning“

设置core.autocrlf=false,windows也用LF换行
除了记事本,其他编辑器都可以正常编辑

如果设置core.autocrlf = false,那么很可能会出现CRLF和LF混合的情况,这样会导致一些问题,例如git diff 失去功能,会发现很多行代码并没有修改,然而被认为是修改过了。

首先core.autocrlf = true在windows上才是正确的选择,那么如何避免warning呢?还要有以下几个步骤:

添加.gitattributes
设置core.safecrlf = true
使用dos2unix、notepad++等工具来将LF转换成CRLF
相关阅读:
https://www.zhihu.com/question/50862500
https://xiaozhuanlan.com/topic/4053786912

你可以按照他说的那样运行:git config --global push.default matching 或者 git config --global push.default simple命令,以后再push就不会有警告了。
下面说一下push.default matching和push.default simple的区别:

push.default设置maching的意思是:git push 会把你本地所有分支push到名称相对应的远程主机上。这意味着可能你会在不经意间push一些你原本没打算push的分支。push.default设置成simple的意思是:git push仅仅把当前所在分支push到从当初git pull pull下来的那个对应分支上,另外,这个过程也会同时检查各个分支的名称是否相对应。

使用GoAgent的人都知道,要用GoGotest经常搜索新的Google IP替换才能使用,XX-Net的出现结束了这个历史。

XX-Net是一个集成了GoAgent和GoGotest的封包软件(作者主页),能自动根据当前网络状况搜索最新Google IP,并且替换到GoAgent里面,可以说是GAE最高效利用方式了。(国人也是被逼的没办法才会把GAE用作这个用途…)

版本将每周更新到百度网盘,如果发现使用中有任何突发情况,可以到本站检查是否有新版本发布。

下载链接:
百度网盘:http://pan.baidu.com/s/1mg5XmYG 密码:eg8o
360云盘:http://yunpan.cn/cdXEEmHSJxgpJ  访问密码:5e24
官网地址:https://github.com/XX-net/XX-Net(1.13.6 之前的用户,请重新部署服务端)

版本:https://github.com/XX-net/XX-Net/releases

主要特性

大量改良过的GoAgent 稳定快速
Web界面,傻瓜易用
内置了公共 appid, 方便新手
自动导入证书,减少大量手动工作
可设置开机启动
支持自动升级,保留辛苦找到的ip资源

平台支持情况

Windows XP (需要 tcpip.sys 补丁, 比如用 tcp-z)
Win7/8/10
Ubuntu (不显示系统托盘)
Debian (debian 8 php_proxy无法工作)
Mac OS X(10.7; 10.8; 10.9; 10.10)

链接

问题报告: https://github.com/XX-net/XX-Net/issues
讨论群: https://groups.google.com/forum/#!forum/xx-net
Email: xxnet.dev at gmail.com

 

 

 

使用方法:

Windows下, 双击 start.lnk/start.vbs
启动弹出浏览器: 访问 http://localhost:8085/
托盘图标:点击可弹出Web管理界面, 右键可显示常用功能菜单。
Win7/8/10:提示请求管理员权限, 安装CA证书。请点击同意。
推荐用Chrome浏览器, 安装SwichySharp, 可在swichysharp目录下找到插件和配置文件
Firefox 需手动导入证书 data/gae_proxy/CA.crt 启动后生成

Linux下, 执行 start.sh
自动导入证书,需安装 libnss3-tools 包
没有安装PyGtk的,需要先安装gtk:sudo apt-get install python-gtk2
第一次启动, 请用sudo ./start.sh, 以安装CA证书
配置http代理 localhost 8087, 勾选全部协议使用这个代理。 推荐Chrome + SwitchyOmega

Mac下,双击 start.command
会自动导入证书,如果还有提示非安全连接,请手动导入data/gae_proxy/CA.crt证书
命令行启动方式:./start.sh 推荐Chrome + SwitchyOmega

服务端
协议采用3.3的版本,请重新部署服务端,服务端兼容3.1.x/3.2.x的客户端
虽然系统内置了公共appid, 还是建议部署自己的appid,公共appid限制看视频

附图

GoAgent状态页面:
XX-Net1

GoAgent 配置页面:
XX-Net2

GoAgent 部署服务端页面:
XX-Net3

GoAgent 查看日志页面:
XX-Net4

相关连接:
GoAgent常见的使用问题汇总解答【2014年9月16日更新】

 

Apache附带的ab工具(本机使用的PHP环境是WAMP集成环境,ab工具位于D:\wamp\bin\apache\Apache2.2.21\bin)非常容易使用,ab可以直接在Web服务器本地发起测试请求,这至关重要,因为有些时候我们需要测试的仅仅是服务器的处理性能,并不想掺杂着网络传输时间的影响。ab进行一切测试的本质都是基于HTTP的,所以可以说ab对于Web服务器软件的黑盒性能测试,获得的一切数据和计算结果,都是可以通过HTTP来解释的。

测试本机是否正确安装ab工具,在cmd想将当前目录定位到bin,输入 .\ab –V 命令,如果安装正确,则会将其版本信息打印出来。

D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech
Licensed to The Apache Software Foundation, <a href="http://www.apache.org/">http://www.apache.org/</a>

好了,一切就绪,下面提供一个压力测试的实例:

输入命令 PS D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c10 http://localhost/index.php

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software: Apache/2.2.21
Server Hostname: localhost
Server Port: 80

Document Path: /index.php
Document Length: 211 bytes

Concurrency Level: 10
Time taken for tests: 0.496 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 400000 bytes
HTML transferred: 211000 bytes
Requests per second: 2015.93 [#/sec] (mean)
Time per request: 4.960 [ms] (mean)
Time per request: 0.496 [ms] (mean, across all concurrent requests)
Transfer rate: 787.47 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 1
Processing: 2 5 1.1 4 12
Waiting: 2 4 1.1 4 12
Total: 2 5 1.1 5 12

Percentage of the requests served within a certain time (ms)
50% 5
66% 5
75% 5
80% 6
90% 6
95% 7
98% 8
99% 9
100% 12 (longest request)

下面开始解析这条命令语句:启动ab,并出入三个参数(PS D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c10 http://localhost/index.php )

-n1000 表示请求总数为1000

-c10 表示并发用户数为10

http://localhost/index.php 表示这写请求的目标URL

测试结果也一目了然,测试出的吞吐率为:Requests per second: 2015.93 [#/sec] (mean) 初次之外还有其他一些信息。

Server Software 表示被测试的Web服务器软件名称

Server Hostname 表示请求的URL主机名

Server Port 表示被测试的Web服务器软件的监听端口

Document Path 表示请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型

Document Length 表示HTTP响应数据的正文长度

Concurrency Level 表示并发用户数,这是我们设置的参数之一

Time taken for tests 表示所有这些请求被处理完成所花费的总时间

Complete requests 表示总请求数量,这是我们设置的参数之一

Failed requests 表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为 “Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。

Total transferred 表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。

HTML transferred 表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。

Requests per second 吞吐率,计算公式:Complete requests / Time taken for tests

Time per request 用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)

Time per requet(across all concurrent request) 服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level

Transfer rate 表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。

Percentage of requests served within a certain time(ms) 这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过6ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。

我们运行在apache的虚拟主机,有时候为了安全,需要为每个网站以不同的用户运行,这样当虚拟主机中的一个网站被入侵时,而不会影响到其它的虚拟主机。我们这里使用apache2-mpm-itk补丁来实现这种功能。

1、下载apache2和itk

到apache2-mpm-itk网站下载最新版的补丁:http://mpm-itk.sesse.net/

wget http://apache.ziply.com//httpd/httpd-2.2.21.tar.gz
tar xzvf httpd-2.2.21.tar.gz
wget http://mpm-itk.sesse.net/apache2.2-mpm-itk-2.2.17-01.patch

2、为apache2打上mpm-itk补丁

cd httpd-2.2.21
patch -p1 < ../apache2.2-mpm-itk-2.2.17-01.patch
autoconf

3、编译apache2

编译apache2时,带上编译选项--with-mpm=itk,如:

./configure --with-mpm=itk
make
make install

4、配置apache2

<VirtualHost *:80>
ServerName piaoyun.cc
...

<IfModule mpm_itk_module>
AssignUserId siteuser sitegroup
</IfModule>
</VirtualHost>

sitesuer是指apache以siteuser用户运行
sitegroup是指apache以sitegroup用户组运行

本人一直很讨厌PDF链接直接在浏览器中打开。如果PDF文件很大,打开会很慢,要卡很长时间。不如直接下载来的妥当。但最近发现不知何故,PDF又自动在Firefox中打开了。以前禁止PDF在浏览器中打开都是在Adobe Acrobat的首选项里设置的,去掉“因特网”选项卡中的3个选项前面的勾。如下图:
disable-firefox-view-pdf-1

然而今天发现Acrobat里面的设置没有改变,但PDF仍然在Firefox中打开。最后发现,原来是Firefox升级到19.0后,内置了PDF阅读器,并默认打开的缘故。那好,下面是如何关掉它!

在Firefox地址栏中输入 about:config 然后在里面搜索 pdfjs 然后双击 pdfjs.disabled 使其值由 false 变为 true。如下图:
disable-firefox-view-pdf-2

至此,PDF已经不会在Firefox中打开了,但点击PDF链接时可能会自动下载到某个目录。下面需要到 Firefox - 工具 - 选项 - 应用程序 中将adobe acrobat文档后面的选项改为 “总是询问”,如下图,即可提示下载。
disable-firefox-view-pdf-3

OK,现在问题搞定。如果你想恢复让PDF在Firefox浏览器中打开呢,那么点击这里的Firefox官方帮助用火狐打开PDF文件按说明操作即可。

最近管理的服务器,结果,打开phpmyadmin的时候就出现了这样的错误,在网上看了很多解答,看起来都对,但是我还是费了很大的劲才搞好,所以写下来已帮助记忆。

首先:在php的目录下建立个文件夹temp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的。

其次:在php.ini找到:

;session.save_path

这一行,修改成:

session.save_path = "C:/php/tmp"

把分号弄掉。这里要注意,php.ini里面有三处session.save_path ,如果只修改一个地方,还是不行的。

将php.ini中的session.auto_start的值改为1(启动),默认是0(禁用),

最后,是在phpmyadmin中找到:

config.sample.inc.php

修改成:config.inc.php

找到 $cfg['blowfish_secret'] 将后面的赋值,加入数字和字母组合。

全部修改完以后,重启iis或者apache,就可以看到熟悉的phpmyadmin的登陆界面了。

我的本地测试环境是php5.4+mysql5.60,用帝国备份王备份数据库,结果出错,提示下面的错误代码:

PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912
PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912
PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912

解决办法:
搜索帝国备份王所在目录文件夹,找到fuctions.php,在912行

找到函数:
mysql_escape_string

修改为:
mysql_real_escape_string

再次备份数据库就不再提示错误了。

对于一些访问没有明显错误提示的php页面,我们可以通过error_log来做进一步的判定。但出于种种原因,有些服务器并没有开启PHP的error_log功能。可以暂时开一下:

编辑php.ini,将log_errors设置为on:
log_errors = On
然后重启apache即可。

如成功开启,就可以跟踪到对应的错误提示:
[Mon Sep 24 16:57:01 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:02 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:03 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:04 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line

如果是Windows环境,除了将log_errors设置为on外,还需要定义error_log的路径及文件名:
error_log = d:/temp/error.log
(此目录需要授予php标识用户的修改权限,否则日志文件无法生成)
因为IIS没有error_log的概念,需要另外定义。

由于 libuv 版本的 SS 不稳定,并且安装步骤繁琐,因此推荐安装 libev 版本。安装参考如下

1、Shadowsocks 是什么

Shadowsocks 是一种安全的 socks5 代理,可以保护你的上网流量。基于多种加密方式,推荐使用 aes-256-cfb 加密。安装和使用需要本地端和服务端。
本地客户端已经包含了多种版本,包括iOS,Android,Windows,MAC,甚至是路由器 (基于OpenWRT),所以使用方便,各取所需。
远程服务端则一般安装在基于 Linux 的各种发行版操作系统,比如 Debian, CentOS, Fedora, Redhat, Ubuntu, openSUSE等。

2、Shadowsocks 的作者是谁

最初只有 Python 版,由 @clowwindy 开发和维护,后来随着知名度提高,开始出现各种语言的版本,其中比较知名的是 libev , go, nodejs 等版本,需要注意的是,nodejs 的作者也是 @clowwindy,但最近已不再维护该版本。libev 的维护者是 @madeye,长期更新。

3、Shadowsocks 一键安装脚本

虽然作者的安装教程已经很完备了,但还是有不少人不会安装和使用,因此我编写了 Shadowsocks 一键安装脚本,主要基于 CentOS 系统下的一键安装(也有 Debian 系统),分别有 Python, libev, nodejs 版,个人推荐使用 Python 和 libev 版。
该脚本会自动下载,编译安装最新版的 Shadowsocks,并且可以完全卸载 Shadowsocks ,自动生成配置文件,安装完成即可使用。

4、Shadowsocks 如何升级

安装完 Shadowsocks,一段时间后,作者已经更新了版本(修正 bug 或升级功能),那么如何一键升级到最新版呢?
Python 版,执行命令: pip install -U shadowsocks ,命令执行成功后,重新启动 Shadowsocks ,命令: service shadowsocks restart
libev 版,先卸载旧版本,执行命令:./shadowsocks-libev.sh uninstall ,再安装新版本,执行命令: ./shadowsocks-libev.sh 安装
Debian 下的 libev 版,升级方式同上。
nodejs 版,也是先卸载再重新安装,因为作者已经不更新,所以不推荐用这版本。

5、Shadowsocks 安装失败怎么办

由于 CentOS 5.x 的默认 gcc 版本过低,在编译 libev 版时会出错;同时默认 Python 的版本也过低,所以也无法安装 Python 版的。因此,请确保安装的环境为 CentOS 6.x 或 CentOS 7.x 。
更多其他错误,请根据实际错误提示,自行在 google 上搜索关键字。

6、Shadowsocks 的客户端程序

大多数人都是在 Windows 下使用电脑,因此最好用的 Windows 客户端是 shadowsocks-gui,下载最新版后解压即可使用。
shadowsocks-gui客户端下载地址:https://sourceforge.net/projects/shadowsocksgui/files/dist/

7、Shadowsocks 本地代理上网

本地电脑启动客户端,连接上远程服务端后,即在本地开启了 socks5 代理,本地端口号默认为 1080,如果提示被占用,也可以改为其他端口号。在浏览器中安装插件,Chrome 下是 SwitchySharp, Firefox 下是 AutoProxy,新建配置文件,SOCKS Host 填 127.0.0.1,Port 填 1080(默认,跟 Shadowsocks 客户端的本地端口号一致即可)

参考链接:
1、http://shadowsocks.org/en/index.html
2、https://github.com/clowwindy/shadowsocks
3、https://github.com/madeye/shadowsocks-libev

以下的一键安装脚本来源于网络:秋水逸冰的博客!【博主在搬瓦工的MICRO64型号VPS运行安装通过了】

CentOS下shadowsocks-libev一键安装脚本

搬瓦工Micro-64型号配置,博主是在某宝上面淘到的。价格是每年的。

Self-managed
HDD: 1.5 GB
RAM: 64 MB
CPU: 1x Intel Xeon
BW: 100 GB/mo

本脚本适用环境:
系统支持:CentOS 6.x 32或64位
内存要求:≥128M
日期:2014年07月12日

关于本脚本:
一键安装 libev 版的 shadowsocks 最新版本。该版本的特点是内存占用小(600k左右),低 CPU 消耗,甚至可以安装在基于 OpenWRT 的路由器上。

默认配置:
服务器端口:8989
客户端端口:1080
密码:自己设定(如不设定,默认为teddysun.com)

客户端下载:
http://sourceforge.net/projects/shadowsocksgui/files/dist/

使用方法:
使用root用户登录,运行以下命令:

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log

安装完成后,脚本提示如下:

Congratulations, shadowsocks-libev install completed!
Your Server IP:your_server_ip
Your Server Port:8989
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/357.html
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocks-libev.sh uninstall

其他事项:
安装完成后即已后台启动 shadowsocks ,运行:

ps -ef | grep ss-server | grep -v ps | grep -v grep

可以查看进程是否存在。
本脚本安装完成后,会将 shadowsocks-libev 加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status

更多版本 shadowsocks 安装:
CentOS 下 shadowsocks-python 一键安装脚本
CentOS 下 shadowsocks-nodejs 一键安装脚本
Debian 下 shadowsocks-libev 一键安装脚本

特别说明:
1、已安装旧版本的 shadowsocks 需要升级的话,需下载本脚本的最新版,运行卸载命令./shadowsocks-libev.sh uninstall 后,再次执行本脚本即可安装最新版。
2、关于 CentOS 的默认 iptables 防火墙规则 icmp-host-prohibited ,如果安装之后发现已经启动 shadowsocks,本地客户端却不能连接上,请检查 iptables 是不是有如下的一条规则:

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

运行命令:

/etc/init.d/iptables status

可以查看。如果有这条规则,则添加的 8989 端口需手动更改一下,放到这条规则的上一行。编辑 /etc/sysconfig/iptables 文件,将:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT

放在:

-A INPUT -j REJECT --reject-with icmp-host-prohibited

的前面。最终效果如下:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

编辑完后,重启 iptables 防火墙。命令:/etc/init.d/iptables restart

秋水逸冰博主的CentOS下shadowsocks-libev一键安装脚本内容:

#! /bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#===============================================================================================
#   System Required:  CentOS6.x (32bit/64bit)
#   Description:  Install Shadowsocks(libev) for CentOS
#   Author: Teddysun <i@teddysun.com>
#   Intro:  http://teddysun.com/357.html
#===============================================================================================

clear
echo "#############################################################"
echo "# Install Shadowsocks(libev) for CentOS6.x (32bit/64bit)"
echo "# Intro: http://teddysun.com/357.html"
echo "#"
echo "# Author: Teddysun <i@teddysun.com>"
echo "#"
echo "#############################################################"
echo ""

# Install Shadowsocks-libev
function install_shadowsocks_libev(){
    rootness
    disable_selinux
    pre_install
    download_files
    config_shadowsocks
    iptables_set
    install
}

# Make sure only root can run our script
function rootness(){
if [[ $EUID -ne 0 ]]; then
   echo "Error:This script must be run as root!" 1>&2
   exit 1
fi
}

# Disable selinux
function disable_selinux(){
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    setenforce 0
fi
}

# Pre-installation settings
function pre_install(){
    #Set shadowsocks-libev config password
    echo "Please input password for shadowsocks-libev:"
    read -p "(Default password: teddysun.com):" shadowsockspwd
    if [ "$shadowsockspwd" = "" ]; then
        shadowsockspwd="teddysun.com"
    fi
    echo "password:$shadowsockspwd"
    echo "####################################"
    get_char(){
        SAVEDSTTY=`stty -g`
        stty -echo
        stty cbreak
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -raw
        stty echo
        stty $SAVEDSTTY
    }
    echo ""
    echo "Press any key to start...or Press Ctrl+C to cancel"
    char=`get_char`
    #Install necessary dependencies
    yum install -y wget unzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent
    yum install -y automake make curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel
    # Get IP address
    echo "Getting Public IP address, Please wait a moment..."
    IP=`curl -s checkip.dyndns.com | cut -d' ' -f 6  | cut -d'<' -f 1`
    if [ -z $IP ]; then
        IP=`curl -s ifconfig.me/ip`
    fi
    #Current folder
    cur_dir=`pwd`
    cd $cur_dir
}

# Download latest shadowsocks-libev
function download_files(){
    if [ -f shadowsocks-libev.zip ];then
        echo "shadowsocks-libev.zip [found]"
    else
        if ! wget --no-check-certificate https://github.com/madeye/shadowsocks-libev/archive/master.zip -O shadowsocks-libev.zip;then
            echo "Failed to download shadowsocks-libev.zip"
            exit 1
        fi
    fi
    unzip shadowsocks-libev.zip
    if [ $? -eq 0 ];then
        cd $cur_dir/shadowsocks-libev-master/
    else
        echo ""
        echo "Unzip shadowsocks-libev failed! Please visit http://teddysun.com/357.html and contact."
        exit 1
    fi
    # Download start script
    if ! wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev; then
        echo "Failed to download shadowsocks-libev start script!"
        exit 1
    fi
}

# Config shadowsocks
function config_shadowsocks(){
    if [ ! -d /etc/shadowsocks-libev ];then
        mkdir /etc/shadowsocks-libev
    fi
    cat > /etc/shadowsocks-libev/config.json<<-EOF
{
    "server":"${IP}",
    "server_port":8989,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"${shadowsockspwd}",
    "timeout":600,
    "method":"aes-256-cfb"
}
EOF
}

# iptables set
function iptables_set(){
    /sbin/service iptables status 1>/dev/null 2>&1
    if [ $? -eq 0 ]; then
        /etc/init.d/iptables status | grep '8989' | grep 'ACCEPT' >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT
            /etc/init.d/iptables save
            /etc/init.d/iptables restart
        fi
    fi
}


# Install 
function install(){
    # Build and Install shadowsocks-libev
    if [ -s /usr/local/bin/ss-server ];then
        echo "shadowsocks-libev has been installed!"
        exit 0
    else
        ./configure
        make && make install
        if [ $? -eq 0 ]; then
            mv $cur_dir/shadowsocks-libev-master/shadowsocks-libev /etc/init.d/shadowsocks
            chmod +x /etc/init.d/shadowsocks
            # Add run on system start up
            chkconfig --add shadowsocks
            chkconfig shadowsocks on
            # Start shadowsocks
            /etc/init.d/shadowsocks start
            if [ $? -eq 0 ]; then
                echo "Shadowsocks-libev start success!"
            else
                echo "Shadowsocks-libev start failure!"
            fi
        else
            echo ""
            echo "Shadowsocks-libev install failed! Please visit http://teddysun.com/357.html and contact."
            exit 1
        fi
    fi
    cd $cur_dir
    # Delete shadowsocks-libev floder
    rm -rf $cur_dir/shadowsocks-libev-master/
    # Delete shadowsocks-libev zip file
    rm -f shadowsocks-libev.zip
    clear
    echo ""
    echo "Congratulations, shadowsocks-libev install completed!"
    echo -e "Your Server IP: \033[41;37m ${IP} \033[0m"
    echo -e "Your Server Port: \033[41;37m 8989 \033[0m"
    echo -e "Your Password: \033[41;37m ${shadowsockspwd} \033[0m"
    echo -e "Your Local IP: \033[41;37m 127.0.0.1 \033[0m"
    echo -e "Your Local Port: \033[41;37m 1080 \033[0m"
    echo -e "Your Encryption Method: \033[41;37m aes-256-cfb \033[0m"
    echo ""
    echo "Welcome to visit:http://teddysun.com/357.html"
    echo "Enjoy it!"
    echo ""
}

# Uninstall Shadowsocks-libev
function uninstall_shadowsocks_libev(){
    printf "Are you sure uninstall shadowsocks_libev? (y/n) "
    printf "\n"
    read -p "(Default: n):" answer
    if [ -z $answer ]; then
        answer="n"
    fi
    if [ "$answer" = "y" ]; then
        ps -ef | grep -v grep | grep -v ps | grep -i "ss-server" > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            /etc/init.d/shadowsocks stop
        fi
        chkconfig --del shadowsocks
        # delete config file
        rm -rf /etc/shadowsocks-libev
        # delete shadowsocks
        rm -f /usr/local/bin/ss-local
        rm -f /usr/local/bin/ss-tunnel
        rm -f /usr/local/bin/ss-server
        rm -f /usr/local/bin/ss-redir
        rm -f /usr/local/share/man/man8/shadowsocks.8
        rm -f /etc/init.d/shadowsocks
        echo "Shadowsocks-libev uninstall success!"
    else
        echo "uninstall cancelled, Nothing to do"
    fi
}

# Initialization step
action=$1
[  -z $1 ] && action=install
case "$action" in
install)
    install_shadowsocks_libev
    ;;
uninstall)
    uninstall_shadowsocks_libev
    ;;
*)
    echo "Arguments error! [${action} ]"
    echo "Usage: `basename $0` {install|uninstall}"
    ;;
esac

Shadowsocks一键安装包(Debian/Ubuntu适用)脚本内容[脚本内容来源于网络]:

#!/bin/bash

if [ $(id -u) != "0" ]; then
    echo "Error: You must be root to run this script"
    exit 1
fi

ssport=443
echo -e "Shadowsocks server port(Default 443)>>\c"
read ssport
echo "===========shadowsocks port is $ssport============"

sspasswd=5y2n
echo -e "Shadowsocks server password(Default 5y2d)>>\c"
read sspasswd
echo "=========shadowsocks password is $sspasswd========"

ssmethod=rc4-md5
echo -e "Shadowsocks server encrypte method"
echo -e "Allow: rc4-md5(Default),aes-128,aes-256>>\c"
read ssmethod
echo "=====shadowsocks encrypte method is $ssmethod====="

apt-get -y update
apt-get -y install git &&
mkdir /tmp/shadowsocks &&
cd /tmp/shadowsocks &&
git clone https://github.com/madeye/shadowsocks-libev.git
cd shadowsocks-libev
apt-get -y install build-essential autoconf libtool libssl-dev gawk debhelper
dpkg-buildpackage
cd ..
dpkg -i shadowsocks*.deb
cd ../.. && rm -rf shadowsocks

sed -i 's/"server":"\<.*\>"/"server":"0.0.0.0"/g' /etc/shadowsocks/config.json
var1=\"server_port\":\\\<.*\\\>
var2=\"server_port\":$ssport
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json
var1=\"password\":\"\\\<.*\\\>\"
var2=\"password\":\"$sspasswd\"
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json
var1=\"method\":\"\\\<.*\\\>\"
var2=\"method\":\"$ssmethod\"
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json

service shadowsocks restart &&

echo "==========================================================="
echo "="
echo "=   Your shadowsocks server install complete! "
echo "=   Congfig file: /etc/shadowsocks/config.json"
echo "=   Control: service shadowsocks {start|stop|restart}"
echo "="
echo "==========================================================="

前段时间换了新电脑后,在 Windows 8 操作系统下安装了最新版本的 VMware Workstation 10,创建完 Windows Server 2008 后进入虚拟机发现系统运行非常缓慢,这个情况让我十分苦恼。

经过多次更改设置、优化 Windows Server 2008等,终于发现关键问题之所在,并做如下操作即可解决虚拟机运行缓慢、狂读硬盘的问题:

在“虚拟机设置”中更改“硬盘”的“高级……”设置,将其“模式”选上“独立”,如下图所示,更改后再启动虚拟机,其运行速度有很大改善。
2013110781737729

虚拟机硬盘设置参数说明

VMware虚拟硬盘包括两种模式:独立的与非独立的。

默认情况下,硬盘都属于非独立的模式这种模式的硬盘可以创建快照并且可以在需要的时候回复到快照时的状态,这在做试验与测试时非常有用
而在“独立”模式下,包括永久(persistent)与非永久(nopersistent)两种状态,在永久状态下,磁盘的行为就好像物理计算机上的常规磁盘驱动器,向一个处于永久模式的磁盘写入,所有数据被永久性地写入此磁盘;
而在非永久状态下,对磁盘所做的更改不保存到磁盘,在虚拟机关机或者复位时丢失。对于总是希望虚拟机启动时处于相同状态的人而言,非永久模式非常方便,其实际应用包括为软件测试和给予技术支持的用户提供已知的环境,也包括进行软件的演示。

其实永久非永久在设置里面已经说的很清楚了。永久,就是你的数据不受快照的影响,如果你还原系统状态还是还原快照,都不会影响这个持久硬盘的数据,所以这种独立硬盘一般存放开发的源代码和重要文档,这样如果还原快照就不会造成数据丢失,而非永久就是当你还原快照的时候,你的硬盘数据也会还原,还原点以前存放的数据就会丢失。

至于后面的0:0,0:1,就是磁盘标注,就是第几块硬盘,这种标注只对Linux系统的文件结构有用,对windows就很难理解了。其实就是在根目录下挂在几个磁盘,第一个标注0,第二个标注为1,在linux下就显示为sda或者sdb之类的,这是linux或者采用虚拟磁盘技术必须搞清楚的,磁盘矩阵(管理成千上万个磁盘的时候)一般采用这种方式管理。

说明:/home目录里面有data目录,data目录里面有a、b、c、d、e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中

方法一:终端命令行下执行以下命令

cp -R 'find /home/data -type d -path /home/data/e -prune -o -print | sed 1d' /bak

########################################################
脚本实现
脚本存放路径/home/piaoyun.sh
vi /home/osyunwei.sh #编辑脚本,添加下面的代码
#!/bin/sh
cp -R 'find /home/data -type d -path /home/data/e -prune -o -print | sed 1d' /bak

chmod +x /home/piaoyun.sh #添加脚本执行权限
cd /home #进入脚本存放目录
./piaoyun.sh #执行脚本
########################################################

方法二:使用cp命令复制的时候,只能排除一个目录不被复制,如果想排除两个或者多个目录的话,就需要使用rsync命令来实现了,看下面的例子
如果要排除/home/data目录下面的a、b、c、三个目录,同时拷贝其它所有目录,执行以下命令

yum install rsync #安装rsync

rsync -av --exclude data/a --exclude data/b --exclude data/c data /bak

注意:--exclude后面的路径不能为绝对路径,必须为相对路径才可以,否则出错。

延伸阅读:
rsync实现文件备份同步的配置使用与参数说明

[rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是windows的话,需要windows版本cwrsync]

一、什么是rsync

rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。

Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。 Rsync 本来是用以取代 rcp 的一个工具,它当前由 rsync.samba.org 维护。 Rsync 使用所谓的“ Rsync 演算法 ”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsync server 的机器也叫 backup server ,一个 Rsync server 可同时备份多个 client 的数据;也可以多个 Rsync server 备份一个 client 的数据。
Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。 Rsync server 会打开一个 873 的服务通道 (port) ,等待对方 Rsync 连接。连接时, Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
Rsync 支持大多数的类 Unix 系统,无论是 Linux 、 Solaris 还是 BSD 上都经过了良好的测试。此外,它在 windows 平台下也有相应的版本,比较知名的有 cwRsync 和 Sync2NAS 。

Rsync 的基本特点如下:
1. 可以镜像保存整个目录树和文件系统;
2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;
3. 无须特殊权限即可安装;
4. 优化的流程,文件传输效率高;
5. 可以使用 rcp 、 ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;
6. 支持匿名传输。

二、架设rsync服务器

架设rsync 服务器比较简单,写一个配置文件rsyncd.conf 。文件的书写也是有规则的,我们可以参照rsync.samba.org 上的文档来做。当然我们首先要安装好rsync这个软件才行;

A、rsync的安装
获取rsync

rysnc的官方网站:http://rsync.samba.org/ftp/rsync/ 可以从上面得到最新的版本。目前最新版是3.1.1。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。

软件包安装:

# sudo apt-get install rsync 注:在debian、ubuntu 等在线安装方法;
# yum install rsync 注:Fedora、Redhat 等在线安装方法;
# rpm -ivh rsync 注:Fedora、Redhat 等rpm包安装方法;

其它Linux发行版,请用相应的软件包管理方法来安装。

源码包安装:

tar xvf rsync-xxx.tar.gz
cd rsync-xxx
./configure --prefix=/usr ;make ;make install 注:在用源码包编译安装之前,您得安装gcc等编译开具才行;

Windows版本:
下载地址:https://www.itefix.net/cwrsync

B、配置文件
rsync的主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)、服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。

具体步骤如下:

#touch /etc/rsyncd.conf #创建rsyncd.conf,这是rsync服务器的配置文件。
#touch /etc/rsyncd.secrets #创建rsyncd.secrets ,这是用户密码文件。
#chmod 600 /etc/rsyncd/rsyncd.secrets #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
#touch /etc/rsyncd.motd

下一就是我们修改rsyncd.conf和rsyncd.secrets和rsyncd.motd文件的时候了。

设定/etc/rsyncd.conf

rsyncd.conf是rsync服务器主要配置文件。我们先来个简单的示例,后面在详细说明各项作用。

比如我们要备份服务器上的/home和/opt,在/home中我想把easylife和samba目录排除在外;

# Distributed under the terms of the GNU General Public License v2
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help

# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873
address = 192.168.1.171
#uid = nobody
#gid = nobody
uid = root
gid = root

use chroot = yes
read only = yes

#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
hosts deny=*

max connections = 5
motd file = /etc/rsyncd.motd

#This will give you a separate log file
#log file = /var/log/rsync.log

#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes

log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

[rhel4home]
path = /home
list=yes
ignore errors
auth users = root
secrets file = /etc/rsyncd.secrets
comment = This is RHEL 4 data
exclude = easylife/ samba/

[rhel4opt]
path = /opt
list=no
ignore errors
comment = This is RHEL 4 opt
auth users = easylife
secrets file = /etc/rsyncd/rsyncd.secrets

注:关于auth users是必须在服务器上存在的真实的系统用户,如果你想用多个用户以,号隔开,比如auth users = easylife,root

设定密码文件

密码文件格式很简单,rsyncd.secrets的内容格式为:

用户名:密码

我们在例子中rsyncd.secrets的内容如下类似的;在文档中说,有些系统不支持长密码,自己尝试着设置一下吧。

easylife:keer
root:mike

chown root.root rsyncd.secrets  #修改属主
chmod 600 rsyncd.secrets #修改权限

注:
1、将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功! 出于安全目的,文件的属性必需是只有属主可读。
2、这里的密码值得注意,为了安全你不能把系统用户的密码写在这里。比如你的系统用户easylife密码是000000,为了安全你可以让rsync中的easylife为keer。这和samba的用户认证的密码原理是差不多的。

设定rsyncd.motd 文件;

它是定义rysnc服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;类似ftp服务器登录时,我们所看到的 linuxsir.org ftp ……。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;我在这里写了一个 rsyncd.motd的内容为:

++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++

三、rsyncd.conf服务器的配置详解

A、全局定义

在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;

pid file = /var/run/rsyncd.pid 注:告诉进程写到 /var/run/rsyncd.pid 文件中;
port = 873 注:指定运行端口,默认是873,您可以自己指定;
address = 192.168.1.171 注:指定服务器IP地址
uid = nobody
gid = nobdoy

注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。

use chroot = yes

注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝 试

read only = yes

注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;

#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0

注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;

max connections = 5

注:客户端最多连接数

motd file = /etc/rsyncd/rsyncd.motd

注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是:

++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++

log file = /var/log/rsync.log

注:rsync 服务器的日志;

transfer logging = yes

注:这是传输文件的日志

log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

B、模块定义

模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的

下面是前面配置文件模块的例子:

[rhel4home] #模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式

path = /home #指定文件目录所在位置,这是必须指定的
auth users = root #认证用户是root ,是必须在服务器上存在的用户
list=yes #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
ignore errors #忽略IO错误
secrets file = /etc/rsyncd.secrets #密码存在哪个文件
comment = linuxsir home data #注释可以自己定义
exclude = beinan/ samba/

注:exclude是排除的意思,也就是说,要把/home目录下的easylife和samba排除在外; easylife/和samba/目录之间有空格分开

[rhel4opt]
path = /opt
list=no
comment = optdir
auth users = beinan
secrets file = /etc/rsyncd/rsyncd.secrets
ignore errors

四、启动rsync服务器及防火墙的设置

启动rsync服务器相当简单,有以下几种方法

A、--daemon参数方式,是让rsync以服务器模式运行

#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf  #--config用于指定rsyncd.conf的位置,如果在/etc下可以不写

B、xinetd方式

修改services加入如下内容

# nano -w /etc/services

rsync  873/tcp  # rsync
rsync  873/udp  # rsync

这一步一般可以不做,通常都有这两行(我的RHEL4和GENTOO默认都有)。修改的目的是让系统知道873端口对应的服务名为rsync。如没有的话就自行加入。

设定 /etc/xinetd.d/rsync, 简单例子如下:

# default: off
# description: The rsync server is a good addition to am ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

上述, 主要是要打开rsync這個daemon, 一旦有rsync client要连接時, xinetd会把它转介給 rsyncd(port 873)。然后service xinetd restart, 使上述设定生效.

rsync服务器和防火墙

Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。

#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
#iptables -L 查看一下防火墙是不是打开了 873端口

如果你不太懂防火墙的配置,可以先service iptables stop 将防火墙关掉。当然在生产环境这是很危险的,做实验才可以这么做哟!

五、通过rsync客户端来同步数据

A、语法详解

在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很多功能选项,下面就对介绍一下常用的选项:

rsync的命令格式可以为:

1. rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
2. rsync [OPTION]... [USER@]HOST:SRC DEST
3. rsync [OPTION]... SRC [SRC]... DEST
4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
5. rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync有六种不同的工作模式:

1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
-a 以archive模式操作、复制目录、符号连接 相当于-rlptgoD

rsync中的参数:

-r 是递归
-l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
-e ssh的参数建立起加密的连接。
-u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
--progress是指显示出详细的进度情况
--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
--password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息

B、一些实例

B1、列出rsync 服务器上的所提供的同步内容;

首先:我们看看rsync服务器上提供了哪些可用的数据源

# rsync --list-only root@192.168.145.5::
++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++

rhel4home This is RHEL 4 data

注:前面是rsync所提供的数据源,也就是我们在rsyncd.conf中所写的[rhel4home]模块。而“This is RHEL 4 data”是由[rhel4home]模块中的 comment = This is RHEL 4 data 提供的;为什么没有把rhel4opt数据源列出来呢?因为我们在[rhel4opt]中已经把list=no了。

$ rsync --list-only root@192.168.145.5::::rhel4home

++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++

Password:
drwxr-xr-x 4096 2009/03/15 21:33:13 .
-rw-r--r-- 1018 2009/03/02 02:33:41 ks.cfg
-rwxr-xr-x 21288 2009/03/15 21:33:13 wgetpaste
drwxrwxr-x 4096 2008/10/28 21:04:05 cvsroot
drwx------ 4096 2008/11/30 16:30:58 easylife
drwsr-sr-x 4096 2008/09/20 22:18:05 giddir
drwx------ 4096 2008/09/29 14:18:46 quser1
drwx------ 4096 2008/09/27 14:38:12 quser2
drwx------ 4096 2008/11/14 06:10:19 test
drwx------ 4096 2008/09/22 16:50:37 vbird1
drwx------ 4096 2008/09/19 15:28:45 vbird2

后面的root@ip中,root是指定密码文件中的用户名,之后的::rhel4home这是rhel4home模块名

B2、rsync客户端同步数据;

#rsync -avzP root@192.168.145.5::rhel4home rhel4home
Password: 这里要输入root的密码,是服务器端rsyncd.secrets提供的。在前面的例子中我们用的是mike,输入的密码并不回显,输好就回车。

注: 这个命令的意思就是说,用root用户登录到服务器上,把rhel4home数据,同步到本地当前目录rhel4home上。当然本地的目录是可以你自己 定义的。如果当你在客户端上当前操作的目录下没有rhel4home这个目录时,系统会自动为你创建一个;当存在rhel4home这个目录中,你要注意 它的写权限。

#rsync -avzP --delete linuxsir@linuxsir.org::rhel4home rhel4home

这回我们引入一个--delete 选项,表示客户端上的数据要与服务器端完全一致,如果 linuxsirhome目录中有服务器上不存在的文件,则删除。最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致;用的时候要 小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;

設定 rsync client

设定密码文件

#rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home

这次我们加了一个选项 --password-file=rsyncd.secrets,这是当我们以root用户登录rsync服务器同步数据时,密码将读取rsyncd.secrets这个文件。这个文件内容只是root用户的密码。我们要如下做;

# touch rsyncd.secrets
# chmod 600 rsyncd.secrets
# echo "mike"> rsyncd.secrets

# rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home

注:这里需要注意的是这份密码文件权限属性要设得只有属主可读。

这样就不需要密码了;其实这是比较重要的,因为服务器通过crond 计划任务还是有必要的;

B3、让rsync客户端自动与服务器同步数据

服务器是重量级应用,所以数据的网络备份还是极为重要的。我们可以在生产型服务器上配置好rsync 服务器。我们可以把一台装有rysnc机器当做是备份服务器。让这台备份服务器,每天在早上4点开始同步服务器上的数据;并且每个备份都是完整备份。有时 硬盘坏掉,或者服务器数据被删除,完整备份还是相当重要的。这种备份相当于每天为服务器的数据做一个镜像,当生产型服务器发生事故时,我们可以轻松恢复数 据,能把数据损失降到最低;是不是这么回事??

step1:创建同步脚本和密码文件

#mkdir /etc/cron.daily.rsync
#cd /etc/cron.daily.rsync
#touch rhel4home.sh rhel4opt.sh
#chmod 755 /etc/cron.daily.rsync/*.sh
#mkdir /etc/rsyncd/
#touch /etc/rsyncd/rsyncrhel4root.secrets
#touch /etc/rsyncd/rsyncrhel4easylife.secrets
#chmod 600 /etc/rsyncd/rsync.*

注: 我们在 /etc/cron.daily/中创建了两个文件rhel4home.sh和rhel4opt.sh ,并且是权限是755的。创建了两个密码文件root用户用的是rsyncrhel4root.secrets ,easylife用户用的是 rsyncrhel4easylife.secrets,权限是600;

我们编辑rhel4home.sh,内容是如下的:

#!/bin/sh
#backup 192.168.145.5:/home
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncrhel4root.password root@192.168.145.5::rhel4home /home/rhel4homebak/$(date +'%m-%d-%y')

我们编辑 rhel4opt.sh ,内容是:

#!/bin/sh
#backup 192.168.145.5:/opt
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncrhel4easylife.secrets easylife@192.168.145.5::rhel4opt /home/rhel4hoptbak/$(date +'%m-%d-%y')

注:你可以把rhel4home.sh和rhel4opt.sh的内容合并到一个文件中,比如都写到rhel4bak.sh中;

接着我们修改 /etc/rsyncd/rsyncrhel4root.secrets和rsyncrhel4easylife.secrets的内容;

# echo "mike" > /etc/rsyncd/rsyncrhel4root.secrets
# echo "keer"> /etc/rsyncd/rsyncrhel4easylife.secrets

然后我们再/home目录下创建rhel4homebak 和rhel4optbak两个目录,意思是服务器端的rhel4home数据同步到备份服务器上的/home/rhel4homebak 下,rhel4opt数据同步到 /home/rhel4optbak/目录下。并按年月日归档创建目录;每天备份都存档;

#mkdir /home/rhel4homebak
#mkdir /home/rhel4optbak

step2:修改crond服务器的配置文件 加入到计划任务

#crontab -e

加入下面的内容:

# Run daily cron jobs at 4:10 every day backup rhel4 data:
10 4 * * * /usr/bin/run-parts /etc/cron.daily.rsync 1> /dev/null

注:第一行是注释,是说明内容,这样能自己记住。
第二行表示在每天早上4点10分的时候,运行 /etc/cron.daily.rsync 下的可执行脚本任务;

配置好后,要重启crond 服务器;

# killall crond 注:杀死crond 服务器的进程;
# ps aux |grep crond 注:查看一下是否被杀死;
# /usr/sbin/crond 注:启动 crond 服务器;
# ps aux |grep crond 注:查看一下是否启动了?
root 3815 0.0 0.0 1860 664 ? S 14:44 0:00 /usr/sbin/crond
root 3819 0.0 0.0 2188 808 pts/1 S+ 14:45 0:00 grep crond

六、FAQ

Q:如何通过ssh进行rsync,而且无须输入密码?

A:可以通过以下几个步骤

1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了。e.g. ssh -l userB serverB。这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

Q:如何通过在不危害安全的情况下通过防火墙使用rsync?

A:解答如下:

这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd 仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防 火墙打开TCP端口22的ssh外发连接就ok了。

Q:我能将更改过或者删除的文件也备份上来吗?

A:当然可 以。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup- 2000-2-13/path/to/some/file.c,这里这个目录需要自己手工建立起来

Q:我需要在防火墙上开放哪些端口以适应rsync?

A:视情况而定。rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:

rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:

Q:我如何通过rsync只复制目录结构,忽略掉文件呢?

A:rsync -av --include '*/' --exclude '*' source-dir dest-dir

Q:为什么我总会出现"Read-only file system"的错误呢?

A:看看是否忘了设"read only = no"了

Q:为什么我会出现'@ERROR: invalid gid'的错误呢?

A:rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = ogroup或者其它

Q:绑定端口873失败是怎么回事?
A:如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用--port参数来改变。

Q:为什么我认证失败?
A:从你的命令行看来:你用的是

> bash$ rsync -a 144.16.251.213::test test
> Password:
> @ERROR: auth failed on module test
>
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.

应该是没有以你的用户名登陆导致的问题,试试rsync -a max@144.16.251.213::test test

Q: 出现以下这个讯息, 是怎么一回事?
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)

A: 这是因为密码设错了, 无法登入成功, 请再检查一下 rsyncd.secrets 中的密码设定, 二端是否一致?

Q: 出现以下这个讯息, 是怎么一回事?

password file must not be other-accessible
continuing without password file
Password:

A: 这表示 rsyncd.secrets 的档案权限属性不对, 应设为 600。请下 chmod 600 rsyncd.secrets

Q: 出现以下这个讯息, 是怎么一回事?

@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)

A: 这通常是您的 rsyncd.conf 中的 path 路径所设的那个目录并不存在所致.请先用 mkdir开设好备份目录.

完!

lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。

在不追求速度时,wget已经工作得很好了,网上的资料也很丰富,但是数据较大,有好几个文件,使用wget需要更新2,3个小时(网速只有8M,而且ftp被限速了)。所以只好找一个可以多线程下载的工具。lftp也是Linux移植过来的,功能非常强大,但是资料比wget要少,尤其是在windwos下的使用。

命令参数

-p 端口号
-u 用户名
-e 在选择后执行命令
以下是mirror 项
-c 断点续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-n 只下载较新的档案
-r 不用递回到目录中
--parallel=n 同时下载 n 个档案(预设一次只下载一个)

部分使用案例

lftp.exe piaoyun.cc(服务器IP) -p 1234(端口) -u 用户名,密码  -e "mirror -c -n -r --parallel=1 --use-pget=5 /piaoyun/cc/(FTP连接后的服务器目录) /cygdrive/e(本地磁盘盘符)/piaoyun/"

e:
cd E:\PiaoYunData\
copy D:\tools\lftp\ftpscript.txt E:\PiaoYunData\ /Y
d:\tools\lftp\lftp -f ftpscript.txt

 

ftpscript.txt中的内容:

lftp ftp站点IP -p 21 -u 用户名,密码
mirror -c -e -n -r --parallel=10 /

exit

lftp.exe的使用疑惑

解决windows下目录访问和多线程下载的问题(确实比大多数windows下的图形工具好用太多)

在windows下,如果要指定目录请使用
/cygdrive/你的盘符/盘符下的目录/

多线程请使用:
--use-pget=线程数

比如完整的命令如下:

lftp ftp站点IP -p 21 -u 用户名,密码 -e "mirror -c -e -n -r --parallel=8 --use-pget=10 /piaoyun/cc /cygdrive/e/RemoteData/"

注:本文所有软件在文章结尾有提供国内网盘的打包下载地址,使用的软件是压缩包内的:lftp-4.5.4.win64-openssl-piaoyun.cc.rar

安装方法:
请把压缩包内bin文件夹内的所有 .dll 文件复制到 C:\Windows 目录下,不复制运行批处理或者lftp.exe的时候会提示dll丢失。

Nwgat LFTP镜脚本(仅限SFTP现在)
我也创建了一个简单的脚本,同时具有镜面和反镜,LGET(小和基本的下载utily很像的wget)和标准lftp的控制台
它看起来像这样

Nwgat LFTP镜脚本:
1)mirrorfrom
2)mirrorto
3)lftp
4)lget
5)quit
请输入您的选择:

脚本可以在这里找到:https://github.com/nwgat/lftp
Windows安装:
下载LFTP:
下载:https://github.com/nwgat/lftp/archive/master.zip
复制:lftpmirror-win.sh和lftpmirror-WIN.BAT在放到leftp.exe的bin文件夹
运行:lftpmirror-WIN.BAT

Linux:
wget https://raw.githubusercontent.com/nwgat/lftp/master/lftpmirror.sh
chmod + X ./lftpmirror.sh
./lftpmirror.sh

本文提到的软件下载地址:【如果无法访问请自行解决爬墙问题】
百度网盘:http://pan.baidu.com/s/1sjExfPj
360云盘:http://yunpan.cn/Qa4bBm3LZIy9v  访问密码 f7d7

http://lftp.yar.ru/
http://nwgat.ninja/lftp-for-windows/
http://nwgat.ninja/lftp-4-4-10-for-windows/

爬墙问题可以参考:goagent

lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。

~/.lftprc

在用lftp访问国内一些ftp服务器时,往往看到的中文是乱码,^_^不用慌,这是由于服务器和本地编码不一致造成的。我们只要在主目录下新建一个文件~/.lftprc或者~/.lftp/rc

并在其中加入以下内容:

debug 3
set ftp:charset GBK
set file:charset UTF-8
#set ftp:passtive-mode no
#alias utf8 " set ftp:charset UTF-8"
#alias gbk " set ftp:charset GBK"

登录ftp服务器

言归正传,我们先来看看怎么登录ftp服务器

lftp ftp://user:password@site:port
lftp user:password@site:port
lftp site -p port -u user,password
lftp site:port -u user,password

上面的几种方式都能正常工作,不过密码都是明文,这样好像不太安全哦。没关系

lftp user@site:port

系统会提示输入password,密码就回显为******了,不过每次都输入这么多,真的好麻烦哦。 如果有类似leapftp的站点管理器就好了,其实lftp早就给我们想好了: 这就是bookmark。后面我们将会看到。

常用命令

在终端运行

man lftp

或登录ftp后输入

help

命令行语法
要看lftp的命令行语法,只要在shell中输入lftp --help
lftp [OPTS]

'lftp'是在 rc 文件执行后 lftp 执行的第一个命令

-f 执行文件中的命令后退出
-c 执行命令后退出
--help 显示帮助信息后退出
--version 显示 lftp 版本后退出

其他的选项同 'open' 命令
-e 在选择后执行命令
-u [,] 使用指定的用户名/口令进行验证
-p 连接指定的端口

就可以看到命令列表

下面我们看一下lftp常用的命令:

ls:显示远端文件列表(!ls 显示本地文件列表)。
cd:切换远端目录(lcd 切换本地目录)。
get:下载远端文件。
mget:下载远端文件(可以用通配符也就是 *)。
pget:使用多个线程来下载远端文件, 预设为五个。
mirror:下载/上传(mirror -R)/同步 整个目录。
put:上传文件。
mput:上传多个文件(支持通配符)。
mv:移动远端文件(远端文件改名)。
rm:删除远端文件。
参数-r,递归删除文件夹
mrm:删除多个远端文件(支持通配符)。
mkdir:建立远端目录。
rmdir:删除远端目录。
pwd:显示目前远端所在目录(lpwd 显示本地目录)。
du:计算远端目录的大小
set net:limit-rate 10000,10000:限制上传下载各为10KB/s
set ftp:charset gbk:设置远程ftp site用gbk编码
!:执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)
lcd:切换本地目录
lpwd:显示本地目录
alias:定义别名
bookmark:设定书签
exit:退出ftp

快捷书签

ftp中的bookmark命令,是将配置写到~/.lftp/bookmarks文件中;我们可以直接修改此文件,快速登陆ftp服务器。

例如添加一行:

echo 'uftp ftp://user:passwd@ftp.ubuntu.org.cn' >> ~/.lftp/bookmarks

lftp的bookmarks文件书写格式为:

别名<空格>ftp://user:passwd@site:port

以后要登陆ubuntu-cn的ftp,只要执行:

lftp uftp

其它客户端:
kftpgrabber:KDE下ftp客户端,支持编码选择。对中文支持较好
gftp:gnome下ftp客户端,目前对中文支持尚不太好,受抱怨颇多。
fireftp:firefox的ftp客户端插件,新版对中文支持较好。
FileZilla:对中文支持较好
CrossFTP:基于Java的稳定ftp客户端和同步工具。优良的中文/Unicode支持。

缘由:
由于一个每天都要将远程的图片数据同步到本地,想到了使用windows的计划任务调用批处理,完成同步工作和更新数据工作,因为批处理在上一个任务没有结束前是不会开始下一个任务的。

使用wget.exe:
wget.exe是一个非常稳定的开源工具,从linux移植过来的。

wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上。它有以下功能和特点:
(1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
(2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
(3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
(4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
(5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的;

用法如下(我将命令的参数加入到了注释中)

rem -o 把记录写到FILE文件中
rem -execute=COMMAND 执行 . wgetrc 格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
rem -passive-ftp 使用被动传输模式 (缺省值).
rem -glob=on/off 打开或关闭文件名的 globbing机制
rem -c 断点续传
rem -r, -recursive 递归下载调用,下载子目录
rem -m, -mirror 表示镜像,等价于 -r -N -l inf -nr
rem -N 比较文件时间戳
rem -nH 不创建IP地址为文件夹的目录名
rem -P 将文件下载到指定目录

wget.exe -o E:\piaoyun\Logs-%date:~0,4%%date:~5,2%%date:~8,2%.txt -c -r -m -N -nH -P E:\piaoyun\ --execute "login=piaoyun" --execute "passwd=piaoyuncc" --passive-ftp --glob=on ftp://piaoyun.cc/piaoyun/*

部分使用案例:
1、wget.exe -o E:\piaoyun\LOG.TXT --execute "login=piaoyun" --execute "passwd=piaoyuncc" --passive-ftp --glob=on -r -m -nH ftp://piaoyun.cc:1234/piaoyun/*
2、wget.exe ftp://piaoyun@piaoyun/auto_LNMP.sh –ftp-password=123456 这是一种方式。
3、wget.exe ftp://piaoyun:123456@piaoyun.cc/auto_LNMP.sh 注意如果密码是123456@321 这种方式就有问题了,只能用第一种方式!
4、wget.exe ftp://192.168.0.88/auto_LNMP.sh –ftp-user=wugk –ftp-password=123456 这种方式也可以!呵呵

延伸阅读:
用wget批量下载远程FTP服务器上的文件及wget命令参数介绍说明

下载站点:【如果无法访问请自行解决爬墙问题】
360云盘:http://yunpan.cn/QazF5KAwLpZt5 访问密码 5145
百度网盘:http://pan.baidu.com/s/1dD5Ye0D

http://users.ugent.be/~bpuype/wget/
http://sourceforge.net/projects/gnuwin32/files/
http://www.gnu.org/software/wget/

爬墙问题可以参考:goagent