2014年7月4日 星期五

SED单行脚本快速参考


以下文章摘自http://sed.sourceforge.net/sed1line_zh-CN.html

-------------------------------------------------------------------------
SED单行脚本快速参考(Unix 流编辑器)                       2005年12月29日

英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)
原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)

整理:Eric Pement  - 电邮:pemente[at]northpark[dot]edu         版本5.5
译者:Joe Hong     - 电邮:hq00e[at]126[dot]com

在以下地址可找到本文档的最新(英文)版本:
   http://sed.sourceforge.net/sed1line.txt
   http://www.pement.org/sed/sed1line.txt

其他语言版本:
  中文          - http://sed.sourceforge.net/sed1line_zh-CN.html
  捷克语        - http://sed.sourceforge.net/sed1line_cz.html
  荷语          - http://sed.sourceforge.net/sed1line_nl.html
  法语          - http://sed.sourceforge.net/sed1line_fr.html
  德语          - http://sed.sourceforge.net/sed1line_de.html

  葡语          - http://sed.sourceforge.net/sed1line_pt-BR.html


文本间隔:
--------

 # 在每一行后面增加一空行
 sed G

 # 将原来的所有空行删除并在每一行后面增加一空行。
 # 这样在输出的文本中每一行后面将有且只有一空行。
 sed '/^$/d;G'

 # 在每一行后面增加两行空行
 sed 'G;G'

 # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
 sed 'n;d'

 # 在匹配式样“regex”的行之前插入一空行
 sed '/regex/{x;p;x;}'

 # 在匹配式样“regex”的行之后插入一空行
 sed '/regex/G'

 # 在匹配式样“regex”的行之前和之后各插入一空行
 sed '/regex/{x;p;x;G;}'

编号:
--------

 # 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
 # (tab,见本文末尾关于'\t'的用法的描述)而不是空格来对齐边缘。
 sed = filename | sed 'N;s/\n/\t/'

 # 对文件中的所有行编号(行号在左,文字右端对齐)。
 sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'

 # 对文件中的所有行编号,但只显示非空白行的行号。
 sed '/./=' filename | sed '/./N; s/\n/ /'

 # 计算行数 (模拟 "wc -l")
 sed -n '$='

文本转换和替代:
--------

 # Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
 sed 's/.$//'                     # 假设所有行以CR/LF结束
 sed 's/^M$//'                    # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
 sed 's/\x0D$//'                  # ssed、gsed 3.02.80,及更高版本

 # Unix环境:转换Unix的新行符(LF)为DOS格式。
 sed "s/$/`echo -e \\\r`/"        # 在ksh下所使用的命令
 sed 's/$'"/`echo \\\r`/"         # 在bash下所使用的命令
 sed "s/$/`echo \\\r`/"           # 在zsh下所使用的命令
 sed 's/$/\r/'                    # gsed 3.02.80 及更高版本

 # DOS环境:转换Unix新行符(LF)为DOS格式。
 sed "s/$//"                      # 方法 1
 sed -n p                         # 方法 2

 # DOS环境:转换DOS新行符(CR/LF)为Unix格式。
 # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的
 #  sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看
 # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
 # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
 sed "s/\r//" infile >outfile     # UnxUtils sed v4.0.7 或更高版本
 tr -d \r outfile        # GNU tr 1.22 或更高版本

 # 将每一行前导的“空白字符”(空格,制表符)删除
 # 使之左对齐
 sed 's/^[ \t]*//'                # 见本文末尾关于'\t'用法的描述

 # 将每一行拖尾的“空白字符”(空格,制表符)删除
 sed 's/[ \t]*$//'                # 见本文末尾关于'\t'用法的描述

 # 将每一行中的前导和拖尾的空白字符删除
 sed 's/^[ \t]*//;s/[ \t]*$//'

 # 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
 sed 's/^/     /'

 # 以79个字符为宽度,将所有文本右对齐
 sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # 78个字符外加最后的一个空格

 # 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
 # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
 # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
 sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # 方法1
 sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # 方法2

 # 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
 sed 's/foo/bar/'                 # 只替换每一行中的第一个“foo”字串
 sed 's/foo/bar/4'                # 只替换每一行中的第四个“foo”字串
 sed 's/foo/bar/g'                # 将每一行中的所有“foo”都换成“bar”
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
 sed 's/\(.*\)foo/\1bar/'            # 替换最后一个“foo”

 # 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
 sed '/baz/s/foo/bar/g'

 # 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
 sed '/baz/!s/foo/bar/g'

 # 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
 sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'  #对多数的sed都有效
 gsed 's/scarlet\|ruby\|puce/red/g'               # 只对GNU sed有效

 # 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
 # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
 sed '1!G;h;$!d'               # 方法1
 sed -n '1!G;h;$p'             # 方法2

 # 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
 sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

 # 将每两行连接成一行(类似“paste”)
 sed '$!N;s/\n/ /'

 # 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
 # 并去掉原来行尾的反斜杠
 sed -e :a -e '/\\$/N; s/\\\n//; ta'

 # 如果当前行以等号开头,将当前行并到上一行末尾
 # 并以单个空格代替原来行头的“=”
 sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

 # 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
 gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # 其他sed

 # 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
 gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'

 # 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
 gsed '0~5G'                      # 只对GNU sed有效
 sed 'n;n;n;n;G;'                 # 其他sed

