技术相关

[转载]批处理简述

 1.综述

  (1)、 “.bat”: 这是微软的第一个批处理文件的后缀名,在几乎所有的Windows 操作系统内都能运行。
  (2)、  “.cmd”: 是为Windows NT 设计的命令行脚本, 为Cmd.exe shell而设计的, 对于COMMAND.COM不具有向后兼容性。
  (3)、目前所知道的.cmd 和 .bat文件的区别是对ERRORLEVEL变量的改变:当Command Extensions (命令行扩展)处于enabled状态时,哪怕是.cmd文件中一个成功执行的命令都可以改变ERRORLEVEL的值,而在.bat 文件中ERRORLEVEL 变量只有在遇到错误的时候才发生改变。
  2.@echo off/echo on
  (1). “echo” 用来在控制台上显示信息。
  (2). “echo.” 用来显示一空行。(注意:echo和右下角的点之间没有空格,如果有空格就变成显示句点了。)
  (3). “echo off”: 在使用了这行命令之后,其他命令都只显示命令的结果,而不显示命令本身。
  (4). “echo on”: 这是默认值,表示显示所有的命令结果和命令行本身。
  (5).“echo”: 当执行echo而不带任何参数的时候,会显示echo的打开或关闭的状态:“ECHO is on” 或者 “ECHO is off”。
  (6). “@”:@ 符号表示不显示本行的命令本身。如果只用echo off,虽然echo off后面的命令不显示出来,只显示命令的结果,但是echo off它自己确被显示出来了,这就是使用@echo off的原因。
  3.SETLOCAL/ENDLOCAL
  (1). SETLOCAL用来控制批处理文件中变量的可见性。就是高级语言常说的局部变量。凡是在SETLOCAL和ENDLOCAL之间的变量都是局部的,以免被其他脚本文件改变变量的值,而没有使用这个标示的都是Global visible(全局变量),很可能被其他文件所改变。下面的例子很好的说明了这一点。
@echo off
setlocal 
set version=1.0
echo the first version is %version%
endlocal
echo the second version is %version%
::The follow is global variable
set version=2.0
echo the third version is %version%   执行这个文件,将输出:
the first version is 1.0
the second version is
the third version is 2.0
  第二个version是全局变量,但是没有定义,所以是空值。再次执行:
the first version is 1.0
the second version is 2.0
the third version is 2.0
 
@echo off
setlocal 
set version=1.0
echo the first version is %version%
endlocal
echo the second version is %version%
::The follow is global variable
set version=5.0
echo the third version is %version%   执行第二个文件:
the first version is 1.0
the second version is 2.0
the third version is 5.0
  再次执行:
