最牛B的Linux命令

引言

Shell作为Unix系操作系统当中最有魅力且不可或缺的组件,经过数十载的洗礼不仅没有被淘汰,而且愈加变得成熟稳健,究其原因,大概因为它是个非常稳固的粘合剂,能够把大量功能强大的组件任意配搭,总能很好很快地完成用户的任务。

本文的一些命令很可能看起来是“雕虫小技”,我们只好仰慕一下Shell大牛了,但是有些细节我会稍加发掘加以说明,遇到有趣的地方希望能博您一笑了。

1.以sudo运行上条命令

$ sudo !!

大家应该都知sudo,不解释。但通常出现的情况是,敲完命令执行后报错才发现忘了sudo。这时候,新手用户就会:按上箭头,按左箭头,盯着光标回到开始处,输入sudo,回车;高手用户就蛋定多了,按Ctrl-p,按Ctrl-a,输入sudo,回车。

这里介绍这个是天外飞仙级别的,对,就直接sudo !!。

当然这几种解决方式效果是完全一样的,只是款不一样,嗯,不解释。

两个感叹号其实是bash的一个特性,称为事件引用符(event designators)。!!其实相当于!-1,引用前一条命令,当然也可以!-2,!-50。默认情况下bash会在~/.bash_history 文件内记录用户执行的最近500条命令,history命令可以显示这些命令。

关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History。

2.以HTTP方式共享当前文件夹的文件

$ python -m SimpleHTTPServer

这命令启动了Python的SimpleHTTPServer模块,考虑到Python在绝大多数的Linux发行版当中都默认安装,所以这个命令很可能是最简单的跨平台传文件的方法。

命令执行后将在本机8000端口开放HTTP服务,在其他能访问本机的机器的浏览器打开ttp://ip:8000即打开一个目录列表,点击即可下载。

3.在以普通用户打开的vim当中保存一个root用户文件

:w !sudo tee %

这题目读起来纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会 提示)等编辑好了,保存时候才发现没权限。曲线方法是先保存个临时文件,退出后再sudo cp回去。不过实际上在vim里面可以直接完成这个过程的,命令就是如此。