选择性地显示特定行:
--------

 # 显示文件中的前10行 (模拟“head”的行为)
 sed 10q

 # 显示文件中的第一行 (模拟“head -1”命令)
 sed q

 # 显示文件中的最后10行 (模拟“tail”)
 sed -e :a -e '$q;N;11,$D;ba'

 # 显示文件中的最后2行(模拟“tail -2”命令)
 sed '$!N;$!D'

 # 显示文件中的最后一行(模拟“tail -1”)
 sed '$!d'                        # 方法1
 sed -n '$p'                      # 方法2

 # 显示文件中的倒数第二行
 sed -e '$!{h;d;}' -e x              # 当文件中只有一行时,输入空行
 sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,显示该行
 sed -e '1{$d;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,不输出

 # 只显示匹配正则表达式的行(模拟“grep”)
 sed -n '/regexp/p'               # 方法1
 sed '/regexp/!d'                 # 方法2

 # 只显示“不”匹配正则表达式的行(模拟“grep -v”)
 sed -n '/regexp/!p'              # 方法1,与前面的命令相对应
 sed '/regexp/d'                  # 方法2,类似的语法

 # 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
 sed -n '/regexp/{g;1!p;};h'

 # 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
 sed -n '/regexp/{n;p;}'

 # 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
 # 在行的行号 (类似“grep -A1 -B1”)
 sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

 # 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
 sed '/AAA/!d; /BBB/!d; /CCC/!d'  # 字串的次序不影响结果

 # 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
 sed '/AAA.*BBB.*CCC/!d'

 # 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
 sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # 多数sed
 gsed '/AAA\|BBB\|CCC/!d'                        # 对GNU sed有效

 # 显示包含“AAA”的段落 (段落间以空行分隔)
 # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

 # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

 # 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
 gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # 只对GNU sed有效

 # 显示包含65个或以上字符的行
 sed -n '/^.\{65\}/p'

 # 显示包含65个以下字符的行
 sed -n '/^.\{65\}/!p'            # 方法1,与上面的脚本相对应
 sed '/^.\{65\}/d'                # 方法2,更简便一点的方法

 # 显示部分文本——从包含正则表达式的行开始到最后一行结束
 sed -n '/regexp/,$p'

 # 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
 sed -n '8,12p'                   # 方法1
 sed '8,12!d'                     # 方法2

 # 显示第52行
 sed -n '52p'                     # 方法1
 sed '52!d'                       # 方法2
 sed '52q;d'                      # 方法3, 处理大文件时更有效率

 # 从第3行开始,每7行显示一次    
 gsed -n '3~7p'                   # 只对GNU sed有效
 sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed

 # 显示两个正则表达式之间的文本(包含)
 sed -n '/Iowa/,/Montana/p'       # 区分大小写方式