the first version is 1.0
the second version is 5.0
the third version is 5.0
 

  由此可见变量的作用域在简单的批处理文件还是很慎重,否则可以造成千变万化的结果,这样这个脚本就很不稳定了。所以,变量作用域很重要,得注意。
  (2). EnableDelayedExpansion. (参考百度:http://baike.baidu.com/view/2923132.htm
  代码
  结果
 
@echo off
setlocal
set var=test & echo show %var%
endlocal
  show
  当解析到%var%是,CMD还没有执行完任何语句,所以系统并不认识这个变量,所以认为变量没有定义,所以显示空值。
 
@echo off
Setlocal ENABLEDELAYEDEXPANSION
set var=test & echo show !var!
endlocal
  show test
  使用了变量延迟扩展,并使用!var!,其实在执行的时候也不认识这个变量,但是这条语句执行完以后,仍然返回去赋值。这种事后处理,就是变量延迟扩展。
 
  For语句看起来写了很多行,其实认为是一条语句。所以如果在没有使用变量延迟扩展的时候,在For语句里的每一行,都只是记忆着系统所记忆的东西。而使用了变量延迟扩展之后,会执行完了整条语句,再“事后处理”给与赋值,然后才显示到控制台。下面的例子很能说明问题。
 
@echo off
setlocal
:: count to 5
set _tst=0
FOR /l %%G in (1,1,5) Do (echo [%_tst%] & set /a _tst+=1)
echo Total = %_tst% [0]
[0]
[0]
[0]
[0]
Total = 5
@echo off
setlocal
:: count to 5
set _tst=0
FOR /l %%G in (1,1,5) Do (echo [!_tst!] & set /a _tst+=1)
echo Total = !_tst! [0]
[1]
[2]
[3]
[4]
Total = 5
     

  在CMD里面,系统使用“^”作为脱字符。使用变量延迟扩展ENABLEDELAYEDEXPANSION之后,脱字符^ 就可以一直产生作用,而不再局限于一个命令行。这样对于处理包含HTML和XML格式的字符的时候,就方便多了。请看下面的例子。
  @echo off
  REM 这个文件会创建World.txt到本地磁盘,文件内容为Hello。
  REM 也就是第二次运行的时候,脱字符没有发挥作用。
SETLOCAL 
Set _html= Hello^>World.txt
Echo %_html%
ENDLOCAL
  @echo off
  REM 这个文件会输出Hello>World.txt,脱字符一直产生作用。
SETLOCAL EnableDelayedExpansion
Set _html= Hello^>World.txt
Echo !_html!
ENDLOCAL
@echo off
  REM 使用变量延迟扩展来处理html语句。
SETLOCAL EnableDelayedExpansion
Set _html=html format: ^<title^>Hello world^</title^>
Echo !_html!
ENDLOCAL
  (3). DISABLEEXTENSIONS.
  值得注意的是,这里的扩展不是扩展名,而是命令的扩展功能,比如 “/F” 参数就是For循环的命令扩展。
  只有使用了命令扩展我们才能执行下面的语句。
  FOR /F "DELIMS=" %%a IN (test.TXT) DO @echo %%a
  否则我们要输出一个文件,只能使用Type test.txt了。命令扩展默认是开启的。
  4.Set
  (1). SET 不带任何参数: 将显示当前用户的所有系统环境变量。(set)
  (2). SET 带一个变量名: 尝试搜索并显示以这个变量名开头的环境变量。(set PROCESSOR就会显示以PROCESSOR开始的变量)
  (3). SET variable=string: 给一个变量赋值。
  (4). SET “”: 使用一对空的双引号,会显示一个不带参数的情况下没显示出来的变量。我这里就显示下面两个奇怪的变量。
  =C:=C:\Users\Lingli
  =E:=E:\Powershell
  使用cd %=C:%还真可以转到C:\Users\Lingli目录下。
  (5). SET “var=”(or SET var=): 删除一个变量。
  (6). SET /A variable=expression: 使用算数运算符来给变量赋值。
  ()                  - 组合
  ! ~ -               - 一元操作符
  * / %               - 算数运算符
  + -                 -算数运算符
  << >>               - 逻辑偏移
  &                   - 位与
  ^                   - 位异或
  |                   - 位或
  = *= /= %= += -=    - 赋值
  &= ^= |= <<= >>=
  (7). SET /P variable=[提示字符]:提示用户输入并把输入的值赋给variable。提示字符可以为空。有时可以使用CHOICE来代替SET /P.
@echo off
setlocal
set /p version=Please enter the QQ version:
echo you will install QQ %version%
endlocal
  (8). 有用的环境变量。
  %CD% - 当前路径名。
  %DATE% - 当前日期。
  %TIME% - 当前时间。
  %RANDOM% - 显示0 到32767之间的一个随机数。你看CMD也是可以获取随机数的。
  5.Choice
  (1). 详细语法:

  CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
  该命令可以提供用户一个选择列表,并使用ERRORLEVEL参数返回用户选择项的序号。第一项对于1,第二项对应 2,依次类推,如果用户按CTRL+C退出而不选择,就返回0。
 
  /C    choices
  /N
  /CS
  /T    timeout
  /D    choice
  /M    text
   用字母列出所提供的选项,默认是"YN",即是和否。
  隐藏选择列表。如果使用这个选项,那么提示的文字里最后写清楚以下。不推荐使用。
  激活大小写敏感。默认是对大小写不敏感。
  选择超时设置。
  超时后的默认选项。
  提示字符。最好把要选择的问题将清楚。
 

  (2). 例子:
@echo off
SETLOCAL
CHOICE /C ABC /M "选择登陆用户:A - 管理员;B 域用户;C注册用户"
IF %errorlevel%==1 goto :Admin 
IF %errorlevel%==2 goto :Domain
IF %errorlevel%==3 goto :Local
goto Exit
 
:Admin
    echo 欢迎管理员
    goto Exit
 
:Domain
    echo 欢迎域用户
    goto Exit
 
:Local
    echo 欢迎注册用户
    goto Exit
 
:Exit
endlocal
  6.Rem and Arguments.
  (1). REM [comment]: 批处理文件的注释符,可以使用“::” 来代替REM。
  (2). 参数。
  %0对应文件名本身,其他分别对应一个参数值,支持255个参数。
  Test.cmd   1   2   3   …   n   …   255
  %0   %1   %2   %3   …   %n   …   %255

  (3). 文件名参数扩展。
  当使用文件名作参数的时候,可以使用如下文件名扩展。下面的例子扩展%1,其实对所有的参数都可以进行类似的扩展。
%~f1 - 扩展%1 为带路径的全名。
%~d1 - 只显示磁盘名称。
%~p1 - 只显示文件路径。
%~n1 - 只显示文件名,不包括后缀名,也不包括路径。
%~x1 - 只显示后缀名。
%~s1 - 变成短文件名,将包含“~”符号。
%~1 - 有时候文件名包含空格是,会对文件名加双引号。这个功能是去掉双引号。
%~a1 - 显示文件的属性。
%~t1 - 显示文件的修改时间。
%~z1 - 显示文件的大小。
 
  上面的扩展是可以组合的:
  %~dp1 - 扩展%1 为磁盘名称和路径名。
  %~nx2 - 扩展%2 为文件名和文件后缀名。
::Test.bat
::Example: test.bat test.bat
@echo off
setlocal
set fn=%~f1
echo %fn%
endlocal
  7.IF 语句
  (1). 详细语法:
File syntax   
IF [NOT] EXIST filename command 
IF [NOT] EXIST filename (command) ELSE (command)
 
String syntax   
IF [/I] [NOT] item1==item2 command 
IF [/I] item1 compare-op item2 command
IF [/I] item1 compare-op item2 (command) ELSE (command)
 
Error Check Syntax
IF [NOT] DEFINED variable command
IF [NOT] ERRORLEVEL number command 
IF CMDEXTVERSION number command
  Key
  /I         : 比较时不考虑文件名大小写,即大小写不敏感。
  compare-op : 逻辑比较
  EQU : equal 等于
  NEQ : not equal 不等于
  LSS : less than 小于
  LEQ : less than or equal小于或等于
  GTR : greater than 大于
  GEQ : greater than or equal大于或等于
  (2). 例子(可以看出If语句也是一条语句)
  IF EXIST filename (del filename) ELSE ( echo The file was not found.)
IF EXIST filename (
del filename
) ELSE ( 
echo The file was not found.
)
  8.For 循环
  (1). 详细语法:
FOR-Files
FOR %%parameter IN (set) DO command 
 
FOR-Files-Rooted at Path   
FOR /R [[drive:]path] %%parameter IN (set) DO command 
 
FOR-Folders
FOR /D %%parameter IN (folder_set) DO command 
 
FOR-List of numbers   
FOR /L %%parameter IN (start,step,end) DO command 
 
FOR-File contents   
FOR /F ["options"] %%parameter IN (filenameset) DO command 
FOR /F ["options"] %%parameter IN ("Text string to process") DO command
 
FOR-Command Results 
       FOR /F ["options"] %%parameter IN ('command to process') DO command
  eol=c           - 行首注释符。如果有这个注释符,这一行不做处理。
  skip=n         - 制定前n行跳过,不处理
  delims=xxx      - 分隔符集合。默认分隔符是空格和Tab。
  tokens=x,y,m-n - 选择哪一块用于循环操作。
  usebackq      - 当文件名有空格需要使用双引号时,使用usebackq把双引号内的东西当文件处理,否则当字符串处理。
  注意:
  在批处理文件中,参数使用%%parameter,而当你拿到命令行使用的时候,使用%parameter,就是一个百分号的区别。同时变量名区分大小写,所以%g和G是不相同的。
  (set) 说明是文件集合,一个文件或多个文件,还可以对文件名使用通配符。
  (2). 例子:
@echo off
setlocal
for %%G in (*.bat *.txt) do echo %%G
endlocal
  9.Net.
  (1). 管理服务: Net start, stop, pause, continue [service]。
  (2). 连接到一个共享文件:Net use。
        NET USE [磁盘名:] \\共享名称[\子目录名] [密码] [/USER:[域名\]用户名]
        NET USE磁盘名:]: /delete
  (3). Net share: 显示本地的所有共享,包括隐藏的共享。
  (4). Net share ShareName: 显示共享的相关信息。
  (5). 创建一个本地共享: NET SHARE sharename=drive:path /REMARK:"text" [/CACHE:Manual | Automatic | No ]
  (6). 修改用户数量限制和标示。
        NET SHARE sharename /USERS:number /REMARK:"text"
        NET SHARE sharename /UNLIMITED /REMARK:"text"
  (7). 删除共享: NET SHARE {sharename | devicename | drive:path} /DELETE
  (8). Net view \\计算机名: 列出远程机器的所有共享。
  (9). Net localgroup: 把一个账户加入一个本地组,如加入管理员组:net localgroup administrators DomainName\UserName /add
  (10). 机器重命名: netdomrenamecomputer 原机器名 /newname:修改后的机器名 /UserD:user /PasswordD:password
  (11). 加入域: net dom join 计算机名/domain:域名 /UserD:域管理员账户 /PasswordD:域管理员密码