查阅vim的文档(输入:help :w),会提到命令:w!{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。

tee是一个把stdin保存到文件的小工具。

而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。

所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,好完工。

4.切换回上一个目录

$ cd –

应该不少人都知道这个,横杆-代表上一个目录的路径。

实际上cd -就是cd $OLDPWD的简写,bash的固定变量$OLDPWD总保存着之前一个目录的路径。

相对地,$PWD总保存着当前目录的路径。这些变量在编写shell脚本时候相当有用。

5.替换上一条命令中的一个短语

$ ^foo^bar^

又是另外一个事件引用符(event designator),可以把上一条命令当中的foo替换成bar。

在需要重复运行调试一道长长的命令,需要测试某个参数时候,用这个命令会比较实用;但多数人会首先选择按上箭头提出上道命令,再移动光标去修改某参数,这样更直观,但效率上就不够使用引用符高,而且在脚本中用这个方法可以简化很多。

这道命令的原始样式应该是这样的:

!!:s/foo/bar/

本文一开始介绍过!!,后面的一段大家应该很熟悉,vim、sed的替换操作都是这样的语法。

关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History

6.快速备份一个文件

$ cp filename{,.bak}

这道命令把filename文件拷贝成filename.bak,大家应该在一些比较复杂的安装教程里面见过这样的用法。其原理就在于bash对大 括号的展开操作,filename{,.bak}这一段会被展开成filename filename.bak再传给cp,于是就有了备份的命令了。

大括号在bash里面是一个排列的意义,可以试试这个:

$ echo {a,b,c}{a,b,c}{a,b,c}

将输出三个集合的全排列:

aaa aab aac aba abb abc aca acb acc
baa bab bac bba bbb bbc bca bcb bcc
caa cab cac cba cbb cbc cca ccb ccc
关于shell当中的集合操作,可深入阅读“Set Operations in the Unix Shell”

7.免密码ssh登录主机

$ ssh-copy-id remote-machine

这个命令把当前用户的公钥串写入到远程主机的~/.ssh/authorized_keys内,这样下次使用ssh登录的时候,远程主机就直接根据这串密钥完成身份校验,不再询问密码了。前提是你当前用户有生成了公钥,默认是没有的,先执行ssh-keygen试试吧!

这个命令如果用手工完成,是这样的:

your-machine$ scp ~/.ssh/identity.pub remote-machine:
your-machine$ ssh remote-machine
remote-machine$ cat identity.pub >> ~/.ssh/authorized_keys

如果你想删掉远程主机上的密钥,直接打开authorized_keys,搜索你的用户名,删除那行,即可。

8.抓取Linux桌面的视频
1
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

我们在一些视频网站上看到别人的3D桌面怎么怎么酷的视频,通常就是这么来的,ffmpeg可以直接解码X11的图形,并转换到相应输出格式。

ffmpeg的通常用法是,根据一堆参数,输出一个文件,输出文件通常放最后,下面解析下几个参数:

-f x11grab 指定输入类型。因为x11的缓冲区不是普通的视频文件可以侦测格式,必须指定后ffmpeg才知道如何获得输入。

-s wxga 设置抓取区域的大小。wxga是1366*768的标准说法,也可以换成-s 800×600的写法。

-r 25 设置帧率,即每秒抓取的画面数。

-i :0.0 设置输入源,本地X默认在0.0

-sameq 保持跟输入流一样的图像质量,以用来后期处理。

后记
说Shell是一种编程语言,可能有些尴尬,虽然很多人每天都在用Shell,但从来没见它荣登TIOBE编程语言排行榜之类的,可以 说毫无名分,因为很多用户没意识到它是一种语言,只当做这是一个能够很好完成任务的工具,基本得理所当然,就好像GUI程序的菜单、按钮一样。

掌握Shell,通常能够让任务在数秒钟内完成,这就让Shell跟C、Perl、Python这些语言区别开来,没人否认后者更能胜任更多的任 务,但是他们是在不同的层面上去做,Shell依赖大量的系统组件黏合调用,而后者依赖各种库,各所擅长不同的应用领域,比喻就是,Shell是混凝土, 可以很方便地粘合一些建筑组件而成为稳固的高楼大厦;但同样是粘合剂,粘玻璃窗、粘书报、粘皮鞋,混凝土是绝对不合适的,Shell并不擅长一些细致操 作,比如它连浮点运算都不支持,更别提什么图形运算什么的。但这并不妨碍Shell来帮我们完成很多粗重任务。

Shell的工作方式,大多数入门用户会觉得枯燥难学,而所谓的经典教材也离不开《Advanced Bash-Scripting》、《Bash Guide for Beginners》,但类似本文这样的一些“雕虫小技”因为难登大雅之堂绝不会收录进去。这情况如果象国外一些unix用户比较多的地方会有很好改善, 即使是新手,偶尔看看别人的操作都能“偷师”一手,我编译本系列文章其实也就希望稍微改善一下这个状况。

linux下用flexpaper做像百度文库和豆丁网一样的在线文档浏览

以下安装步骤在debian5上测试通过
安装JRE
http://blog.linuxphp.org/archives/572/
安装基本包

apt-get install openoffice.org-core openoffice.org-java-common xvfb openoffice.org-writer openoffice.org-calc
apt-get install openoffice.org-l10n-zh-cn openoffice.org-l10n-zh-tw python-uno openoffice.org-draw openoffice.org-impress

配置虚拟桌面

Xvfb :1 -screen 0 800x600x24&
export DISPLAY=localhost:1

运行soffice服务

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

文档转为Pdf(支持多种格式)

unoconv -f pdf mrtg.doc

pdf转为swf

pdf2swf -t mrtg.pdf -o mrtg.swf -s flashversion=9

flexpaper播放

wget http://flexpaper.googlecode.com/files/FlexPaper_1.4.5_flash.zip

解压缩后有个index.html是示例,用到的文件是

flexpaper/js/flexpaper_flash.js
flexpaper/FlexPaperViewer.swf

SwfFile参数指定要播放的swf文件路径
问题1
javaldx: Could not find a Java Runtime Environment
如已经配置好JRE还是报错

apt-get install openoffice.org-java-common

问题2
soffice.bin X11 error: Can’t open display

apt-get install xvfb
Xvfb :1 -screen 0 800x600x24&
export DISPLAY=localhost:1

问题3
unoconv: UnoException during conversion: URL seems to be an unsupported one.

apt-get install openoffice.org-writer openoffice.org-draw openoffice.org-impress  python-uno

如果还有问题可能是soffice启动不对,重启下试试
问题4
如果中文乱码

apt-get install openoffice.org-l10n-zh-cn openoffice.org-l10n-zh-tw

仍然不能解决问题,杀死soffice进程,重新启动试试

问题5
unoconv: File could not be loaded by OpenOffice

windows txt文件换行符问题,用程序把"\r\n"替换为"\n"

问题6
Unable to connect or start own listener. Aborting.
使用正确的方法启动soffice如果是soffice -accept=”socket,port=8100;urp;”改为

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

参考
http://www.oschina.net/p/flexpaper
http://hi.baidu.com/lurim/blog/item/7d21f13ea39f22e554e723d8.html
http://rainx.cn/blog/archives/140
http://blog.sina.com.cn/s/blog_502c8cc40100n6zz.html
http://rongjih.blog.163.com/blog/static/33574461201161172331383/
http://www.linux-wiki.cn/index.php/%E6%96%87%E6%A1%A3%E6%A0%BC%E5%BC%8F%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2(doc,txt,pdf%E7%AD%89)
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=491456

jadexo 2011, November 7, 3:50 PM

这个方案只是一个实现方案,以前我也做过尝试。但是要在实际的生产环境中应用,仍然远远不够,在服务器段使用OO来转换可控性差,每次转换就是一个祈祷!前端问题更为突出,因为使用的是第三方的程序,它的设计模式是一次性加载,如果遇到大文件的话,基本前端就挂菜了。以前我试过,测试结果相当悲剧。后来考虑请人来帮忙重新开发一次前端FLASH播放器,后台需要对转换做一个处理!
  • #2 头像 keminar 2011, November 7, 3:39 PM
    和同事测试的
    不配置虚拟桌面和运行soffice服务也可以成功转换文档到pdf
    另外在服务器上手动执行脚本转换成功,网页触发执行和crontab执行都有错,最后在crontab里增加了一个sudo才解决问题。(服务器是ubuntu,测试环境debian没有发现这个问题)

http://blog.linuxphp.org/archives/1391/

linux下类似百度文库开发研究与实战

缘起

由于项目需要开发了类似百度文库和DOCIN类似的Flash播放器读取上传文档的系统,虽然最终技术问题都得以解决,但开发的过程中走了不少弯路,浪费了不少时间,特别是FlexPaper去掉自带的Logo这一步上,前后花了几天才得以解决,郁闷的有点不想在事后整理这个文档。为了让自己更好的记下解决问题的关键点所在,让同样有此需求的开发人员避免浪费时间,少走一些弯路,打起精神整理本次开发过程的技术研究和技术实现过程。

 

基于Linux环境的技术选型

         项目基于Linux环境,如果你的服务器是windows,那么某些部分的技术选型跟本文可能会有出入,最主要的一个过程是把文档统一转成PDF,如果在Windows下可以考虑跳过,因为使用Flash Paper或者Print Flash可以把文档直接转成SWF。但这两者都不支持Linux环境。因此我们采用先把所有文档统一转成PDF,然后再转成SWF的方案。

 

主要技术点和步骤

     基于对Linux环境的支持考虑(当然Windows下也可以采用这种技术选型),团队讨论决定引入openoffice sdk + pdf2swf tool,分两个步骤,先利用openoffice sdk把文档统一转成pdf,然后利用pdf2swf tool把pdf转成swf。

     为了提高系统的反映速度并降低系统的耦合,主业务上传文档和文档转换流程采用异步处理(分开两个应用,降低耦合)、同时采用Concurrent多线程来处理文档转换(可以通过线程数的配置,统分利用cpu资源,提高并发处理速度,提高系统的反应时间),同时可以进一步扩展设计,以支持多台机器同时处理文档转换。

 

主要技术点实现

  1. 1.       Linux(CentOS5.3)下安装OpenOffice及OpenOffice SDK

OpenOffice安装:

1)下载了3.3版本的OpenOffice

2)tar zxvf OOo_3.3.0_Linux_x86-64_install-rpm-wJRE_zh-CN.tar.gz

弯路:解压后,发现目录下有个可执行的setup,大喜,心想肯定执行setup安装了。

执行后抛出错误1

错误信息No X11 DISPLAY variable was set”

心想直接到本机操作是否会不同,结果还是一样的错误。

有大致的信息说要设置DISPLAY系统变量,又设置

export DISPLAY=localhost:0.0

再次执行抛出错误2:

抛出异常Exception in thread “main” java.lang.UnsatisfiedLinkError: /var/tmp/install_28877/usr/java/jre1.6.0_22/lib/amd64/xawt/libmawt.so

按提示给安装相关的图形界面包

yum install libXp

yum install libXtst

yum install libXp-devel

yum install libXau-devel

再次setup,又回到No X11 DISPLAY variable was set报错,我就想了,是不是当时装操作系统时没装上x windows server

也没想太多,搜了google,安装XWindow 

yum  groupinstall “X Window System” 

yum groupinstall “GNOME Desktop Environment” 

yum install nc expect 

yum install freenx 

yum groupinstall chinese-support

不放心,装好后reboot,再次进行setup,还是同样的出错。血压都升高了,心里在想难道要进图形界面才能安装么,但我们服务器原则上不推荐使用图形界面,如果安装的openoffice需要在图形界面下运行,那有点偏移了最初的技术选型目的。看来setup方式在文本界面下已经走不下去了,再次问google去,这次发现了另外一种安装方法。

 

3) cd OOO330_m20_native_packed-1_zh-CN.9567/RPMS/

4)rpm -ivh  *.rpm

5)RPMS/desktop-integration

6)rpm -ivh  openoffice.org3.3-redhat-menus-3.3-*.noarch.rpm

7)/opt/openoffice.org3/program/soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard &

前提:如果你没有安装jdk或者安装后没有把jdk/bin加入到PATH,则会报出找不到jre

vi /etc/profile,加入以下三行

export   JAVA_HOME=/usr/local/jdk1.6.0_17

export   PATH=$JAVA_HOME/bin:$PATH

export   CLASSPATH=$JAVA_HOME/lib/tools.jar:$CLASSPATH

 

8)查看服务是否运行正常

   netstat -ano 可以查看到8100端口被soffice服务占用

   ps aux|grep soffice 查看进程

 

OpenOffice SDK3.3安装:

1)  下载OpenOffice SDK3.3

2)tar zxvf OOo-SDK_3.3.0_Linux_x86-64_install-rpm_en-US.tar.gz

3)cd OOO330_m20_native_packed-1_en-US.9567/RPMS/

4)rpm -vih *.rpm

 

 

2.Linux下安装pdf2swf Tool

中文支持安装:

1)  mkdir –p /usr/share/xpdf

cd /usr/share/xpdf/

2)  下载中文支持及字体库

wget  ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz

 

wget  http://www.nginxs.com/download/font.zip

3) tar zxvf xpdf-chinese-simplified.tar.gz

         unzip font.zip

mv Gbsn00lp.ttf gkai00mp.ttf xpdf-chinese-simplified/CMap/

cd /usr/share/xpdf/xpdf-chinese-simplified

4)vi add-to-xpdfrc

内容如下:

cidToUnicode   Adobe-GB1       /usr/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode

unicodeMap     ISO-2022-CN    /usr/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap

unicodeMap     EUC-CN             /usr/share/xpdf/chinese-simplified/EUC-CN.unicodeMap

unicodeMap     GBK           /usr/share/xpdf/chinese-simplified/GBK.unicodeMap

cMapDir            Adobe-GB1       /usr/share/xpdf/chinese-simplified/CMap

toUnicodeDir                      /usr/share/xpdf/chinese-simplified/CMap

displayCIDFontTT Adobe-GB1 /usr/share/xpdf/chinese-simplified/CMap/gkai00mp.ttf

保存后退出

 

相关Lib包安装:

1)  yum –y install gcc-c++(如果已安装可跳过)

2)  yum install giflib-devel.x86_64

3)  yum install zlib-devel.x86_64

4)  yum install freetype-devel.x86_64

5)  yum install libjpeg-devel.x86_64

 

SwfTool安装:

1)cd /usr/local/

2)wget  http://www.swftools.org/swftools-0.9.1.tar.gz

3)tar zxvf swftools-0.9.1.tar.gz

4)cd swftools-0.9.1

5)./configure

6)make

7)make install

8)测试一下是否可用

pdf2swf -o /path/output.swf -T -z -t -f /path/yourpdffile.pdf -s languagedir=/usr/share/xpdf/xpdf-chinese-simplified -s flashversion=9

小意外:

测试环境意外宕机重起后,运行pdf2swf,抛出错误:

pdf2swf: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory

find了一遍,发现libjpeg.so.8被装到了/usr/local/lib下,这不是默认的/lib/usr/lib目录。问了下google,对于动态库的路径问题有以下三种解决方案

 

动态库的路径问题

为了让执行程序顺利找到动态库,有三种方法:

(1)把库拷贝到/usr/lib/lib目录下。

(2)LD_LIBRARY_PATH环境变量中加上库所在路径。例如动态库libhello.so/home/ting/lib目录下,以bash为例,使用命令:

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib

(3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

本人使用了第2种办法,再次运行pdf2swf正常。

 

 

pdf2swf参数很多,以下参数是经网友翻译后的详细说明:

  • -h , –help                      Print short help message and exit              打印帮助信息
  • -V , –version                Print version info and exit                        打印版本号
  • -o , –output file.swf         Direct output to file.swf. If file.swf contains ‘13568621′ (file13568630.swf), then each page指定输出的swf文件名
  • -p , –pages range             Convert only pages in range with range e.g. 1-20
    or 1,4,6,9-11 or

指定转换的页面范围,使用的页码描述方法与打印机打印文件时候的选页一样

  • -P , –password password       Use password for deciphering the pdf.指定打开pdf的密码
  • -v , –verbose                 Be verbose. Use more than one -v for greater effect.转换时输出详细的内容
  • -z , –zlib                    Use Flash 6 (MX) zlib compression.使用Flash 6的zlib压缩机制
  • -i , –ignore                  Allows pdf2swf to change the draw order of the pdf. This may make the generated允许程序修改pdf的绘制顺序,可能会导致结果与原来有差异
  • -j , –jpegquality quality     Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)设置转换其中的jpeg图片的质量,从0到100,默认值是85。
  • -s , –set param=value         Set a SWF encoder specific parameter. See pdf2swf -s help for more information. 设置SWF转码时候的参数,具体参数可以用pdf2swf -s help获取
  • -w , –samewindow              When converting pdf hyperlinks, don’t make the links open a new window.        设置转换后的swf打开原pdf中的连接时使用相同的窗口
  • -t , –stop                    Insert a stop() command in each page.            在每页结尾添加一个stop()命令
  • -T , –flashversion num        Set Flash Version in the SWF header to num.         设置SWF所使用的flash版本号
  • -F , –fontdir directory       Add directory to the font search path.                    指定字体文件所在路径
  • -b , –defaultviewer           Link a standard viewer to the swf file.             指定默认的swf导航文件,用来翻页、放大缩小等等
  • -l , –defaultloader           Link a standard preloader to the swf file which will be displayed while the main swf is loading.     指定默认的swf加载文件,用来显示加载进程效果
  • -B , –viewer filename         Link viewer filename to the swf file.   指定swf导航文件,作用同-b
  • -L , –preloader filename      Link preloader filename to the swf file.      指定swf加载文件,作用同-l
  • -q , –quiet                   Suppress normal messages. Use -qq to suppress warnings, also. 不打印普通信息,用-qq就不打印警告信息。
  • -S , –shapes                  Don’t use SWF Fonts, but store everything as shape. 不使用字体,所有都转为形状。
  • -f , –fonts                   Store full fonts in SWF. (Don’t reduce to used characters). 在swf中保存全部字体。
  • -G , –flatten                 Remove as many clip layers from file as possible. 在文件中尽量去除影片层,合并它们
  • -I , –info                    Don’t do actual conversion, just display a list of all pages in the PDF. 不做实际转换,仅显示PDF的信息。
  • -Q , –maxtime n               Abort conversion after n seconds. Only available on Unix. 如果运行时间超时则退出。