选择性地删除特定行:
--------

 # 显示通篇文档,除了两个正则表达式之间的内容
 sed '/Iowa/,/Montana/d'

 # 删除文件中相邻的重复行(模拟“uniq”)
 # 只保留重复行中的第一行,其他行删除
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存
 # 大小,或者使用GNU sed。
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

 # 删除除重复行外的所有行(模拟“uniq -d”)
 sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

 # 删除文件中开头的10行
 sed '1,10d'

 # 删除文件中的最后一行
 sed '$d'

 # 删除文件中的最后两行
 sed 'N;$!P;$!D;$d'

 # 删除文件中的最后10行
 sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1
 sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2

 # 删除8的倍数行
 gsed '0~8d'                           # 只对GNU sed有效
 sed 'n;n;n;n;n;n;n;d;'                # 其他sed

 # 删除匹配式样的行
 sed '/pattern/d'                      # 删除含pattern的行。当然pattern
                                       # 可以换成任何有效的正则表达式

 # 删除文件中的所有空行(与“grep '.' ”效果相同)
 sed '/^$/d'                           # 方法1
 sed '/./!d'                           # 方法2

 # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
 # (模拟“cat -s”)
 sed '/./,/^$/!d'        #方法1,删除文件顶部的空行,允许尾部保留一空行
 sed '/^$/N;/\n$/D'      #方法2,允许顶部保留一空行,尾部不留空行

 # 只保留多个相邻空行的前两行。
 sed '/^$/N;/\n$/N;//D'

 # 删除文件顶部的所有空行
 sed '/./,$!d'

 # 删除文件尾部的所有空行
 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # 对所有sed有效
 sed -e :a -e '/^\n*$/N;/\n$/ba'        # 同上,但只对 gsed 3.02.*有效

 # 删除每个段落的最后一行
 sed -n '/^$/{p;h;};/./{x;/./p;}'

特殊应用:
--------

 # 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使
 # 用'echo'命令时可能需要加上 -e 选项。
 sed "s/.`echo \\\b`//g"    # 外层的双括号是必须的(Unix环境)
 sed 's/.^H//g'             # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
 sed 's/.\x08//g'           # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法

 # 提取新闻组或 e-mail 的邮件头
 sed '/^$/q'                # 删除第一行空行后的所有内容

 # 提取新闻组或 e-mail 的正文部分
 sed '1,/^$/d'              # 删除第一行空行之前的所有内容

 # 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
 sed '/^Subject: */!d; s///;q'

 # 从邮件头获得回复地址
 sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

 # 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮
 # 地址的部分剃除。(见上一脚本)
 sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

 # 在每一行开头加上一个尖括号和空格(引用信息)
 sed 's/^/> /'

 # 将每一行开头处的尖括号和空格删除(解除引用)
 sed 's/^> //'

 # 移除大部分的HTML标签(包括跨行标签)
 sed -e :a -e 's/<[^>]*>//g;/
zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat 使用SED:Sed接受一个或多个编辑命令,并且每读入一行后就依次应用这些命令。 当读入第一行输入后,sed对其应用所有的命令,然后将结果输出。接着再读入第二 行输入,对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设 备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多 个文件名作为参数时,这些文件取代标准输入设备成为sed的输入。sed的输出将被 送到标准输出(显示器)。因此: cat filename | sed '10q' # 使用管道输入 sed '10q' filename # 同样效果,但不使用管道输入 sed '10q' filename > newfile # 将输出转移(重定向)到磁盘上 要了解sed命令的使用说明,包括如何通过脚本文件(而非从命令行)来使用这些命 令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者 Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教 程——压缩包的名称是“U-SEDIT2.ZIP”(在许多站点上都找得到)。要发掘sed 的潜力,则必须对“正则表达式”有足够的理解。正则表达式的资料可以看 《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。 Unix系统所提供的手册页(“man”)也会有所帮助(试一下这些命令 “man sed”、“man regexp”,或者看“man ed”中关于正则表达式的部分),但 手册提供的信息比较“抽象”——这也是它一直为人所诟病的。不过,它本来就不 是用来教初学者如何使用sed或正则表达式的教材,而只是为那些熟悉这些工具的人 提供的一些文本参考。 括号语法:前面的例子对sed命令基本上都使用单引号('...')而非双引号 ("...")这是因为sed通常是在Unix平台上使用。单引号下,Unix的shell(命令 解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下 美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替 后引号中的内容。而在“csh”及其衍生的shell中使用感叹号(!)时需要在其前 面加上转义用的反斜杠(就像这样:\!)以保证上面所使用的例子能正常运行 (包括使用单引号的情况下)。DOS版本的Sed则一律使用双引号("...")而不是 引号来圈起命令。 '\t'的用法:为了使本文保持行文简洁,我们在脚本中使用'\t'来表示一个制表 符。但是现在大部分版本的sed还不能识别'\t'的简写方式,因此当在命令行中为 脚本输入制表符时,你应该直接按TAB键来输入制表符而不是输入'\t'。下列的工 具软件都支持'\t'做为一个正则表达式的字元来表示制表符:awk、perl、HHsed、 sedmod以及GNU sed v3.02.80。 不同版本的SED:不同的版本间的sed会有些不同之处,可以想象它们之间在语法上 会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name)或分 支命令(b,t),除非是放在那些的末尾。这篇文档中我们尽量选用了可移植性较高 的语法,以使大多数版本的sed的用户都能使用这些脚本。不过GNU版本的sed允许使 用更简洁的语法。想像一下当读者看到一个很长的命令时的心情: sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d 好消息是GNU sed能让命令更紧凑: sed '/AAA/b;/BBB/b;/CCC/b;d' # 甚至可以写成 sed '/AAA\|BBB\|CCC/b;d' 此外,请注意虽然许多版本的sed接受象“/one/ s/RE1/RE2/”这种在's'前带有空 格的命令,但这些版本中有些却不接受这样的命令:“/one/! s/RE1/RE2/”。这时 只需要把中间的空格去掉就行了。 速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高 命令执行速度时,可以考虑在替换命令(“s/.../.../”)前面加上地址表达式来 提高速度。举例来说: sed 's/foo/bar/g' filename # 标准替换命令 sed '/foo/ s/foo/bar/g' filename # 速度更快 sed '/foo/ s//bar/g' filename # 简写形式 当只需要显示文件的前面的部分或需要删除后面的内容时,可以在脚本中使用“q” 命令(退出命令)。在处理大的文件时,这会节省大量时间。因此: sed -n '45,50p' filename # 显示第45到50行 sed -n '51q;45,50p' filename # 一样,但快得多 如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方,请发电 子邮件给本文档的作者(Eric Pement)。邮件中请记得提供你所使用的sed版本、 该sed所运行的操作系统及对问题的适当描述。本文所指的单行脚本指命令行的长 度在65个字符或65个以下的sed脚本〔译注1〕。本文档的各种脚本是由以下所列作 者所写或提供: Al Aab # 建立了“seders”邮件列表 Edgar Allen # 许多方面 Yiorgos Adamopoulos # 许多方面 Dale Dougherty # 《sed & awk》作者 Carlos Duarte # 《do it with sed》作者 Eric Pement # 本文档的作者 Ken Pizzini # GNU sed v3.02 的作者 S.G. Ravenhall # 去html标签脚本 Greg Ubben # 有诸多贡献并提供了许多帮助 ------------------------------------------------------------------------- 译注1:大部分情况下,sed脚本无论多长都能写成单行的形式(通过`-e'选项和`;' 号)——只要命令解释器支持,所以这里说的单行脚本除了能写成一行还对长度有 所限制。因为这些单行脚本的意义不在于它们是以单行的形式出现。而是让用户能 方便地在命令行中使用这些紧凑的脚本才是其意义所在。