WAP手机网站制作,多终端页面导入自适应(主要手机和PC)

<%
htm = "index.html"
wap = "index.wml"
wap2 = "index.htm"
agent=request.ServerVariables("HTTP_USER_AGENT")
Accept = request.ServerVariables("HTTP_ACCEPT")
isWAP = false
     if (Instr(ucase(Accept),ucase("wap")) or  Instr(ucase(Accept),ucase("wml"))) then
      isWAP = true
     else
     brow = left(agent,4)
   if (ucase(brow)=ucase("Noki") or ucase(brow)=ucase("Eric") or ucase(brow)=ucase("R380") or ucase(brow)=ucase("MOT-") or ucase(brow)=ucase("UPG1") or ucase(brow)=ucase("Jing") or ucase(brow)=ucase("Acoo") or ucase(brow)=ucase("Wapt") or ucase(brow)=ucase("QWAP") or ucase(brow)=ucase("m-cr") or ucase(brow)=ucase("MC21") or ucase(brow)=ucase("Your") or ucase(brow)=ucase("YOUR") or ucase(brow)=ucase("w@pS") or ucase(brow)=ucase("Alca") or ucase(brow)=ucase("wapw") or ucase(brow)=ucase("Rain") or ucase(brow)=ucase("Java") or ucase(brow)=ucase("AUR ") or ucase(brow)=ucase("UP.B") or ucase(brow)=ucase("WAPm") or ucase(brow)=ucase("WinW") or ucase(brow)=ucase("WapI") or ucase(brow)=ucase("WAPJ") or ucase(brow)=ucase("WapV") or ucase(brow)=ucase("4thp") or ucase(brow)=ucase("Waps") or ucase(brow)=ucase("Mits") or ucase(brow)=ucase("SIE-") or ucase(brow)=ucase("Aptu") or ucase(brow)=ucase("WmlS") or ucase(brow)=ucase("Wapa")) then
       isWAP = true
    end if
    end if
       isWAP2 = false
     if (isWAP) then
       if (Instr(ucase(Accept),ucase("xhtml"))) then
         isWAP2 = true
     end if
  end if
   if (isWAP2) then
    response.Redirect(wap2)
   elseif (isWAP) then
    response.Redirect(wap)
   else
    response.Redirect(htm)
   end if