然后看看-s都可以设置些什么:
PDF Parameters:
PDF device global parameters:
fontdir= a directory with additional fonts 指定字体目录, 与1级参数的-F相若
font= an additional font filename 增加额外的字体文件
pages= the range of pages to convert (example: pages=1-100,210-) 指定页面范围,与1级参数的-p相若
zoom= the resolution (default: 72) 指定分辨率,默认为72dpi
languagedir= Add an xpdf language directory 增加一个xpdf的语言目录,对非西欧字符有用
multiply= Render everything at the resolution 在几倍分辨率下渲染
poly2bitmap Convert graphics to bitmaps 把其中的图形转成点阵
bitmap Convert everything to bitmaps 把所有内容转成点阵(包括字体)

SWF Parameters:

SWF layer options:
jpegsubpixels=<pixels> resolution adjustment for jpeg images (same as jpegdpi, but in pixels) jpeg图片的分辨率
ppmsubpixels=<pixels> resolution adjustment for lossless images (same asppmdpi, but in pixels) 无损图片的分辨率
subpixels=<pixels>     shortcut for setting both jpegsubpixels and ppmsubpixels 快速设置上两个参数
drawonlyshapes           convert everything to shapes (currently broken) 所有都转成图形
ignoredraworder         allow to perform a few optimizations for creating smaller SWFs 允许执行一些小优化
linksopennewwindow   make links open a new browser window 链接打开新窗口
linktarget                  target window name of new links       新链接窗口的名称
linkcolor=<color)        color of links (format: RRGGBBAA)    链接的颜色
linknameurl         Link buttons will be named like the URL they refer to (handy for iterating through links with actionscript) 链接名称与链接URL一致
storeallcharacters      don’t reduce the fonts to used characters in the output file 保存所有的字符字体
enablezlib                switch on zlib compression (also done if flashversion>=7) 使用zlib压缩
bboxvars                 store the bounding box of the SWF file in actionscript variables 在as中保存swf的区域大小
dots                        Take care to handle dots correctly 保存单点显示
reordertags=0/1     (default: 1) perform some tag optimizations 执行某些tag优化
internallinkfunction=<name> when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called 内部链接函数,如果点击一个内部链接,将调用该actionscript函数
externallinkfunction=<name> when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called 外部链接函数,如果点击一个外部链接,将调用该actionscript函数
disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles) 不要将笔画转成多边形
caplinewidth=<width>        the minimum thichness a line needs to have so that capstyles become visible (and are converted)           线条最低转换宽度,比这个细的线条将不转换
insertstop                  put an ActionScript “STOP” tag in every frame 在swf的每个桢中添加stop()函数
protect                     add a “protect” tag to the file, to prevent loadingin the Flash editor 增加protect标签,禁止在flash中加载该swf
flashversion=<version> the SWF fileversion (6) 设置最低swf版本
framerate=<fps>         SWF framerate 设置桢率
minlinewidth=<width> convert horizontal/vertical boxes smaller than thiswidth to lines (0.05)将宽度少于某值的矩形转成线条
simpleviewer     Add next/previous buttons to the SWF 使用简单的导航
animate           insert a showframe tag after each placeobject (animate draw order of PDF files)
jpegquality=<quality> set compression quality of jpeg images 设置jpeg的压缩质量
splinequality=<value> Set the quality of spline convertion to value (0-100, default: 100). 设置样条曲线的转换质量
disablelinks                Disable links. 禁止链接

 

3.文档转成PDF的Java实现

         这篇文档http://blog.zhaojie.me/2010/05/convert-document-to-pdf-via-openoffice.html介绍的很详细,基本上可以照着上面做。虽然是windows下的例子,但在Linux下做稍微改动即可。这里就不贴出代码,列出这部分实现的细节差别:

1)  在Linux下,openoffice默认安装目录到/opt/openoffice,而目录/opt/openoffice.org/basis3.3/program/classes/默认是隐藏的。

在Linux下,所需相关类的路径如下:

/opt/openoffice.org/basis3.3/program/classes/unoil.jar

/opt/openoffice.org/ure/share/java/jurt.jar

/opt/openoffice.org/ure/share/java/juh.jar

/opt/openoffice.org/ure/share/java/bootstrapconnector.jar(按上述文档下载,并上传到这个目录)

2)  如果Eclipse还报找不到import com.sun.star.beans.PropertyValue,那么把/opt/openoffice.org/ure/share/java/ridl.jar也引入。我的Eclipse未报此错误,而我的同事Eclipse却报这个错误。本人猜测可能是同事安装的环境或MAINFEST.MF描述不同引起的,未进一步找出原因。

3)  考虑到多线程应用,重写初始化XCompoentContext对象方法

JAVA代码片段:

[code]

</p>
/**

 * 创建一个XComponentContext对象

 *

 * @return

 * @throws Exception

 */

private static XComponentContext createContext(int port) throws Exception {

    return BootstrapSocketConnector.bootstrap(HXConstants.OOSYSPATH,"localhost",port);

}
<p align="left">
[/code]

新增传入端口参数,可以支持打开多个openoffice,如果线程多个,需要为每个线程提供不同的端口。

 

 

新增传入端口参数,可以支持打开多个openoffice,如果线程多个,需要为每个线程提供不同的端口。

 

 

 