Linux下利用sed在文档的每行首或行尾增加减少字符


在使用Linux时,我们经常会在文档的行首增加或减少字符,但如果文档较大,手动更改比较烦琐,可以利用sed进行批量修改。
在每一行的行首增加一个字符
sed -i 's/\(^\)/#/g' /home/test.txt  #在文档的每行首增加一个#
sed -i 's/\(^.\)/#/g' /home/test.txt  #替换第一个字符
去掉这个#符号
sed -i 's/#/ /g' /home/test.txt

在每一行的行尾增加字符
sed -i 's/\($\)/aaa/g' /home/test.txt
在每一行的行尾加上“aaa”
批量删除行尾字符
sed -i 's/aaa//g' /home/test.txt

2014年6月24日 星期二

Linux 快速安裝 Oracle Client 使用 sqlplus



文章摘自 http://portable.easylife.tw/entry/Linux-Oracle-Client-sqlplus

在 Linux 上大家一定都覺得使用 rpm 是最快的軟體安裝方式,因為工作上的需求,我也曾經胡搞瞎搞把 Oralce Client 裝起來了,最主要要能使用 sqlplus,而如今面臨到了要轉移的問題,我自己試了幾次 rpm 安裝都沒搞定,後來發現更快的安裝方式,也提供給大家參考。
在 Oracle Instant Client 選擇需要的版本,本文以 x86-64 為例子
只需要下載三個檔案
instantclient-basic-linux.x64-11.2.0.3.0.zip
instantclient-sqlplus-linux.x64-11.2.0.3.0.zip
instantclient-sdk-linux.x64-11.2.0.3.0.zip

下載之後在同一個位置 unzip 解壓縮,會將全部的東西解壓縮在 instantclient_11_2 的目錄下,只要還就變數設定好就可以使用。

設定環境變數:


# vi ~/.bash_profile

export ORACLE_HOME=/home/oracle/instantclient_11_2
export TNS_ADMIN=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME:/usr/local/lib:${LD_LIBRARY_PATH}
export SQLPATH=$ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME

基本上就看大家把目錄放在哪裡,只要環境變數設定妥當,這個 Oracle Client 與 sqlplus 就像免安裝版一樣!設定完成之後重新登出在登入套用環境變數,這樣一來執行 sqlplus 應該就沒有問題囉!

2014年6月18日 星期三

Sned Mail 如何用外部信件發信

一般來說當你用command 的方式去寄信,通常是用本機的sendmail去寄,若不想用本機,該如何設定
vim /etc/mail/submit.cf
找到MTAHost
將 D{MTAHost}[127.0.0.1] 改為 D{MTAHost}[10.10.2.10]  在重新啟動 sendmail 
service sendmail restart 
就可以囉,但前提是該主機的sendmail 已經設定好,並允許本機的RELAY 才可以喔


遠端桌面如何登到CONSOLE 的畫面,同站在電腦面前

一般來說,用遠端桌面雖說是同一個登入帳號,比如administrator但若同時間有兩個administratir 登入遠端,其實你會看到兩個畫面是不同的。

有沒有辦法用遠端桌面可以筆看到如VNC的畫面,就是Console 的畫面,而不是另一個畫面

XP:   mstsc /admin 之後的操作就沒改變,進去後就是Console 的畫面

2013年12月6日 星期五

CentOS-6.3安装配置SVN