%>
<p>本页没有跳转,请手工选择您的线路</p>
<a href="/index.wml">低端手机wap</a><a href="/index.htm">高端手机xhtml</a><a href="/index.html">电脑访问</a>
其中中间用了列举法,列出常见手机的ua,还有一些常用的像op,ucweb,winwap一类的也要加上.
最后因为op有电脑版和手机版,所以如果用op没法进行选择.
Firefox:
接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
OP:
接受:text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
用户代理:Opera/9.63 (Windows NT 5.2; U; Edition IBIS; zh-cn) Presto/2.1.1
IE7:
接受:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
用户代理:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
safari:
接受:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1
winwap:
接受:application/vnd.wap.wmlc, text/vnd.wap.wml, image/vnd.wap.wbmp, image/gif, image/jpeg, application/vnd.wap.wmlscriptc, text/vnd.wap.wmlscript
用户代理:WinWAP/3.2 (3.2.1.25; Win32)
nokia 7610:
接受:application/vnd.wap.wmlc, text/vnd.wap.wml, image/vnd.wap.wbmp, image/gif, image/jpeg, application/vnd.wap.wmlscriptc, text/vnd.wap.wmlscript
用户代理:为空什么也不输出
 

再来个php版的.
	<?php 
$htm = "/index.html";
$wap = "/index.wml";
$wap2 = "/index.htm";
$agent=$_SERVER['HTTP_USER_AGENT'];
$Accept = $_SERVER["HTTP_ACCEPT"];
echo $agent;
$isWAP = false;
     if (substr_count(strtolower($Accept),strtolower("wap")) ||  substr_count(strtolower($Accept),strtolower("wml"))) {
      $isWAP = true;
     }else{
     $brow = substr($agent,0,4);
   if (strtolower($brow)==strtolower("Noki") || strtolower($brow)==strtolower("Eric") || strtolower($brow)==strtolower("R380") || strtolower($brow)==strtolower("MOT-") || strtolower($brow)==strtolower("UPG1") || strtolower($brow)==strtolower("Jing") || strtolower($brow)==strtolower("Acoo") || strtolower($brow)==strtolower("Wapt") || strtolower($brow)==strtolower("QWAP") || strtolower($brow)==strtolower("m-cr") || strtolower($brow)==strtolower("MC21") || strtolower($brow)==strtolower("Your") || strtolower($brow)==strtolower("YOUR") || strtolower($brow)==strtolower("w@pS") || strtolower($brow)==strtolower("Alca") || strtolower($brow)==strtolower("wapw") || strtolower($brow)==strtolower("Rain") || strtolower($brow)==strtolower("Java") || strtolower($brow)==strtolower("AUR ") || strtolower($brow)==strtolower("UP.B") || strtolower($brow)==strtolower("WAPm") || strtolower($brow)==strtolower("WinW") || strtolower($brow)==strtolower("WapI") || strtolower($brow)==strtolower("WAPJ") || strtolower($brow)==strtolower("WapV") || strtolower($brow)==strtolower("4thp") || strtolower($brow)==strtolower("Waps") || strtolower($brow)==strtolower("Mits") || strtolower($brow)==strtolower("SIE-") || strtolower($brow)==strtolower("Aptu") || strtolower($brow)==strtolower("WmlS") || strtolower($brow)==strtolower("Wapa")) {
       $isWAP = true;
}}
       $isWAP2 = false;
     if ($isWAP) {
       if (substr_count(strtolower($Accept),strtolower("xhtml"))) {
         $isWAP2 = true;
}}
   if ($isWAP2) {
    header("location:$wap2");}
   else if ($isWAP) {
     header("location:$wap");}
   else {
    header("location:$htm");
       }