4)  转换类型

输入文档不同,最好选择不同的打印方式,java代码实现

 

Java代码
[code]</div>
<div>

public static String getConvertType(String extension){

if(extension.matches("doc|docs|txt|rtf|html|htm|xml|odt|wps|wpd")){

               return "writer_pdf_Export";

            }

            if(extension.matches("xls|xlsb|xlsx|ods")){

               return "calc_pdf_Export";

            }

            if(extension.matches("ppt|pptx|odp")){

               return "impress_pdf_Export";

            }

            return "writer_pdf_Export";

}

</div>
<div>[/code]

 

4.PDF转成SWF的Java实现

代码片段

 

Java代码
[code]</div>
<div>

/**

     * 将pdf文件转化成swf文件 

     * @param fileName 文件的绝对路径(含文件名和扩展名)

     * @param destPath 目标路径 (目标文件夹,不含文件名)

     * @return -1:源文件不存在,-2:格式不正确,-3:发生异常,0:转化成功;1:无法打开文件(Process.exitValue()) 

     * @author dongbai

     */ 

    public static int convertPdfToSwf(String fileName,String destPath){ 

    if(null != fileName && fileName.length() > 0){

//          String destName = "";

            String fileExt = ""; 

            StringBuffer command = new StringBuffer(); 

            Process pro;

            BufferedReader buffer;

            fileExt = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()).toLowerCase();

            try{ 

                File file = new File(fileName); 

                if(!file.exists()){//判断源文件是否存在  

                    return ERROR_FILE_NOT_EXIST; 

                }else if(!fileExt.equals("pdf")){//判断文件是否是pdf格式的文件                 

                  return ERROR_WRONG_EXT_NAME; 

                } 

                else{ 

                  //" -Q 300"参数只在linux下有效

command.append(HXConstants.PDF2SWF_PATH).append("pdf2swf").append(" -o ").append(destPath).append(" -T -z -t -f ").append(HXConstants.PDF2SWF_PATH.startsWith("/")?" -Q 300 ":"").append(fileName).append(" -s languagedir=").append(HXConstants.LANGDIR).append(" -s flashversion=9"); 

                    pro = Runtime.getRuntime().exec(command.toString()); 

                    buffer = new BufferedReader(new InputStreamReader(pro.getInputStream())); 

&nbsp;

                    while(buffer.readLine()!=null); 

                    int rtstate = pro.waitFor();

                    return rtstate;

                } 

            }catch (Exception e){ 

                System.out.println(e.getMessage());

                return ERROR_HAS_EXCEPTION; 

            }finally{

            command=null;

             pro=null;

            buffer=null;

            }

    }else{

        return ERROR_FILE_NOT_EXIST;

    }

    } 

</div>
<div>[/code]

 

代码片段说明:

(1)其中一些常量,可以自行定义,HXConstants.PDF2SWF_PATHHXConstants.LANGDIR分别定义swftool安装路径、中文支持安装路径,为了移植方便,可以配置在properties配置文件里,如:

oosyspath=C:/Program Files/OpenOffice.org 3/program/

pdf2swf=D:/SWFTools/

langdir=/usr/share/xpdf/xpdf-chinese-simplified

发布到linux环境后,修改配置文件即可。

(2)根据需要,可以追加参数,参考本文pdf2swf Tool参数详细说明。

(3) pro.waitFor()与pro.exitValue()的区别,pro.exitValue可以异步处理,你可以根据需求而定。

 

5.Concurrent线程池实现

1)整体业务描述

   (1)首先前台用户提交文档上传。

   (2)后台异步处理上传文档。

   (3)前台检查后台处理状态,处理完毕显示flexpaper效果,未处理完毕显示其他提示或处于加载中。

2)Concurrent实现任务线程池

   (1)实现抓取待处理的任务,放入BlockingQueue,避免重复抓取;

   (2)实现多线程处理文档,线程从BlockingQueeu取出一个任务,处理完后把对应的文档数据置成处理完成状态。

见博客”一个任务队列的BlockingQueue实现”。

 

6.FlexPaper源码初步说明及改造

1)研究历程

FlexPaper是一套开源系统,用于展示swftool生成的swf,通过参数设置能达到比较好的展示效果,FlexPaper遵循GNU GPL协议。项目地址:

http://code.google.com/p/flexpaper/

源码地址:

http://flexpaper.googlecode.com/svn/trunk/

         如果你不介意FlexPaper播放的时候带有其自带的logo标签,下载trunk下的Example,里面有详细的例子。如果你要对播放器进行一些修改,比如要去掉其自带的logo,那就要对FlexPaper进行重新编译。可以看到trunk下有FlexPaper项目和FlexPaper_SDK4项目,两者的区别主要是Flex SDK版本,前者使用Flex SDK3.5,后者使用Flex SDK4及以上版本,其次FlexPaper_SDK4在我下载时还只有beta版,下载后导入4.0对应的FlexPaper_SDK4.swc编译不能通过,因此当前时间还是选择FlexPaper项目比较稳妥。在Eclipse(安装Flash Builder插件)下通过svn检出项目即可,检出后会自动成了Flex库项目,完成编译后,可以看到在目录bin下编译产生的FlexPaper.swc文件。

提示: 如果在编译过程中报错:1046: 找不到类型,或者它不是编译时常数: Vector

Flex编译器Adobe Flash Player选项选种:使用特定版本(v):10.0.0,而Flex3.5默认的设置是9.0.0

还需要在资源加入local\{local},如果编译还报local错误,那就把local直接拷贝到sdks\3.5.0\frameworks\local下。

 

   弯路1:本人一开始以为直接生成FlexPaperViewer.swf,对检出Flex库项目很纳闷,然后就自己创建Flash web类型的项目,再通过svn检出,又手动把项目下的FlexPaperViewer.mxml设置成默认运行,这样是生成了FlexPaperViewer.swf,但打开FlexPaperViewer.swf发现只有灰色或黑色的背景。在浪费大半天时间后,在同事提醒下才搞明白原来此FlexPaperViewer.mxmlExample项目下直接编译生成的FlexPaperViewer.swf。这该死的命名,对刚接触的人来说是太容易产生联想了。

   弯路2:那就自己写一个FlexPaperViewer.mxml,或者干脆不要取这个名也可以,容易产生混淆。网上找到一个,引入重新编译过的FlexPaper.swc,编译成功,打开后界面也出来了。但在加载指定的SwfFile时一直加载不出来,右上角的菊花一直在转。怀疑是不是自编译的FlexPaper.swc有问题,上官网下载官方的FlexPaper.swc,还是不行……,周末后家里的开发环境又折腾了大半天,中间还下了个flash反编译软件,打算对Example下的FlexPaperView.swf进行反编译,可惜目前大多反编译软件只有反编译成.fla.as,最终反编译也只能作罢。回到正路,终于找到比较完整的FlexPaperViewr.mxml

 