zhoulf 2013-02-02 原创

安装说明

系统环境:CentOS-6.3
安装方式:yum install (源码安装容易产生版本兼容的问题)
安装软件:系统自动下载SVN软件

检查已安装版本

#检查是否安装了低版本的SVN
[root@localhost /]# rpm -qa subversion
#卸载旧版本SVN
[root@localhost modules]# yum remove subversion

安装SVN

[root@localhost modules]# yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql

确认已安装了svn模块

[root@localhost /]# cd /etc/httpd/modules
[root@localhost modules]# ls | grep svn
mod_authz_svn.so
mod_dav_svn.so

验证安装

检验已经安装的SVN版本信息
[root@localhost modules]# svnserve --version
svnserve,版本 1.6.11 (r934486)
编译于 Jun 23 2012,00:44:03
版权所有 (C) 2000-2009 CollabNet。
Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。
此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。
下列版本库后端(FS) 模块可用:
* fs_base : 模块只能操作BDB版本库。
* fs_fs : 模块与文本文件(FSFS)版本库一起工作。
Cyrus SASL 认证可用。

代码库创建

SVN软件安装完成后还需要建立SVN库
[root@localhost modules]# mkdir -p /opt/svn/repositories
[root@localhost modules]# svnadmin create /opt/svn/repositories
执行上面的命令后,自动建立repzhoulf 2013-02-02 原创ositories库,查看/opt/svn/repositories 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

配置代码库

进入上面生成的文件夹conf下,进行配置
[root@localhost modules]# cd /opt/svn/repositories/conf

用户密码passwd配置

[root@localhost password]# cd /opt/svn/repositories/conf
[root@admin conf]# vi + passwd
修改passwd为以下内容:
[users]
# harry = harryssecret
# sally = sallyssecret
zhoulf=123456

权限控制authz配置

[root@admin conf]# vi + authz
目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容:
#设置[/]代表根目录下所有的资源
[/]
zhoulf=rw

服务svnserve.conf配置

[root@admin conf]# vi + svnserve.conf
追加以下内容:
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/opt/svn/repositories

配置防火墙端口zhoulf 2013-02-02 原创

[root@localhost conf]# vi /etc/sysconfig/iptables
添加以下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
保存后重启防火墙
[root@localhost conf]# service iptables restart

启动SVN

svnserve -d -r /opt/svn/repositories

查看SVN进程

[root@localhost conf]# ps -ef|grep svn|grep -v grep
root     12538     1  0 14:40 ?        00:00:00 svnserve -d -r /opt/svn/repositories

检测SVN 端口

[root@localhost conf]# netstat -ln |grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN

停止重启SVN

[root@localhost password]# killall svnserve    //停止
[root@localhost password]# svnserve -d -r /opt/svn/repositories  // 启动

测试

SVN服务已经启动,使用客户端测试连接。
客户端连接地址:svn://192.168.15.231
用户名/密码: zhoulf/123456
测试创建文件夹等操作。


2007/06/14 16:51
以下是有關SVN備份及同步的工作記事 有關SVN的架設及使用請看這一篇


SVN Server端檔案庫備份


svnadmin hotcopy 原始檔案庫路徑 要備份目標路徑

例如

svnadmin hotcopy D:\SVNRoot\Proj1 E:\SVNBack\Proj1

另外 備份目標必須為空目錄
所以備份前需要先刪除舊有資料 或是建立新資料夾
可以使用windows所提供的批此檔及排程來自動備份
批次檔內容例如下方

@echo off

set SVN_BackUp=E:\SVNBackup
set SVN_ROOT=D:\SVNRoot
set SVN_BackUp_Dir=%SVN_BackUp%\%date:~0,4%%date:~5,2%%date:~8,2%