?>
<p>本页没有跳转,请手工选择您的线路</p>
<a href="http://wap.reynaldliu.net/index.wml">低端手机wap</a><a href="http://www.reynaldliu.net/index.htm">高端手机xhtml</a><a href="http://www.reynaldliu.net/index.html">电脑访问</a>
 

这一个是网上搜的jsp版的,因为不会jsp也没有调试环境,不知道通不通得过,asp版和php都是我据这个修改得来.
	<%
     String htm = "/gas/index.html";
     String wap = "/wap/index.wml";
     String wap2 = "/wap2/index.xhtml";
     
     String agent = request.getHeader("user-agent");
     String accep = request.getHeader("accept");
     boolean isWAP = false;
     if (accep.toLowerCase().indexOf("vnd.wap.wml")>0){
      isWAP = true;
     }else{
      String brow = agent.substring(0,4);
      if (
       brow.equals("Noki") ||
       brow.equals("Eric") ||
       brow.equals("R380") ||
       brow.equals("MOT-") ||
       brow.equals("UPG1") ||
       brow.equals("Jing") ||
       brow.equals("Acoo") ||
       brow.equals("Wapt") ||
       brow.equals("QWAP") ||
       brow.equals("m-cr") ||
       brow.equals("MC21") ||
       brow.equals("Your") ||
       brow.equals("YOUR") ||
       brow.equals("w@pS") ||
       brow.equals("Alca") ||
       brow.equals("wapw") ||
       brow.equals("Rain") ||
       brow.equals("Java") ||
       brow.equals("AUR ") ||
       brow.equals("UP.B") ||
       brow.equals("WAPm") ||
       brow.equals("WinW") ||
       brow.equals("WapI") ||
       brow.equals("WAPJ") ||
       brow.equals("WapV") ||
       brow.equals("4thp") ||
       brow.equals("Waps") ||
       brow.equals("Mits") ||
       brow.equals("SIE-") ||
       brow.equals("Aptu") ||
       brow.equals("WmlS") ||
       brow.equals("Wapa")){
       isWAP = true;
      }
     }
     
     boolean isWAP2 = false;
     if (isWAP){
       if (accep.toLowerCase().indexOf("xhtml")>0){
         isWAP2 = true;
       }
     }
   if (isWAP2){
    response.sendRedirect(wap2);
   }else if (isWAP){
    response.sendRedirect(wap);
   }else{
    response.sendRedirect(htm);
   }
%>

Tags: wap网站 , wml网站 , xhtml mobile , wap2.0 , 手机网站

rsyncd3.07版(客户端)常用参数理解


安静模式,不显示任何东西
-q

显示详细错误,用来查看日志状态。在计划任务时应该去掉,加快速度。在cmd窗口手工运行才打开排错。