2)  FlexPaperView.mxml的实现

       完整代码:

 

Java代码
[code]</div>
<div>

<?xml version="1.0" encoding="utf-8"?>  

<mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" 

                xmlns:fp="com.devaldi.controls.flexpaper.*" 

                layout="absolute" width="100%" height="100%"   

                applicationComplete="initApp();">  

    <mx:Script>  

        <![CDATA[  

            import mx.controls.Alert;  

            public var _aid = 0;//文档ID  

            [Bindable]  

            public var _Scale:Number = 1;//缩放比例  

            [Bindable]  

            public var _SwfFile:String = "";//SWF文件路径  

            [Bindable]  

            public var _ZoomTransition:String = "easeOut";  

            [Bindable]  

            public var _ZoomTime:Number = 0.6;  

            [Bindable]  

            public var _ZoomInterval:Number = 0.1;  

            [Bindable]  

            public var _FitPageOnLoad:Boolean = false;//加载后适合高度  

            [Bindable]  

            public var _FitWidthOnLoad:Boolean = false;//加载后适合宽度  

            [Bindable]  

            public var _PrintEnabled:Boolean = true;//是否支持打印  

            [Bindable]  

            public var _FullScreenAsMaxWindow:Boolean = false;//是否支付全屏  

            [Bindable]  

            public var _ProgressiveLoading:Boolean = false;//是否延迟加载  

            [Bindable]

            public var _MinZoomSize:Number = 0.3;

            [Bindable]

            public var _MaxZoomSize:Number = 5;

            [Bindable]

            public var _SearchMatchAll:Boolean = false;

            [Bindable]

            public var _ViewModeToolsVisible:Boolean = true;

            [Bindable]

            public var _ZoomToolsVisible:Boolean = true;

            [Bindable]

            public var _NavToolsVisible:Boolean = true;

            [Bindable]

            public var _CursorToolsVisible:Boolean = true;

            [Bindable]

            public var _SearchToolsVisible:Boolean = true;

            [Bindable]  

            public var _localeChain:String = "zh_CN";//语言  

            private var isFocus:Boolean = false;  

            //初始化参数  

            private function initApp():void{  

                var params:Object = Application.application.parameters;  

                _Scale = getNumber(params, "Scale", 1);  

                _SwfFile = getString(params, "SwfFile", "Paper.swf");  

                _ZoomTransition = getString(params, "ZoomTransition", "easeOut");  

                _ZoomTime = getNumber(params, "ZoomTime", 0.6);  

                _ZoomInterval = getNumber(params, "ZoomInterval", 0.1);  

                _FitPageOnLoad = getBoolean(params, "FitPageOnLoad", false);  

                _FitWidthOnLoad = getBoolean(params, "FitWidthOnLoad", false);  

                _PrintEnabled = getBoolean(params, "PrintEnabled", true);  

                _FullScreenAsMaxWindow = getBoolean(params, "FullScreenAsMaxWindow", false);  

                _ProgressiveLoading = getBoolean(params, "ProgressiveLoading", true);

                _MinZoomSize = getNumber(params, "MinZoomSize", 0.3);  

                _MaxZoomSize = getNumber(params, "MaxZoomSize", 5);

                _SearchMatchAll = getBoolean(params, "SearchMatchAll", true);

                _ViewModeToolsVisible = getBoolean(params, "ViewModeToolsVisible", true);

                _ZoomToolsVisible = getBoolean(params, "ZoomToolsVisible", true);

                _NavToolsVisible=getBoolean(params,"NavToolsVisible",true);

                _CursorToolsVisible=getBoolean(params,"_CursorToolsVisible",true);

                _SearchToolsVisible=getBoolean(params,"_SearchToolsVisible",true);

                _localeChain = params["localeChain"];  

                //注册事件监听  

                this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);  

                this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);  

                //开放给外部(javascript)调用  

                ExternalInterface.addCallback("hasFocus", hasFocus);  

                //ExternalInterface.addCallback("focus", focus);  

                ExternalInterface.addCallback("setViewerFocus", setViewerFocus);      

            }  

            private function onMouseOver(event:MouseEvent):void{  

                this.isFocus = true;  

            }  

            private function onMouseOut(event:MouseEvent):void{  

                this.isFocus = false;  

            }  

            public function hasFocus():Boolean{  

                //Alert.show("hasFocus");  

                return isFocus;  

            }  

            public function setViewerFocus(isFocus:Boolean):void{  

                //Alert.show("setViewerFocus");  

                this.paperViewer.setViewerFocus();  

            }  

            /** 

             *  

             * 获取String类型参数 

             * 如果没有,则返回默认值 

             **/ 

            private function getString(params:Object, name:String, def:String):String{  

                if(params[name] != null){  

                    return params[name];  

                }  

                return def;  

            }  

            private function getNumber(params:Object, name:String, def:Number):Number{  

                if(params[name] != null){  

                    return params[name];  

                }  

                return def;  

            }  

            private function getBoolean(params:Object, name:String, def:Boolean):Boolean{  

                //Alert.show("比较:"+name);  

                if(params[name] != null){  

                    return params[name] == "true";  

                }  

                return def;  

            }  

        ]]>  

    </mx:Script>  

    <!–mx:Panel x="165" y="76" width="250" height="200" layout="absolute" title="一个人">  

    <mx:Label x="59" y="37" text="{Scale}" width="88"/>  

    </mx:Panel–>  

    <fp:FlexPaperViewer id="paperViewer" 

                        width="100%"   

                        height="100%"   

                        Scale="{_Scale}"   

                        SwfFile="{_SwfFile}"   

                        ZoomTransition="{_ZoomTransition}"   

                        ZoomTime="{_ZoomTime}"   

                        ZoomInterval="{_ZoomInterval}" 

                        FitPageOnLoad="{_FitPageOnLoad}" 

                        FitWidthOnLoad="{_FitWidthOnLoad}"   

                        FullScreenAsMaxWindow="{_FullScreenAsMaxWindow}" 

                        ProgressiveLoading="{_ProgressiveLoading}"

                        MinZoomSize="{_MinZoomSize}"

                        MaxZoomSize="{_MaxZoomSize}"

                        SearchMatchAll="{_SearchMatchAll}"

                        ViewModeToolsVisible="{_ViewModeToolsVisible}"

                        ZoomToolsVisible="{_ZoomToolsVisible}"

                        NavToolsVisible="{_NavToolsVisible}"

                        CursorToolsVisible="{_CursorToolsVisible}"

                        SearchToolsVisible="{_SearchToolsVisible}"

                        />  