if not exist %SVN_BackUp% mkdir %SVN_BackUp%
if exist %SVN_BackUp_Dir% goto ALREADY_EXIST_DATE
mkdir %SVN_BackUp_Dir%
for /r %SVN_ROOT% %%D in (.) do @if exist "%%D\conf\svnserve.conf" svnadmin hotcopy %%~fD %SVN_BackUp_Dir%\%%~nD
goto END

:ALREADY_EXIST_DATE
echo 目錄%SVN_BackUp_Dir%已存在

:END

將上方內容存檔到D:\SVNRoot\BackUp.bat
並利用Windows排程 每天晚上10點備份

at 22:00 /every:s,m,t,w,th,f,sa "D:\SVNRoot\BackUp.bat"


不過這一個功能僅能本機端使用
可以注意到svnadmin後面的參數給的都是本機端的路徑
所以處理檔案也都不需要經過SVNService


SNV 檔案庫同步

在新版的SVN提供了SVNSYNC的程式 可以達成兩個檔案庫之間的同步
和上方備份不同的是 他可以經由遠端來運作 因此可以備份到不同電腦上
另外在備份之前不需要刪除舊有資料 因為他是同步
Subversion的官網上雖然有文章介紹如何使用
不過是針對Linux的環境下的說明...
那在Windows雖然很類似 不過要作一些修改

首先 要建立同步目標的檔案庫

svnadmin create DestRepository

然後設定DestRepository的Conf檔跟建立一個新的帳號 (例如"SvnSync")
並在來源檔案庫新增一筆一樣的帳號密碼
並且在hooks的目錄下建立一個新的檔案叫
"pre-revprop-change.bat"
檔案內容使用空白即可運作
不過這一個目標檔案庫有一個限制 他不應該被一般使用者Commit資料上去
也就是說應該只有svnsync可以對他作寫入的動作
應此建議將檔案內容修改為下列所述

@echo off

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

if not '%user%'=='SvnSync' goto ERROR_USERNAME
exit 0
:ERROR_USERNAME
echo Only allow user SvnSync. >&2
exit 1 

此動作是檢查使用者帳號是否為SvnSync (大小寫有分)
如果要不分大小寫 請將此行改為

if /I not '%user%'=='SvnSync' goto ERROR_USERNAME


接下來要對此檔案庫做初始化的動作 讓他知道要跟哪個來源作同步

svnsync init --username SvnSync --password XXX 目標檔案庫位址 來源檔案庫位址

這一個命令的目標跟來來源都是使用位址 因此可以使用本地端或是遠端路徑
例如

svnsync init --username SvnSync --password XXX file:///E:/SVNBackup/DestRepository svn://SVNServer/SourceRepository

注意 本地端位置中斜線的方向跟數量

最後就是同步的動作

svnsync sync --username SvnSync --password XXX 目標檔案庫位址

同樣的 我們可以寫一些批次檔來達成自動化的目的
方式是在來源檔案庫的hooks的目錄下 建立一個新檔案叫做
"post-commit.bat"
他會在來源檔案庫接受每一次的Commit之後啟動 內容為下

@echo off
svnsync sync --non-interactive --username SvnSync --password XXX svn://SVNServer2/DestRepository

這邊是備份到跟來源檔案庫不同的Server上
可以依據每個人不同的需求作更動...

結論是 新的1.4版中的svnsync實在很好用
上半段文章看看就好 使用hotcopy的方式實在是太浪費磁碟空間了
不過前提示 要先把伺服器換成1.4版或以後的版本
並且 目標檔案庫必須是使用1.4版以後的svnadmin所建立的

另外可以發現 寫一些批次檔放進hooks目錄中
可以達成蠻多功能的 有興趣可以網路上搜尋一下文章看看

希望此文章對有使用SVN並架設在Windows上的人有一些幫助

update
如有遇到同步失敗, 或是不同Thread同時要進行同步造成鎖定而錯誤
可使用下列指令解決鎖定

svn propdel svn:sync-lock --revprop -r 0 目標檔案庫位址