-v
对数据进行压缩传输
-z
递归模式,表示把文件夹和子文件夹一起传输
-r
指定传输端口,默认是873,服务端改过就要在这设置
--port
显示文件传送进程,百分比等信息,和-v一样,计划任务时应该去掉
--progress
延时删除
--delete-after
最大传输文件,大于这个值的文件不传输,一般是优先更新jpg,html这一类文件。大的如.mdb .flv .rar可以稍后更新
--max-size=2048K
最小输文件,结合上面的分两次传输.可以把大文件小文件分开传.但是注意设置值要交叉一点点。不然会造成正好是那个值的文件不能传送:)正好那个文件里面不是人。
--min-size=2048K
最大删除文件数,最好设一个。防止哪天弄错了。把整个盘删空了。
--max-delete=NUM
删除文件出错时,继续
--ignore-errors
只对文件大小检查,不检查时间
--size-only 
忽略文件修改时间,和上面的意思相对,不可同时使用
--ignore-times
保留传输进程,就理解成断点续传吧
--partial
删除模式,就是在源删除的,那么更新到目标,让目标也删除,注意和remove-source-file区别,这个是表示在源传完后,删除源的。类似于剪切。
--delete
强制删除,当权限不足或IO错误时或文件不为空时,仍然强制删除
--force
强制完全备份传输,不管增量还是存在,一般用于目标上有文件,但是又需要完整备份一次.
--whole-file
--update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
只更新已经存在的文件
--existing              skip creating new files on receiver
跳过更新已经存在的文件
--ignore-existing       skip updating files that already exist on receiver
把更新文件放在最后执行
--delay-updates
不进行压缩的文件表达式,一般要跳过.mdb .gz .zip .rar .flv一类的大文件
--skip-compress=LIST    skip compressing files with a suffix in LIST
设置压缩等级,应该取一个平衡值。压得越大,解压慢,但传输快。如果是在局域网或本机用,就不设了。
--compress-level=NUM    explicitly set compression level
限制带宽,防止带宽被占用完,不终止同步再也没有办法进行远程连服务器了ssh,3389
--bwlimit=KBPS
这两个参数搭配生成更新文件列表,而不进行传输,可以用来做文件比较
--write-batch=FILE
--only-write-batch=FILE
--read-batch=FILE
中文有乱码时用这个开关
--iconv=CONVERT_SPEC

绿色版,全手工配置rsync,无须密码交互,不借助ssh

官网下载最新版的cwrscyn服务端和客户端,全都安装到c:\icw。复制icw目录一份。然后用自己带删除程序删除rscyn服务端和客户端。

全自动安装会有两问题。一是服务不会自动启动,二是在客户端不论如何都需要手工输入密码。因为在windows下没有所谓的chmod 600。而在linux下只需要把密码文件chmod 600改为只有所属人有权限即可。但是在windows下不行。即使你用了password-file=密码文件。还是一样。只需要改用windows下cmd批处理中标准的屏幕输语句和重定向输入即可完成。

关键处:echo rsc|C:\icw\bin\rsync -vzrtopg --ignore-errors  --force --progress --delete  rsc@192.168.1.174::freehost  /cygdrive/d/freehost

格式如:

echo 密码|客户端命令行

而安装服务端则可以用下面的命令

"C:\icw\bin\cygrunsrv" -I g3szsouthRsync -c "/cygdrive/c/icw" -p "/cygdrive/c/icw/bin/rsync.exe" -a "--config rsyncd.conf --daemon --no-detach" -o -t auto -e "CYGWIN=nontsec binmode" -1 "/cygdrive/c/icw/rsyncd-stdin.log" -2 "/cygdrive/c/icw/rsyncd-stderr.log"  -y "tcpip" -f "g3szsouthRsync"

下面来进行全手工配置。

先配置服务端conf文件


use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
pid file = rsyncd.pid
secrets file = /cygdrive/c/icw/password
[freehost]
path = /cygdrive/d/freehost
read only = false
list = no
auth users = rsc
transfer logging = no

加入计划任务并且每天在18:40定时执行任务。这样做不会因为管理员密码修改而导致计划任务无效。如果是手工在图形界面下用控制面板添加的则和当前用户密码关联。一旦改密码就不会执行任务了。

at 18:40 /every:m,t,w,th,f,s,su C:\icw\手工开始同步.cmd

在c:\icw\下建一个password的文本文件。

用户名:密码

形式存放。一行一个。

然后启动服务即可运行了。上面的参数涉及到的对应的修改。

上面方法是针对WINDOWS2003到WINDOWS2003,也适用于LINUX到LINUX   ,LINUX到WINDOWS2003。

网上介绍的无需交互输入密码大多是LINUX下用password-file。和WIN下使用ssh-kengen。对两台服务器生成密钥互相设为信任认证。这样做的麻烦是程序不通用,每两台服务器都需要生成证书。