</mx:Application>

</div>
<div>[/code]

 

3)FlexPaper去掉logo实现

右上方的Logo修改:在FlexPaper项目的FlexPaperView.xml做修改,很容易找到;

右下方的Logo修改:在FlexPaper项目的Viewer.as,主要对成员变量_skinImgDo做注释,其中有一行代码addChildAt改成addChildAt (_paperContainer,1);

重新编译后,再次编译FlexPaperView.xml,在FlexPaperView.html传入正确的SwfFile参数,右角的转动菊花终于消失了,看到了想要的效果。

 

 

发布到正式环境问题的暴露及校正

         在布署到正式环境过程中,发现两个问题

1)虽然openoffice通过rpm方式来安装都未出错,而且服务也能正常起来,但在java应用在执行调用createContext(int port)会出现退出线程的情况。查找了各种原因后,最后发现是因为测试环境安装了xwindow的原因,看来图形相关包的支持是必须的,如下:

yum install libXp

yum install libXtst

yum install libXp-devel

yum install libXau-devel

yum  groupinstall “X Window System” 

yum groupinstall “GNOME Desktop Environment” 

yum install nc expect 

yum install freenx 

yum groupinstall chinese-support

2)Linux下openoffice服务需要启动

在linux,安装完openoffice后,需要启动soffice服务:/opt/openoffice.org3/program/soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;”

 -nofirststartwizard & 如没有启动服务,执行文档转换服务会出错。

 

http://truemylife.iteye.com/blog/1162252

Linux find查找文件及grep查找文件内容

Linux 下提供完善的文件及文件内容查找命令,分别介绍如下:

文件查找命令find

find 命令用于查找文件系统中的指定文件,其命令格式为:

find 要查找的路径表达式

例如:

find . -name 1.txt 在当前目录及其子目录下查找文件 “1.txt”;

find /tmp -name 1.txt 在 “/tmp” 目录及其子目录下查找文件“1.txt”。

文件内容查找命令grep

grep 命令用于查找指定的模式匹配,格式为:

grep [命令选项] 要查找的匹配模式 [要查找的文件]

例如:

grep cams test.txt 在 “test.txt” 文件中查找cams 字符串;

grep -r cams /root/cams 在 “/root/cams” 目录及其子目录下的所有文件中,查找cams 字符串;

grep 命令除了能够查找文件外,还能够将任意输出流重定向到grep 进行查找:

ps -ef | grep ora 查找进程名中包含 “ora” 的所有进程信息。

Linux 查看目录大小及文件数量命令

查看当前目录大小:

[root@512m50G /]# du -sh

查看指定目录大小:

[root@512m50G /]#du -sh /var/www/blog

查看当前目录文件总数:

[root@512m50G /]#find . -type f |wc -l

查看指定目录文件总数:

[root@512m50G /]#find /var/www/blog -type f |wc -l

查看当前目录的目录总数:

[root@512m50G /]# find . -type d |wc -l

查看指定目录的目录总数:

[root@512m50G /]# find /var/www/blog -type d |wc -l

Linux下查看用户列表

俺的centos vps上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表,google了一下,找到方便的放:
一般情况下是

cat /etc/passwd 可以查看所有用户的列表
w 可以查看当前活跃的用户列表
cat /etc/group 查看用户组

但是这样出来的结果一大堆,看起来嘿负责,于是继续google
找到个简明的layout命令

cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F”:” ‘{ print $1″|”$3″|”$4 }’|more

 

linux文件和文件夹权限

快餐阅读的年代,继续用简约的几句话来描述。

linux下,每个文件和文件夹都是有权限的,他们分为可读、可写和可执行,默认的权限并不是和window一样:可读+可写+可执行;

linux下用户的对文件的控制是非常严格的,所以文件若需要任何人都可写,必须设置成  可读+可写,可读+可写的数字组合就是4+2=6 (所有人6 组成员6 公共成员6),即设置成0666;

linux下文件的可执行和win不一样,不靠后缀名来区分,因此linux下需要对可执行文件赋予可执行属性数字即为1,可以可读+可写+可执行=4+2+1,那么给三种用户都设置全属性就是 0777;

文件夹的打开即可理解成象文件夹发送了执行命令,所以文件夹没有可执行的属性,其他用户是无法打开的;

重要的来了,大家在ftp下或者在shell中用简单的chmod 0777 dir来对一个文件夹进行修改,记住,<strong>该文件夹下的所有文件不会自动继承0777属性</strong>,这个和你在windows下设置共享文件夹不是一样的效果,很多朋友犯了这样的错误,还理直气壮的说我已经把web根目录属性都设置成了0777,为何我的wordpress后台还无法在线更改。答案很简单:那是因为你所更改的那个php文件依然不是公共可读写属性,即0777;

即使文件夹属性为0777,也并不表示该文件夹下的所有文件就可以随意读写,这些文件依然有他们自身的属性,所以你必须将你需要修改的文件设置成0666;

记住:web根目录不要设置成0777,这有安全隐患。有php文件的目录也最好不要设置成0777.

此日志结束,不懂的在评论中留言,高手也请出山指点!

转自:<a href=”http://www.storyday.com/html/y2009/2411_linux-file-and-folder-permissions.html”>http://www.storyday.com/html/y2009/2411_linux-file-and-folder-permissions.html</a>

linux目录树结构

/ 根目录

├boot/ Linux的内核及系统引导程序所需要的文件目录
│ └grub/ Grub引导器相关的文件

├dev/ 设备文件存储目录,比如声卡、磁盘…
├proc/ 内核与进程镜像

├mnt/ 临时挂载
├media/ 挂载媒体设备

├root/ root用户的$HOME目录
├home/ 普通用户的$HOME目录
│ ├user/
│ └…/

├bin/ 程序命令所在目录 功能和/usr/bin类似
├sbin/ 系统管理员常用指令
├lib/ 系统程序库文件
├etc/ 系统程序和大部分应用程序的全局配置文件
│ ├init.d/ SystemV风格的启动脚本
│ ├rcX.d/ 启动脚本的链接,定义运行级别
│ ├network/ 网络配置文件
│ ├X11/ 图形界面配置文件