附一个已经打包好的绿色安装包。不可以修改解压路径。略做修改rscyn.conf和password即可运行了。

[attach=3]
 

net start  g3szsouthRsync

Tags: 服务器同步 , 密码 , 不需 , 无须 , 无需 , cwrscyn , rscyn

罗兰德制造无损迁移IIS(含匿名帐号,ntfs,acl,用户同步) For Win2003

windows下迁移网站确实不如linux下这么方便.
迁移一个两个那是好办.要是迁个虚拟主机.动不动五六百个呢?光是添加用户名密码,绑定域名,配置ntfs权限.每一项都能让人头大.何况要是再来个五六台服务器就三四千了.要是一个一个迁会要命的.

不光是迁移.或者是因为服务器运行久了.慢了,中毒了.本文方法同样适用.要重装系统.

下面这些方法都是尽量用身边最常用的软件,最能就地取材的方法.不借助于第三方,或偏门少见的软件实现.

一.第一步首先搞到你所有用户名和密码.

windows下的密码是搞不到的.存在sam文件中,并且是加密的.开机状态是不可以存取的.破密码的工具也有,可以用lrc,dump一类的工具进行爆破,但是现在我们不是要搞黑客.是自己的服务器.不用这么麻烦.何况就算要黑,跑一个用户的密码也是要跑很久的.
只需要一条命令开始运行打开cmd.exe
net   user   > c:\userlist.txt
net   user最多是三列的会像这样的格式
user1       user2       user3
得到一个所有用户的用户名列表.稍微整理一下,去掉超级管理员,guest等等非网站用户.弄成一列的形式.变成
user1
user2
user3
全选,把它贴到excel中.
这样在A1单元格填的就是user1,选中d1列输入一个数字,拖动填充柄往下拉.会自动自增帮你填好.拉到和用户名一样多就行.
然后在c1列点击fx,等号后输入函数,对d1列的数字进行任意一个tan,sin之类的正,余弦,正,余割都行.会生成一些随机小数位.同样拖动填充柄,往下拉,它会自动帮你填好相对单元格地址引用.

然后,文件,另存为,保存时格式选   CSV(逗号分隔).csv存为userlist.csv
这个文件表现如下
user1,0.3365455
user2,0.5456464
user3,0.2123132

目的就是为了构造

用户名,密码

中间以逗号分隔的列表便于后面调用.这个列表构造方法也很多.不一一例举.上面只是给出其中一种方法.

如果有虚拟管理主机软件如prima,freehost,华众,蓝芒一类.更简单.直接数据库里面导出用户名密码列表即可.

如星外,7i24可以在SQLserver查询分析器执行
select   ftpname,ftppassword,serverlistid   from   FreeHost.FreeHost_Product_Host   where   serverlistid=1   or   serverlistid=2     order   by   serverlistid

serverlistid可以根据实际受控端来控制是否要一起导出.
在查询分析器右键,另存为即可得到一个userlist.csv的文件.


二.导出IIS配置备份

del   iismove.SC0
del   iismove.MD0  
iisback.vbs     /backup   /b   iismove     /e   iismove   /overwrite   /v   0
copy   C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0   iismove.SC0
copy   C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0   iismove.MD0

以上是命令行的实现.图形化操作方法也附一个.

iis管理器中最顶级处,右键,所有任务,配置备份、还原

点创建备份,备份名称随便输入,勾选使用密码加密备份,一定要勾,不勾不能在别的电脑还原。


把C:\WINDOWS\system32\inetsrv\MetaBack中生成的MD0和SCO文件复制到新服务器中的
C:\WINDOWS\system32\inetsrv\MetaBack中。

按上面的方法,恢复还原即可。


三.目标服务器IIS预配置

复制前面生成的userlist.csv和批处理文件放同个目录

md   d:\freehost
for   /f   "tokens=2*   delims== "   %%b   in   ( 'wmic   group   where   name^= "IIS_WPG "   get   SID   /value^|findstr   /i   "sid= " ')   do   (set   WPG=%%b)
echo   y|cacls.exe   d:\freehost   /c   /s:D:(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FR;;;%WPG%)
net   localgroup   freehost   /add
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   md   d:\freehost\%%i\web
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   md   d:\freehost\%%i\db
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   md   d:\freehost\%%i\log
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   net   user   %%i   %%j   /add   /expires:never   /passwordchg:no   /times:all
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   net   localgroup   freehost   /add   %%i
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   net   localgroup   users   /delete   %%i
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   setacl.bat   %%i

1.上面的命令会自动预建立d:\freehost为网站主目录.并只给iis_wpg组只读权限
(用于运行asp.net,php一类的程序.如果只运行asp.可以省去.)
2.增加freehost用户组,把userlist.csv中的用户建立并加入freehost组.这样做是便于管理.对freehost组进行组策略安全限制即可.
3.预建立用户文件星外的目录结构是
d:\freehost
d:\freehost\web
d:\freehost\log
d:\freehost\db
如果是其他的虚拟主机软件按照规则修改上面的路径即可.
prima是域名点号换下划线生成比如www.baidu.com的文件就是baidu_com
d:\baidu_com
d:\baidu_com\htdoc
d:\baidu_com\database
d:\baidu_com\weblog
文件名不一样,稍作改动即可.

最后一行,是为各目录设置权限
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   setacl.bat   %%i内容如下


for   /f   "tokens=2*   delims== "   %%a   in   ( 'wmic   useraccount   where   name^= "%1 "   get   SID   /value^|findstr   /i   "sid= " ')   do   (set   uSID=%%a)
for   /f   "tokens=2*   delims== "   %%b   in   ( 'wmic   group   where   name^= "IIS_WPG "   get   SID   /value^|findstr   /i   "sid= " ')   do   (set   uWPG=%%b)
echo   y|cacls.exe   d:\freehost\%1   /c   /s:D:AI(A;;FR;;;%uSID%)(A;OICIIO;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo   y|cacls.exe   d:\freehost\%1\db   /c   /t   /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo   y|cacls.exe   d:\freehost\%1\log   /c   /t   /s:D:AI(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo   y|cacls.exe   d:\freehost\%1\web   /c   /t   /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)


操作的内容是将外部变量用户名传入使用wmic管理命令查出用户名在本机的sid值.因为sid是唯一的(当然用黑客手段也可以让他不唯一,微软bug),即使是两台服务器上相同的用户名,或者在同一台服务器上建立一个用户名删除再建立相同名称的sid也不一样.所以不论重装系统后还是换过服务器都需要用上面批处理重设ntfs权限.

使用的ntfs权限是ace,sddl格式.
因为权限项较多,说起来复杂就不一一说明.大约意思就是将各个用户主目录隔离开,对web目录允许脚本执行,log,db仅能html.防止webshell跨站.


首先到目标服务器上还原iis配置.自然目标服务器上的iis要安装好,如果原服务器有iisftp也需要把ftp安装好

copy   /y   iismove.SC0   C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0  
copy   /y   iismove.MD0   C:\WINDOWS\system32\inetsrv\MetaBack\iismove.MD0
del   iismove.SC0
del   iismove.MD0  
iisback.vbs     /restore   /b   iismove     /e   iismove     /v   0
进行IIS还原.

注意事项:如果有asp.net,isapi_rewrite重写组件,华盾等基于iisfilter的组件,也须要先安装上.不然会因为找不到这些过滤器,会在事件管理器找到大量的错误iis始终是server   unavailable.

做到这里,目标IIS差不多已经恢复了,打开html已经正常.
但是运行asp   asp.net   一类的程序会被告知401   acl拒绝.因为iis里面的密码没有被同步.

四.最后来做iis匿名访问密码同步.


先导出iis中站点的节点ID编号对照表.

更新W3ID批量表.bat

del     c:\sitelisttemp.txt
iisweb/query> c:\sitelisttemp.txt


rem   更新W3ID批量表.bat
for   /f   "delims=,   tokens=1,2 "   %%i   in   (userlist.CSV)   do   chageuserpass.bat   %%i   %%j


chageuserpass.bat

net   user   %1   %2
type   c:\sitelisttemp.txt|grep   "^%1. "|cut   -d "( "   -f2|cut   -d ") "   -f1> c:\W3IDtemp.txt
set   /p   W3ID= <c:\W3IDtemp.txt
adsutil.vbs   set   %W3ID%/AnonymousUserName   %1
adsutil.vbs   set   %W3ID%/AnonymousUserPass   %2

因为windows下批处理处理字符的功能太弱要嵌套太多for命令.怕大家看得头晕.这里借用了linux两个命令.
grep和cut.去网上找到http://unxutils.sourceforge.net/UnxUtils.zip解压把里面这两个文件复制c:\windows\system32中即可.
假如你实在找不到这两个文件.用windows下for批处理也是可以的.只是略嫌麻烦.


开始运行iisreset   /timout:0
对iis进行重启,然后开始
大功告成了.
http://www.reynaldliu.net

Total: 18Page 3 of 4‹ Prev1234Next ›