├usr/ 系统存放程序的目录 包含很多目录
│ ├bin/ 应用程序
│ ├sbin/ 管理员应用程序
│ ├lib/ 应用程序库文件
│ ├share/ 应用程序资源文件
│ ├src/ 应用程序源代码
│ ├local/
│ │ ├soft/ 用户程序
│ │ └…/ 通常使用单独文件夹
│ ├X11R6/ 图形界面系统

├var/ 动态数据 摆放系统记录文件的地方 这个目录的内容是经常变动的

├temp/ 临时文件
├lost+found/ 摆放系统不正常产生错误时丢失的片段

linode linux vps配置apache伪静态wordpress教程(centos)

刚刚在测试安装wordpress程序后一切正常,但是伪静态实现不了。看来之前apache的伪静态没有配置完善。查找资料及朋友帮忙,终于解决。需要配置如下步骤:

第一.修改apache配置 开启加载(rewrite)重写模块

1. cd /etc/httpd/conf/
2. vi httpd.conf
3. 找到其中的LoadModule rewrite_module modules/mod_rewrite.so
4. 如果没有或者前面带有“#”,则相应的添加此行或者取消注释#
第二,修改AllowOverride属性


Options FollowSymLinks
AllowOverride None 改为All

重启apach.去你的WORDPRESS后台更新固定链接即可。自动会在根目录生成.htaccess文件的。

本文来自: 美国主机评论博客(www.yd631.com) 详细出处参考:http://www.yd631.com/linux-vps-apache-rewrite/

Linux VPS/服务器 网站及数据库自动本地备份并FTP上传备份脚本

从VPS侦探建站之初就一直在重申一定要备份好自己的数据,因为太多的不确定性可能会造成数据库丢失,而且大部分VPS服务商也不可能提供每天备份数据。

原来VPS侦探提供过一个VPS备份方法,只是略微说了一下,可能部分新手会不太好入手。今天VPS侦探分享一个自己的备份脚本。

准备工作:

需要提前在VPS安装好lftp,lftp功能上比较强大,CentOS直接执行:yum install lftp,Debian执行:apt-get install lftp 。

需要在VPS上创建/home/backup/ 目录,在FTP上创建backup目录。

如果VPS上数据库不多的话使用Godaddy的免费空间就可以(10GB空间,300GB流量),只要注册个域名就免费送。
下面将备份脚本进行部分注释:
#!/bin/bash
#Funciont: Backup website and mysql database
#Author: licess
#Website: http://lnmp.org
#IMPORTANT!!!Please Setting the following Values!

######~Set Directory you want to backup~######将下面的目录修改成自己要备份的目录,一般按我的都是在/home/wwwroot/下面所有直接写了需要备份的目录。可以继续再加:Backup_Dir5=你的目录 ,Backup_Dir后面的数字依次递增。如果不足4个,直接删除不需要的就可以,同时修改下面tar zcf 部分。

Backup_Dir1=vpser.net
Backup_Dir2=lnmp.org
Backup_Dir3=licess.org
Backup_Dir4=jungehost.com

######~Set MySQL UserName and password~######设置MySQL的用户名和密码,最好是root,其他用户可能因为权限问题无法导出部分数据库。
MYSQL_UserName=root
MYSQL_PassWord=yourmysqlrootpassword

######~Set MySQL Database you want to backup~######设置要部分的数据库,可以继续再加:Backup_Database_Name5=数据库名,Backup_Database_Name后面的数字依次递增。
Backup_Database_Name1=vpser
Backup_Database_Name2=licess
Backup_Database_Name3=junge
Backup_Database_Name4=vpserorg

######~Set FTP Information~######设置用来存放备份数据的FTP信息
FTP_HostName=184.168.192.43 //FTP服务器的IP或者域名
FTP_UserName=vpsernet //FTP服务器用户名
FTP_PassWord=yourftppassword //FTP服务器用户对应的密码
FTP_BackupDir=backup //备份到FTP上的目录,需要提前创建好。

#Values Setting END!

TodayWWWBackup=www-*-$(date +"%Y%m%d").tar.gz
TodayDBBackup=db-*-$(date +"%Y%m%d").sql
OldWWWBackup=www-*-$(date -d -3day +"%Y%m%d").tar.gz
OldDBBackup=db-*-$(date -d -3day +"%Y%m%d").sql

tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir1 –exclude=soft
tar zcf /home/backup/www-$Backup_Dir2-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir2
tar zcf /home/backup/www-$Backup_Dir3-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir3 –exclude=test
tar zcf /home/backup/www-$Backup_Dir4-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir4

###上面为备份网站文件数据,因为我的网站比较零散,而且网站目录下面有些目录属于临时目录并不需要备份,所以可以在上面加上–exclude=不备份的目录。如果在前面加了Backup_Dir5=yourdir,则再加tar zcf /home/backup/www-$Backup_Dir5-$(date +"%Y%m%d").tar.gz -C
/home/wwwroot/ $Backup_Dir5 。如果多余则删除多余行。

/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name3 > /home/backup/db-$Backup_Database_Name3-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name4 > /home/backup/db-$Backup_Database_Name4-$(date +"%Y%m%d").sql

###上面为备份MySQL数据库,如果在前面加了Backup_Database_Name5=yourdatabasename,则再加/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name5 > /home/backup/db-$Backup_Database_Name5-$(date +"%Y%m%d").sql 。如果多余则删除多余行。

rm $OldWWWBackup
rm $OldDBBackup
###删除3天前的备份###

cd /home/backup/

###下面为自动上传部分,不得不说lftp很强大,抛弃ftp吧####
lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF cd $FTP_BackupDir mrm $OldWWWBackup mrm $OldDBBackup mput $TodayWWWBackup mput $TodayDBBackup bye EOF 脚本下载地址:http://soft.vpser.net/lnmp/backup.sh 下载脚本,将脚本放到/root/ 下面,按上面的注释修改脚本中的参数,并保存,如果不熟悉vi或者nano编辑器,可以用winscp,执行:chmod +x /root/backup.sh 为脚本添加执行权限,执行:crontab -e 添加定时执行 在crontab中加入:0 3 * * * /root/backup.sh 凌晨3点自动执行/root/bakcup.sh 脚本,备份vps上的数据并上传到FTP上。 如果在使用过程中有任何问题请直接留言,或到VPS论坛发贴。原创文章,禁止转载! >>转载请注明出处:VPS侦探 本文链接地址:http://www.vpser.net/security/linux-autobackup-ftp.html