qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

RedHat6.5网卡问题总结

 问题描述:准备用RedHat6.5安装Oracle 12c RAC,系统环境准备好后发现,新版本的RedHat网卡配置跟以前不大一样,总结问题与解决方法如下:
  1、找不到eth0文件
  在使用RedHat6.5,新装好的系统,发现没有eth0网卡,默认的第一个网卡是Auto-eth0
[root@rac01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-Auto_eth0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=10.10.10.110
PREFIX=24
GATEWAY=10.10.10.111
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=eth0
UUID=86d44060-4579-48cc-b85b-219a206ca37c
ONBOOT=yes
HWADDR=00:50:56:95:09:76
LAST_CONNECT=1411004329
  解决方法:
  直接更名ifcfg-Auto_eth0文件为eth0,重启网卡后会发现,网卡名已经变为eth0
  [root@rac01 ~]# service network restart
  Bringing up loopback interface:                            [  OK  ]
  Bringing up interface eth0:  Active connection state: activated
  2、ifconfig 发现网卡服务名并未更改
[root@rac01 ~]# ifconfig
Auto_eth0 Link encap:Ethernet  HWaddr 00:50:56:95:09:76
inet addr:10.10.10.110  Bcast:10.10.10.111 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe95:976/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:484 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40095 (39.1 KiB)  TX bytes:6271 (6.1 KiB)
  解决方法:
  每次更改RedHat的网卡信息,RedHat会自动的将网卡的MAC地址和对应的网卡服务名关系记录在/etc/udev/rules.d/70-persistent-net.rules中,修改里面的对应服务名即可
[root@rac01 ~]# vim /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:1e:f6:ad", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
修改完成后需重启一下系统,再次查看网卡服务名已经更改
[root@rac01 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:95:09:76
inet addr:10.109.67.81  Bcast:10.109.67.255  Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe95:976/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:985 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:74395 (72.6 KiB)  TX bytes:6527 (6.3 KiB)
  3、网卡eth0被删除后,新加的网卡成了eth1,如何让从eth0开始
[root@rac01 ~]# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:50:56:95:09:76
inet addr:10.10.10.110 Bcast:10.10.10.111  Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe95:976/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:830 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63700 (62.2 KiB)  TX bytes:6259 (6.1 KiB)
eth2      Link encap:Ethernet  HWaddr 00:0C:29:1E:F6:B7
inet addr:10.10.10.120  Bcast:10.10.10.111Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe1e:f6b7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:777 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:54938 (53.6 KiB)  TX bytes:746 (746.0 b)
  解决方法:
  同2问题类似,即可以手动的修改70-persistent-net.rules文件,将对应的MAC地址与网卡序号改成想要的,也可以直接删除该文件,重启系统后,RedHat会自动的创建该文件,并从0开始计数。
  删除文件,重启系统
  [root@rac01 ~]# mv /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/7
  0-persistent-net.rules.bak
  [root@rac01 ~]# reboot
  再次查看,会发现已经从eht0开始
[root@rac01 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:95:09:76
inet addr:10.109.67.81  Bcast:10.109.67.255  Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe95:976/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:206 errors:0 dropped:0 overruns:0 frame:0
TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19282 (18.8 KiB)  TX bytes:7215 (7.0 KiB)
eth1      Link encap:Ethernet  HWaddr 00:0C:29:1E:F6:B7
inet addr:10.109.67.83  Bcast:10.109.67.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe1e:f6b7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:131 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8736 (8.5 KiB)  TX bytes:746 (746.0 b)
 4、每次重启网卡,总是提示
  Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/9
  此时网卡也可以正常通信,这个是因为RedHat自己开发的NetworkManager管理工具和/etc/sysconfig/network-scripts/ifcfg-ethx配置不同步造成的。
  解决方法:
  要消除这个提示,请关闭NetworkManager服务即可:
[root@rac01 ~]# service network restart
Shutting down loopback interface:                        [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Active connection state: activated
Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/2   [  OK  ]
Bringing up interface eth1:  Active connection state: activated
Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/3   [  OK  ]
  关闭NetworkManager服务
  [root@rac01 ~]# service NetworkManager stop
  Stopping NetworkManager daemon:                            [  OK  ]
  再次重启网卡
  [root@rac01 ~]# service network restart
  Shutting down loopback interface:                     [  OK  ]
  Bringing up loopback interface:                          [  OK  ]
  Bringing up interface eth0:                                [  OK  ]
  Bringing up interface eth1:                                [  OK  ]
  5、重启网卡出现提示:
  Bringing up interface eth0:  Determining if ip address 10.109.67.81 is already in use for device eth0...
  [  OK  ]
  Bringing up interface eth1:  Determining if ip address 10.109.67.83 is already in use for device eth1...
  [  OK  ]
  该警告一般是由于网卡解析arp协议导致的,可在网卡的配置文件中加入ARPCHECK=NO参数来屏蔽该检查
[root@rac01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=10.109.67.81
PREFIX=24
GATEWAY=10.109.67.254
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=eth0
UUID=86d44060-4579-48cc-b85b-219a206ca37c
ONBOOT=yes
HWADDR=00:50:56:95:09:76
LAST_CONNECT=1411004329
ARPCHECK=no
  再次启动网卡,一切正常
  [root@rac01 ~]# service network restart
  Shutting down interface eth0:                              [  OK  ]
  Shutting down interface eth1:                              [  OK  ]
  Shutting down loopback interface:                          [  OK  ]
  Bringing up loopback interface:                            [  OK  ]
  Bringing up interface eth0:                                [  OK  ]
  Bringing up interface eth1:                                [  OK  ]

posted @ 2014-12-03 13:32 顺其自然EVO 阅读(256) | 评论 (0)编辑 收藏

Linux安装FTP服务

ftp服务器
  1、  在Linux和其他机器之间共享文件(在linux下安装ftp)
  2、  具体安装步骤:
  a) 首先查看我的Redhat5上是否已经安装
  rpm -qa|grep vsftpd
  b) 查看服务的运行状态;
  Service iptables status
  c) 安装. 如果没有安装话,就要选择一种方式安装
  i. 可以到官方网站去下载
  也可以用光盘安装,RedHat 5的安盘里自带的,所以我选择光盘安装
  ii.   (1)先把光盘                  挂载到系统上:
  mount /dev/cdrom /mnt
  这样光盘的内容就被挂载到/mnt的设备上,现在可以通过/mnt访问光盘上的内容了
  iii.   .进入光盘,查找安装包,cd /mnt/Packages
  iv.   4.找到安装包vsftp-0.17-17.i386.rpm
  v.   5.安装程序,rpm -ivh vsftp-0.17-17.i386.rpm
  vi.   再rpm -qa| grep vsftpd检测是否安装(出现rpm -ivh vsftp-0.17-17.i386.rpm表示已经安装完成)
  3、  ftp服务的启动和关闭命令为:service vsftpd strat/stop/restart
  4、  默认的ftp服务器命令:
  a)        启动:service vsftpd start(其中vsftpd的最后面的那个d代表是在后台进行的进程)
  b)        登录:ftp localhost
  c)        退出:bye
  5、  Linux查询ip(ifconfig)
  6、  Vmware在安装之后会有三个连接,两个是虚拟的(也是windows用的),虚拟的那一块网卡也是虚拟的,只要把这个网卡放在,其中的任何一个网段,就可以通了。
  7、  在windows下ping linux如果linux下安装了防火墙那么是ping不能的。在默认情况下,linux是安装防火墙的,防火墙也会阻止ftp服务器
  解决办法是,打开端口或者关闭防火墙
  8、  关闭防火墙:service iptables stop
  9、  当不知道允许不允许,可以看ftp主要配置文件:
  /etc/vsftpd下面vsftpd.conf
  在linux下面大部分都有一个配置文件。
  10、             VsFtp的配置文件
  a)        /etc/vsftpd/vsftpd.conf----------主配置文件
  b)        /etc/rc.d/init.d/vsftpd ----------启动脚本
  c)        /etc/pam.d/vsftpd    ----------- PAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)
  d)        /etc/vsftpd/ftpusers-------------禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。
  e)        /etc/vsftpd/user_list-------------禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。
  f)         /var/ftp -----------------------------匿名用户主目录;本地用户主目录为:/home/用户主目录,即登录后进入自己家目录
  g)        /var/ftp/pub------------------------匿名用户的下载目录,此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后无法删除)
  h)   /etc/logrotate.d/vsftpd.log--- Vsftpd的日志文件
 11、下面对主要的配置文件进行介绍:
#Example config file /etc/vsftpd/vsftpd.conf
# Thedefault compiled in settings are fairly paranoid. This sample file
#loosens things up a bit, to make the ftp daemon more usable.
#Please see vsftpd.conf.5 forall compiled in defaults.
# READTHIS: This example file is NOT an exhaustive list of vsftpd options.
#Please read the vsftpd.conf.5 manualpage to get a full idea of vsftpd's
#capabilities.
#Allow anonymous FTP  (Beware - allowed by default if you comment this out).
anonymous_enable=YES ( 是否允许 匿名登录FTP 服务器,默认设置为YES 允许,即用户可使用用户名ftp 或anonymous 进行ftp登录,口令为用户的E-mail 地址。如不允许匿名访问去掉前面#并设置为NO )
#Uncomment this to allow local users to log in.
local_enable=YES (是否允许本地用户 ( 即 linux 系统中的用户帐号) 登录FTP服务器,默认设置为YES允许, 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub ;若只允许匿名用户访问,前面加上#,可 阻止本地用户访问FTP 服务器。)
#Uncomment this to enable any form of FTP write command.
write_enable=YES  ( 是否允许本地用户对 FTP 服务器文件具有写权限 , 默认设置为 YES 允许 )
#Default umask for local users is 077. You may wish to change this to 022,
# ifyour users expect that (022 is used by most other ftpd's)
# local_umask=022 (或其它值,设置本地用户的文件掩码 为缺省022,也可根据个人喜好将其设置为其他值,默认值为077)
#Uncomment this to allow the anonymous FTP user to upload files. This only
# hasan effect if the above global write enable is activated. Also, you will
#obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES ( 是否允许匿名用户上传文件 , 须将 write_enable=YES , 默认设置为 YES 允许 )
#Uncomment this if you want the anonymous FTP user to be able to create
# newdirectories.
#anon_mkdir_write_enable=YES   ( 是否允许匿名用户创建新文件夹 , 默认设置为 YES 允许 )
#Activate directory messages - messages given to remote users when they
# gointo a certain directory.
#dirmessage_enable=YES ( 是否激活目录欢迎信息功能 , 当用户用 CMD模式首次访问服务器上某个目录时 ,FTP 服务器将显示欢迎信息 , 默认情况下 , 欢迎信息是通过 该 目录下的 .message 文件获得的,此文件保存自定义的欢迎信息,由用户自己建立)
#Activate logging of uploads/downloads.
xferlog_enable=YES ( 默认值为 NO 如果启用此选项,系统将会维护记录服务器上传和下载情况的日志文件,默认情况该日志文件为/var/log/vsftpd.log, 也可以通过下面的 xferlog_file 选项对其进行设定。)
# Makesure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES ( 设定 FTP 服务器将启用 FTP 数据端口的连接请求 ,ftp-data 数据传输 ,21 为连接控制端口 )
# Ifyou want, you can arrange for uploaded anonymous files to be owned by
# adifferent user. Note! Using "root" for uploaded files is not
#recommended!-注意,不推荐使用 root 用户上传文件
#chown_uploads=YES ( 设定是否允许 改变 上传文件的属主 , 与下面一个设定项配合使用 )
#chown_username=whoeve r ( 设置想要改变的上传文件的属主 , 如果需要 , 则输入一个系统用户名 , 例如可以把上传的文件都改成 root 属主。whoever :任何人)
# Youmay override where the log file goes if you like. The default is shown
#below.
#xferlog_file=/var/log/vsftpd.log ( 设定系统维护记录FTP 服务器上传和下载情况的日志文件,/var/log/vsftpd.log 是默认的,也可以另设其它)
# Ifyou want, you can have your log file in standard ftpd xferlog format
#xferlog_std_format=YES ( 如果启用此选项 , 传输日志文件将以标准 xferlog 的格式书写,该格式的日志文件默认为/var/log/xferlog,也可以通过xferlog_file 选项对其进行设定,默认值为NO)
#dual_log_enable ( 如果添加并启用此选项,将生成两个相似的日志文件,默认在/var/log/xferlog和/var/log/vsftpd.log 目录下。前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd 类型的日志)
#syslog_enable ( 如果添加并启用此选项,则原本应该输出到/var/log/vsftpd.log 中的日志,将输出到系统日志中)
# Youmay change the default value for timing out an idle session.
#idle_session_timeout=600 (设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒,即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒,可以根据实际情况对该值进行修改)
# Youmay change the default value for timing out a data connection.
#data_connection_timeout=120 ( 设置数据连接超时时间 , 该语句表示数据连接超时时间为 120 秒 , 可根据实际情况对其个修改 )
# Itis recommended that you define on your system a unique user which the
# ftpserver can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure ( 运行 vsftpd 需要的非特权系统用户,缺省是nobody )
#Enable this and the server will recognise asynchronous ABOR requests. Not
#recommended for security (the code is non-trivial). Not enabling it,
#however, may confuse older FTP clients.
#async_abor_enable=YES ( 如果 FTPclient 会下达“async ABOR ”这个指令时,这个设定才需要启用,而一般此设定并不安全,所以通常将其取消)
# Bydefault the server will pretend to allow ASCII mode but in fact ignore
# therequest. Turn on the below options to have the server actually do ASCII
#mangling on files when in ASCII mode.
#Beware that on some FTP servers, ASCII support allows a denial of service
#attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
#predicted this attack and has always been safe, reporting the size of the
# rawfile.
#ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES ( 大多数 FTP 服务器都选择用 ASCII 方式传输数据 , 将 # 去掉就能实现用 ASCII 方式上传和下载文件 )
#ascii_download_enable=YES ( 将 # 去掉就能实现用 ASCII 方式下载文件 )
# Youmay fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service. (将#去掉可设置登录FTP服务器时显示的欢迎信息,可以修改=后的欢迎信息内容。另外如在需要设置更改目录欢迎信息的目录下创建名为 .message 的文件,并写入欢迎信息保存后,在进入到此目录会显示自定义欢迎信息 )
# Youmay specify a file of disallowed anonymous e-mail addresses. Apparently
#useful for combatting certain DoS attacks.
#deny_email_enable=YES ( 可将某些特殊的 email address 抵挡住。如果以anonymous 登录服务器时,会要求输入密码,也就是您的email address, 如果很讨厌某些email address ,就可以使用此设定来取消他的登录权限,但必须与下面的设置项配合 )
#(default follows)
#banned_email_file=/etc/vsftpd/banned_emails (当上面的 deny_email_enable=YES 时,可以利用这个设定项来规定那个email address 不可登录vsftpd 服务器,此文件需用户自己创建,一行一个email address 即可! )
# Youmay specify an explicit list of local users to chroot() to their home
#directory. If chroot_local_user is YES, then this list becomes a list of
#users to NOT chroot().
#chroot_list_enable=YES ( 设置为 NO 时,用户登录FTP 服务器后具有访问自己目录以外的其他文件的权限, 设置为 YES 时 , 用户被锁定在自己的 home 目录中,vsftpd 将在下面 chroot_list_file 选项值的位置寻找 chroot_list 文件,此文件需用户建立, 再将需锁定在自己home 目录的用户列入其中,每行一个用户)
#(default follows)
#chroot_list_file=/etc/vsftpd/chroot_list ( 此文件需自己建立 , 被列入此文件的用户 , 在登录后将不能切换到自己目录以外的其他目录 , 由 FTP 服务器自动地 chrooted 到用户自己的home 目录下,使得 chroot_list 文件中的用户不能随意转到其他用户的FTP home 目录下,从而有利于FTP 服务器的安全管理和隐私保护)
# Youmay activate the "-R" option to the builtin ls. This is disabled by
#default to avoid remote users being able to cause excessive I/O on large
#sites. However, some broken FTP clients such as "ncftp" and"mirror" assume
# thepresence of the "-R" option, so there is a strong case for enablingit.
#ls_recurse_enable=YES ( 是否允许递归查询 , 大型站点的 FTP 服务器启用此项可以方便远程用户查询 )
# When"listen" directive is enabled, vsftpd runs in standalone mode and
#listens on IPv4 sockets. This directive cannot be used in conjunction
# withthe listen_ipv6 directive.
listen=YES ( 如果设置为 YES , 则 vsftpd 将以独立模式运行,由vsftpd 自己监听和处理连接请求)
# Thisdirective enables listening on IPv6 sockets. To listen on IPv4 and IPv6
#sockets, you must run two copies of vsftpd whith two configuration files.
# Makesure, that one of the listen options is commented !!
#listen_ipv6=YES ( 设定是否支持IPV6)
#pam_service_name=vsftpd ( 设置 PAM 外挂模块提供的认证服务所使用的配置文件名 ,即/etc/pam.d/vsftpd 文件,此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM 模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中)
#userlist_enable=YES/NO (此选项默认值为NO , 此时ftpusers 文件中的用户禁止登录FTP 服务器;若此项设为YES ,则 user_list 文件中的用户允许登录 FTP 服务器,而如果同时设置了 userlist_deny=YES ,则 user_list 文件中的用户将不允许登录FTP 服务器,甚至连输入密码提示信息都没有,直接被FTP 服务器拒绝)
#userlist_deny=YES/NO (此项默认为YES ,设置是否阻扯user_list 文件中的用户登录FTP 服务器)
  tcp_wrappers=YES ( 表明服务器使用 tcp_wrappers 作为主机访问控制方式,tcp_wrappers 可以实现linux 系统中网络服务的基于主机地址的访问控制,在/etc 目录中的hosts.allow 和hosts.deny 两个文件用于设置tcp_wrappers 的访问控制,前者设置允许访问记录,后者设置拒绝访问记录。例如想限制某些主机对FTP 服务器192.168.57.2 的匿名访问,编缉/etc/hosts.allow 文件,如在下面增加两行命令:vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY 表明限制IP 为192.168.57.1/192.168.57.9 主机访问IP 为192.168.57.2 的FTP服务器,此时FTP 服务器虽可以PING 通,但无法连接)
  12、 匿名:anonymous,密码是没有的
  13、 Vsftp根目录 /var/ftp/
  a) 向下面的pub里面下载文件就可以了
  b) 如果要上传,默认不允许,匿名anonymous上传。
  14、很多ftp用户管理跟linux用户管理放在一起的
  15、允许root用户上传(一般不用)
  16、允许root上传
  a) 只需要更改两个配置文件文件;(/etc/vsftpd)
  b) 改配置文件vsftpd.user_list(把root用户删除或者用#注释,#root)
  c) 改配置文件vsftpd.user_ftpusers(把root用户删除或者用#注释,#root)
  d) 再重新启动vsftp  service vsftpd restart
  在这种情况下用root登录上去,默认登录根目录
  17、 默认启动设置:
  a) 方法一:chkconfig vsftpdon或chkconfig –level 5 vsftpd on
  b) 只要在第2--5为on就能随机在哪个级别上启动,
  c) 查看启动方式:chkconfig--list |grep vsftpd
  d) 方法二:用vi打开:/etc/rc.local在里面加入/user/local/bin/vsftpd即可
  18、在配置vsftpd过程中linux的selinux默认下是启动的,有时候这个东西有加强安全性的同时很讨厌,比如让配置好的vsftpd无法正常登录,也无法上传。此时可以采用两种办法。
  i. 一种办法:
  #setsebool -P ftpd_disable_trans 1
  然后重启vsftpd服务。
  ii. 另一种办法,直接关掉selinux
  vim /etc/sysconfig/selinux
  selinux=disable
  然后重启即可。
  19、 或者先查看selinux的状态: getsebool –a或sestatus -v
  a) 使用setsebool命令开启对应属性:setsebool ftpd_disable_trans on
  b) setsebool使用-P参数,无需每次开机都输入这个命令: setsebool -Pftpd_disable_trans on
  c) 获取本机selinux策略值,也称为bool值。:getsebool -a  命令或sestatus -b

posted @ 2014-12-03 13:31 顺其自然EVO 阅读(1001) | 评论 (0)编辑 收藏

iOS中使用Reachability 检测网络

如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote)。那么你会使用到Reachability来实现网络检测。
  写本文的目的
  了解Reachability都能做什么
  检测3中网络环境
  2G/3G
  wifi
  无网络
  如何使用通知
  单个controller
  多个controller
  简单的功能:
  仅在wifi下使用
  Reachability简介
  Reachablity 是一个iOS下检测,iOS设备网络环境用的库。
  监视目标网络是否可用
  监视当前网络的连接方式
  监测连接方式的变更
  安装
  创建 network 工程(network是我创建的demo工程,附件中可以下载到)
  使用Cocoaspod安装依赖
  在项目中添加 SystemConfiguration.framework 库
  由于Reachability非常常用。直接将其加入到Supporting Files/networ-Prefix.pch中:
  #import <Reachability/Reachability.h>
  #import <Reachability/Reachability.h>
  如果你还不知道cocoaspod是什么,看这里:
  http://witcheryne.iteye.com/blog/1873221
  使用
  stackoverflow上有一篇回答,很好的解释了reachability的用法
  http://stackoverflow.com/questions/11177066/how-to-use-ios-reachability
  一般情况一个Reachability实例就ok了。
  一个Controller只需要一个Reachability
  Block方式使用
- (void)viewDidLoad
{
[super viewDidLoad];
DLog(@"开启 www.apple.com 的网络检测");
Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
DLog(@"-- current status: %@", reach.currentReachabilityString);
// start the notifier which will cause the reachability object to retain itself!
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
reach.reachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.blockLabel.text = @"网络可用";
self.blockLabel.backgroundColor = [UIColor greenColor];
});
};
reach.unreachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.blockLabel.text = @"网络不可用";
self.blockLabel.backgroundColor = [UIColor redColor];
});
};
[reach startNotifier];
}
- (void)viewDidLoad
{
[super viewDidLoad];
DLog(@"开启 www.apple.com 的网络检测");
Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
DLog(@"-- current status: %@", reach.currentReachabilityString);
// start the notifier which will cause the reachability object to retain itself!
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
reach.reachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.blockLabel.text = @"网络可用";
self.blockLabel.backgroundColor = [UIColor greenColor];
});
};
reach.unreachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.blockLabel.text = @"网络不可用";
self.blockLabel.backgroundColor = [UIColor redColor];
});
};
[reach startNotifier];
}
 使用notification的方式
- (void)viewDidLoad
{
[super viewDidLoad];
DLog(@"开启 www.apple.com 的网络检测");
Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
DLog(@"-- current status: %@", reach.currentReachabilityString);
// start the notifier which will cause the reachability object to retain itself!
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
[reach startNotifier];
}
- (void) reachabilityChanged: (NSNotification*)note {
Reachability * reach = [note object];
if(![reach isReachable])
{
self.notificationLabel.text = @"网络不可用";
self.notificationLabel.backgroundColor = [UIColor redColor];
self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
return;
}
self.notificationLabel.text = @"网络可用";
self.notificationLabel.backgroundColor = [UIColor greenColor];
if (reach.isReachableViaWiFi) {
self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];
self.wifiOnlyLabel.text = @"当前通过wifi连接";
} else {
self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
self.wifiOnlyLabel.text = @"wifi未开启,不能用";
}
if (reach.isReachableViaWWAN) {
self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];
self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";
} else {
self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
self.wwanOnlyLabel.text = @"2g or 3g网络未使用";
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
DLog(@"开启 www.apple.com 的网络检测");
Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
DLog(@"-- current status: %@", reach.currentReachabilityString);
// start the notifier which will cause the reachability object to retain itself!
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
[reach startNotifier];
}
- (void) reachabilityChanged: (NSNotification*)note {
Reachability * reach = [note object];
if(![reach isReachable])
{
self.notificationLabel.text = @"网络不可用";
self.notificationLabel.backgroundColor = [UIColor redColor];
self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
return;
}
self.notificationLabel.text = @"网络可用";
self.notificationLabel.backgroundColor = [UIColor greenColor];
if (reach.isReachableViaWiFi) {
self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];
self.wifiOnlyLabel.text = @"当前通过wifi连接";
} else {
self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
self.wifiOnlyLabel.text = @"wifi未开启,不能用";
}
if (reach.isReachableViaWWAN) {
self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];
self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";
} else {
self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
self.wwanOnlyLabel.text = @"2g or 3g网络未使用";
}
}
  附件demo说明
  开启wifi状态
  关闭wifi的状态
  遗留问题
  如何在多个controller之前共用一个Reachability(附件demo中是一个controller一个Reachability实例)
  应该在什么使用停止Reachability的检测.

posted @ 2014-12-03 13:31 顺其自然EVO 阅读(196) | 评论 (0)编辑 收藏

iOS开发之山寨版新浪微博小结

之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦。OAuth的全称为Open Authorization 开发授权,SSO--单点登陆(Single Sign On)。至于其原理是什么,更具体的介绍网上的资料是一抓一大把,在这就不做过多的原理性的概述。当然啦,OAuth和SSO在Web和其他手机终端上应用还是蛮多的,所有这方面的资料也是多的很。
  简单的说就是可以通过新浪的OAuth把之前access_token换成用户自己的access_token,从而请求自己微博的内容(因为之前做的的关于新浪微博的东西,所以用到是新浪提供的OAuth)。更详细的内容请参考新浪对OAuth2.0授权认证,iOS版SDK的GitHub下载后,其中有详细的使用说明并附有使用Demo.所以sdk的使用在这就不做过多的赘述。可能有的小伙伴会问哪本篇博客要介绍什么东西呢?本篇博客就是被之前的新浪微博加上OAuth授权认证,给之前的博客做一个善后工作
  1.还是在博客的开头先来几张截图(第一张是没有登录时的启动图,第二张是获取授权的页面,第三张是授权后的页面,第四张是把之前写的iOS开发之自定义表情键盘(组件封装与自动布局)整合了进来)这样的话一个App的基本功能算是有啦。
  2.在今天的博客中没有大量的代码,只是对之前博客中的内容的一个应用,如何用新浪的OAuth的SDK,新浪给提供的开发文档中说明的很详细了,笔者也是按上面一步步做的,没有太大问题。上面给出了SDK的下载地址,有兴趣小伙伴可以下载一个研究研究。
  3.在用户授权以后,新浪接口或返回一些用户的信息,其中就有该授权用户所对应的access_token, 下面是响应代码,把返回的用户access_token存入到了NSUserDefaults中,关于NSUserDefault的具体内容请参考之前的博客IOS开发之记录用户登陆状态,在这就不做赘述了。
1 - (void)didReceiveWeiboResponse:(WBBaseResponse *)response
2 {
3     if ([response isKindOfClass:WBSendMessageToWeiboResponse.class])
4     {
5         NSString *title = @"发送结果";
6         NSString *message = [NSString stringWithFormat:@"响应状态: %d\n响应UserInfo数据: %@\n原请求UserInfo数据: %@",
7                              response.statusCode, response.userInfo, response.requestUserInfo];
8        NSLog(@"%@", message);
9     }
10     else if ([response isKindOfClass:WBAuthorizeResponse.class])
11     {
12
13         self.wbtoken = [(WBAuthorizeResponse *)response accessToken];
14
15         if (self.wbtoken != nil) {
16             //获取userDefault单例
17             NSUserDefaults *token = [NSUserDefaults standardUserDefaults];
18             [token setObject:self.wbtoken forKey:@"token"];
19         }
20     }
21 }
  4.添加我们的自定义键盘也挺简单的,因为之前是用纯代码封装的自定义键盘并留有响应的接口,所有移植到我们的新浪微博上就是一个拷贝粘贴的体力活,关于自定义键盘的东西请参考之前的博客iOS开发之自定义表情键盘(组件封装与自动布局),在这就不做赘述。

posted @ 2014-12-03 13:30 顺其自然EVO 阅读(224) | 评论 (0)编辑 收藏

Linux操作系统如何识别hba卡的wwn号

在连接存储的时候,通常存储管理员要求我们提供一下wwn号,这样便于与存储管理器上识别的wwn号对应起来,也就是查看一下hba的id号,现在把linux的查看方法与大家分享一下
  一、RedHat Linux AS4
# grep scsi /proc/scsi/qla2xxx/3
Number of reqs in pending_q= 0, retry_q= 0, done_q= 0, scsi_retry_q= 0
scsi-qla0-adapter-node=20000018822d7834;
scsi-qla0-adapter-port=21000018822d7834;
scsi-qla0-target-0=202900a0b8423858;
scsi-qla0-port-0=200800a0b8423858:202900a0b8423858:0000e8:1;
  二、RedHat Linux AS5/AS6
  redhat5及redat6的方法是一样的
[root@mytest host3]# pwd
/sys/class/fc_host/host3
[root@mytest host3]# cat port_name
0x10000090fa74258b
  包括centos、oel与redhat的方法是相同的
  三、SuSE Linux 9
  查看 /proc/scsi/qla2xxx/*  ,并以 adapter-port 为关键字过滤即可查看FC HBA卡的WWN信息:
  # cat /proc/scsi/qla2xxx/* | grep adapter-port
  scsi-qla0-adapter-port=21000018822c8a2c;
  scsi-qla1-adapter-port=21000018822c8a2d;
  四、、SuSE Linux 10
  查看 /sys/class/fc_host/host*/port_name 文件的内容即可看到对应FC HBA卡的WWN信息:
  mytest:/sys/class/fc_host/host3 # pwd
  /sys/class/fc_host/host3
  mytest:/sys/class/fc_host/host3 # cat port_name
  0x21000024ff356b02

posted @ 2014-11-28 10:45 顺其自然EVO 阅读(606) | 评论 (0)编辑 收藏

使用调用者权限实现Schema导向操作

很多时候,我们都会使用存储过程Procedure来实现一些脚本工具。通过Procedure来实现一些数据库相关的维护、开发工作,可以大大提高我们日常工作效率。一个朋友最近咨询了关于Procedure调用的问题,觉得比较有意思,记录下来供需要的朋友不时之需。
  1、问题描述
  问题背景是这样,朋友在运维一个开发项目,同一个数据库中多个Schema内容相同,用于不同的测试目的。一些开发同步任务促使编写一个程序来实现Schema内部或者之间对象操作。从软件版本角度看,维护一份工具脚本是最好的方法,可以避免由于修改造成的版本错乱现象。如何实现一份存储过程脚本,在不同Schema下执行效果不同就成为问题。
  将问题简化为如下描述:在Schema A里面包括一个存储过程Proc,A中还有一个数据表T1。在Proc代码中,包括了对T1的操作内容。而Schema B中也存在一个数据表T1,并且B拥有一个名为Proc的私有同义词synonym指向A.Proc。问题是如何让Proc根据执行的Schema主体不同,访问不同Schema的数据表。
  也就是说,如果是A调用Proc程序包,操作的就是A Schema里面的数据表T1。如果B调用Proc程序包,就操作B Schema里面的数据表T1。
  2、测试实验一
  为了验证测试,我们模拟了实验环境,来观察现象。选择11gR2进行测试。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE      11.2.0.4.0     Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
创建对应Schema和数据表。
SQL> create user a identified by a;
User created
SQL> create user b identified by b;
User created
SQL> grant connect, resource to a,b;
Grant succeeded
SQL> grant create procedure to a,b;
Grant succeeded
SQL> grant create synonym to a,b;
Grant succeeded
  在Schema A下面创建数据表和对应操作存储过程。
SQL> conn a/a@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as a
SQL> create table a(col varchar2(10));
Table created
SQL> create or replace procedure Proc(i_vc_name varchar2) is
2  begin
3    insert into a values (i_vc_name);
4    commit;
5  end Proc;
6  /
Procedure created
从Schema A进行调用动作:
SQL> exec proc('iii');
PL/SQL procedure successfully completed
SQL> select * from a;
COL
----------------------------------------
Iii
SQL> grant execute on proc to b;
Grant succeeded
  另外创建Schema B数据表对象,并且包括同义词对象。
  SQL> conn b/b@sicsdb
  Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
  Connected as b
  SQL> create table a(col varchar2(10));
  Table created
  SQL> create synonym proc for a.proc;
  Synonym created
  进行默认情况测试,在Schema B中调用存储过程proc,看操作数据表是哪张:
SQL> conn b/b@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as b
SQL> exec proc('JJJ');
PL/SQL procedure successfully completed
SQL> select * from a;
COL
----------------------------------------
  Schema B中数据表a没有数据,查看Schema A中数据表情况:
  SQL> select * from a.a;
  COL
  --------------------
  JJJ
  Iii
  实验说明:在默认情况下,不同Schema对象调用相同存储过程,其中涉及到的对象都是相同的。也就是Oracle存储过程中的“所有者权限”。一旦用户拥有执行存储过程的权限,就意味着在执行体中,使用的是执行体所有者的权限体系。
  那么这个问题似乎是没有办法。执行体指向的是Schema A的数据表a。
  3、测试实验二
  与所有者权限对应的另一种模式是“调用者权限”。也就说,对用户是否可以执行该程序体中的对象,完全取决于执行调用用户系统权限和对象权限(注意:非角色权限)。
  笔者一种猜想,如果应用调用者权限,从执行用户权限角度看,是不是可以直接访问自己Schema中的对象了。下面通过实验进行证明。
SQL> conn a/a@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as a
SQL>
SQL> create or replace procedure Proc(i_vc_name varchar2) AUTHID CURRENT_USER is
2  begin
3    insert into a values (i_vc_name);
4    commit;
5  end Proc;
6  /
Procedure created
很多时候,我们都会使用存储过程Procedure来实现一些脚本工具。通过Procedure来实现一些数据库相关的维护、开发工作,可以大大提高我们日常工作效率。一个朋友最近咨询了关于Procedure调用的问题,觉得比较有意思,记录下来供需要的朋友不时之需。
  1、问题描述
  问题背景是这样,朋友在运维一个开发项目,同一个数据库中多个Schema内容相同,用于不同的测试目的。一些开发同步任务促使编写一个程序来实现Schema内部或者之间对象操作。从软件版本角度看,维护一份工具脚本是最好的方法,可以避免由于修改造成的版本错乱现象。如何实现一份存储过程脚本,在不同Schema下执行效果不同就成为问题。
  将问题简化为如下描述:在Schema A里面包括一个存储过程Proc,A中还有一个数据表T1。在Proc代码中,包括了对T1的操作内容。而Schema B中也存在一个数据表T1,并且B拥有一个名为Proc的私有同义词synonym指向A.Proc。问题是如何让Proc根据执行的Schema主体不同,访问不同Schema的数据表。
  也就是说,如果是A调用Proc程序包,操作的就是A Schema里面的数据表T1。如果B调用Proc程序包,就操作B Schema里面的数据表T1。
  2、测试实验一
  为了验证测试,我们模拟了实验环境,来观察现象。选择11gR2进行测试。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE      11.2.0.4.0     Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
创建对应Schema和数据表。
SQL> create user a identified by a;
User created
SQL> create user b identified by b;
User created
SQL> grant connect, resource to a,b;
Grant succeeded
SQL> grant create procedure to a,b;
Grant succeeded
SQL> grant create synonym to a,b;
Grant succeeded
  在Schema A下面创建数据表和对应操作存储过程。
SQL> conn a/a@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as a
SQL> create table a(col varchar2(10));
Table created
SQL> create or replace procedure Proc(i_vc_name varchar2) is
2  begin
3    insert into a values (i_vc_name);
4    commit;
5  end Proc;
6  /
Procedure created

posted @ 2014-11-28 10:44 顺其自然EVO 阅读(493) | 评论 (0)编辑 收藏

Java泛型与类型擦除

“编译器会进行泛型擦除”是一个常识了(好吧,实际擦除的是参数和自变量的类型)。这个过程由“类型擦除”实现。但是并非像许多开发者认为的那样,在 <..> 符号内的东西都被擦除了。看下面这段代码:
public class ClassTest {
public static void main(String[] args) throws Exception {
ParameterizedType type = (ParameterizedType)
Bar.class.getGenericSuperclass();
System.out.println(type.getActualTypeArguments()[0]);
ParameterizedType fieldType = (ParameterizedType)
Foo.class.getField("children").getGenericType();
System.out.println(fieldType.getActualTypeArguments()[0]);
ParameterizedType paramType = (ParameterizedType)
Foo.class.getMethod("foo", List.class)
.getGenericParameterTypes()[0];
System.out.println(paramType.getActualTypeArguments()[0]);
System.out.println(Foo.class.getTypeParameters()[0]
.getBounds()[0]);
}
class Foo<E extends CharSequence> {
public List<Bar> children = new ArrayList<Bar>();
public List<StringBuilder> foo(List<String> foo) {return null; }
public void bar(List<? extends String> param) {}
}
class Bar extends Foo<String> {}
}
  你知道输出了什么吗?
  class java.lang.String
  class ClassTest$Bar
  class java.lang.String
  class java.lang.StringBuilder
  interface java.lang.CharSequence
  你会发现每一个类型参数都被保留了,而且在运行期可以通过反射机制获取到。那么到底什么是“类型擦除”?至少某些东西被擦除了吧?是的。事实上,除了结构化信息外的所有东西都被擦除了 —— 这里结构化信息是指与类结构相关的信息,而不是与程序执行流程有关的。换言之,与类及其字段和方法的类型参数相关的元数据都会被保留下来,可以通过反射获取到。

posted @ 2014-11-28 10:31 顺其自然EVO 阅读(254) | 评论 (0)编辑 收藏

几个前端Bug的解决方案

jQueryUI下被拖动的元素上飘
  症状出现在几乎所有浏览器里。使用1.10.x的draggable,在滚动栏下移(即非处于页面顶部)的时候拖动draggable的元素,它会向上跳一段距离。解决办法是将jQueryUI1.10.x的_convertPositionTo()和_generatePosition()换为1.9.2的或者设置父元素的position为absolute以外的值。(应该是父元素为absolute时计算offset又逗比了……)
  参考:JqueryUI1.10.xDialogdragissueonlargebodyheight
  追记:闲着自己实现了一个可拖拽效果,放在了Gist里,jQueryUI的这个bug应该是在计算拖拽时位置的时候用了clientX和clientY而不是pageX和pageY,导致计算出来的offset过小引起的
  IE里文本框点击后光标向上飘
  如果想要居中,兼容IE的话一般是height和line-height设为同一个值。此时需要保证:
  input使用content-box
  height和line-height都要设,不能只设line-height
  应该是IE在border-box下计算linebox大小的时候有延迟所以出现了向上飘……其他浏览器没有这个现象。
  引起这个bug是因为项目的css拿了bootstrap3做base,而bootstrap3给所有元素都设了box-sizing:border-box。
  参考:WhydidBootstrap3switchtobox-sizing:border-box?
  追记:IE9里使用搜狗输入法时按空格文字会下沉……找来找去发现是浏览器+输入法交互产生的问题也是醉了,前端根本不可控囧解决方法只有:提醒用户要么换掉IE9,要么换输入法hhhh
  无法用checked选中radiobutton
  检查有没有套上form。在某些浏览器下似乎没有套上from的input添加checked是没有样式的=。=
  chrome下p里套div造成解析错误
  后端的人传来的HTML我一看也是醉了……参考MDN的文档,<p>的合法内容为phrasingcontent,其中不包括div
  <p>
  <div></div>
  </p>
  在chrome里解析完之后就成了
  <p></p>
  <div></div>
  <p></p>

posted @ 2014-11-28 10:23 顺其自然EVO 阅读(752) | 评论 (0)编辑 收藏

Testng.xml文件结构组成及节点属性说明

testng.xml文件结构:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suitename" junit="false" verbose="3" parallel="false" thread-count="5" configfailurepolicy="<span style="font-family:Arial;"><span style="font-size: 14px; line-height: 26px;">skip</span></span>" annotations="javadoc" time-out="10000" skipfailedinvocationcounts="true" data-provider-thread-count="5" object-factory="classname" allow-return-values="true">  <!-- name参数为必须 -->
<suite-files>
<suite-file path="/path/to/suitefile1"></suite-file>  <!-- path参数为必须 -->
<suite-file path="/path/to/suitefile2"></suite-file>
</suite-files>
<parameter name="par1" value="value1"></parameter>  <!-- name, value参数为必须 -->
<parameter name="par2" value="value2"></parameter>
<method-selectors>
<method-selector>
<selector-class name="classname" priority="1"></selector-class> <!-- name参数为必须 -->
<script language="java"></script>  <!-- language参数为必须 -->
</method-selector>
</method-selectors>
<test name="testename" junit="false" verbose="3" parallel="false" thread-count="5" annotations="javadoc" time-out="10000" enabled="true" skipfailedinvocationcounts="true" preserve-order="true" allow-return-values="true"> <!-- name参数为必须 -->
<parameter name="par1" value="value1"></parameter>  <!-- name, value参数为必须 -->
<parameter name="par2" value="value2"></parameter>
<groups>
<define name="xxx"> <!-- name参数为必须 -->
<include name="" description="" invocation-numbers="" />  <!-- name参数为必须 -->
<include name="" description="" invocation-numbers="" />
</define>
<run>
<include name="" />  <!-- name参数为必须 -->
<exclude name="" />  <!-- name参数为必须 -->
</run>
<dependencies>
<group name="" depends-on=""></group> <!-- name,depends-on均为参数为必须 -->
<group name="" depends-on=""></group>
</dependencies>
</groups>
<classes>
<class name="classname"> <!-- name参数为必须 -->
<methods>
<parameter name="par3" value="value3"></parameter>
<include name="" description="" invocation-numbers=""></include>
<exclude name=""></exclude>
</methods>
<methods></methods>
</class>
</classes>
<packages>
<package name="" />  <!-- name参数为必须 -->
<package name="">
<include name="" description="" invocation-numbers=""></include>
<exclude name=""></exclude>
</package>
</packages>
<listeners>
<listener class-name="classname1" />  <!-- name参数为必须 -->
<listener class-name="classname2" />
</listeners>
</test>
<test></test>
</suite>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suitename" junit="false" verbose="3" parallel="false" thread-count="5" configfailurepolicy="<span style="font-family:Arial;"><span style="font-size: 14px; line-height: 26px;">skip</span></span>" annotations="javadoc" time-out="10000" skipfailedinvocationcounts="true" data-provider-thread-count="5" object-factory="classname" allow-return-values="true">  <!-- name参数为必须 -->
<suite-files>
<suite-file path="/path/to/suitefile1"></suite-file>  <!-- path参数为必须 -->
<suite-file path="/path/to/suitefile2"></suite-file>
</suite-files>
<parameter name="par1" value="value1"></parameter>  <!-- name, value参数为必须 -->
<parameter name="par2" value="value2"></parameter>
<method-selectors>
<method-selector>
<selector-class name="classname" priority="1"></selector-class> <!-- name参数为必须 -->
<script language="java"></script>  <!-- language参数为必须 -->
</method-selector>
</method-selectors>
<test name="testename" junit="false" verbose="3" parallel="false" thread-count="5" annotations="javadoc" time-out="10000" enabled="true" skipfailedinvocationcounts="true" preserve-order="true" allow-return-values="true"> <!-- name参数为必须 -->
<parameter name="par1" value="value1"></parameter>  <!-- name, value参数为必须 -->
<parameter name="par2" value="value2"></parameter>
<groups>
<define name="xxx"> <!-- name参数为必须 -->
<include name="" description="" invocation-numbers="" />  <!-- name参数为必须 -->
<include name="" description="" invocation-numbers="" />
</define>
<run>
<include name="" />  <!-- name参数为必须 -->
<exclude name="" />  <!-- name参数为必须 -->
</run>
<dependencies>
<group name="" depends-on=""></group> <!-- name,depends-on均为参数为必须 -->
<group name="" depends-on=""></group>
</dependencies>
</groups>
<classes>
<class name="classname"> <!-- name参数为必须 -->
<methods>
<parameter name="par3" value="value3"></parameter>
<include name="" description="" invocation-numbers=""></include>
<exclude name=""></exclude>
</methods>
<methods></methods>
</class>
</classes>
<packages>
<package name="" />  <!-- name参数为必须 -->
<package name="">
<include name="" description="" invocation-numbers=""></include>
<exclude name=""></exclude>
</package>
</packages>
<listeners>
<listener class-name="classname1" />  <!-- name参数为必须 -->
<listener class-name="classname2" />
</listeners>
</test>
<test></test>
</suite>
testng.xml文件节点属性说明:
  suite属性说明:
  @name: suite的名称,必须参数
  @junit:是否以Junit模式运行,可选值(true | false),默认"false"
  @verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
  @parallel:是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
  @thread-count:当为并发执行时的线程池数量,默认为"5"
  @configfailurepolicy:一旦Before/After Class/Methods这些方法失败后,是继续执行测试还是跳过测试;可选值 (skip | continue),默认"skip"
  @annotations:获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk注解
  @time-out:为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
  @skipfailedinvocationcounts:是否跳过失败的调用,可选值(true | false),默认"false"
  @data-provider-thread-count:并发执行时data-provider的线程池数量,默认为"10"
  @object-factory:一个实现IObjectFactory接口的类,用来实例测试对象
  @allow-return-values:是否允许返回函数值,可选值(true | false),默认"false"
  @preserve-order:顺序执行开关,可选值(true | false) "true"
  @group-by-instances:是否按实例分组,可选值(true | false) "false"
  test属性说明:
  @name:test的名字,必选参数;测试报告中会有体现
  @junit:是否以Junit模式运行,可选值(true | false),默认"false"
  @verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
  @parallel:是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
  @thread-count:当为并发执行时的线程池数量,默认为"5"
  @annotations:获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk5注解
  @time-out:为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
  @enabled:设置当前test是否生效,可选值(true | false),默认"true"
  @skipfailedinvocationcounts:是否跳过失败的调用,可选值(true | false),默认"false"
  @preserve-order:顺序执行开关,可选值(true | false) "true"
  @group-by-instances:是否按实例分组,可选值(true | false) "false"
  @allow-return-values:是否允许返回函数值,可选值(true | false),默认"false"

posted @ 2014-11-28 10:22 顺其自然EVO 阅读(433) | 评论 (0)编辑 收藏

如何让Loadrunner运行日志的警告显示红色

先看一段脚本
Action()
{
web_reg_save_param("userSessionID2",
"LB=userSession value=",
"RB=>",
"Search=Body",
LAST);
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_think_time(13);
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t4.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={userSessionID}", ENDITEM,
"Name=username", "Value=test2", ENDITEM,
"Name=password", "Value=test2", ENDITEM,
"Name=JSFormSubmit", "Value=on", ENDITEM,
"Name=login.x", "Value=63", ENDITEM,
"Name=login.y", "Value=9", ENDITEM,
LAST);
web_url("SignOff Button",
"URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=1",
"TargetFrame=body",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",
"Snapshot=t5.inf",
"Mode=HTML",
LAST);
return 0;
}
  可以看到,脚本中在引用关联函数的时候,名称和实际的关联函数名称是不一致的。
  再看下运行结果
  从Warning信息中可以看出,也提示了userSessionID也不是一个有效的关联值,所以实际上并未关联成功,但Warning信息的文字颜色为黑色,所以在查看日志信息的时候,不能很快了解实际的运行状态,有没有什么方法可以将Warning的颜色也显示为红色或者蓝色?

posted @ 2014-11-28 10:19 顺其自然EVO 阅读(1290) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last 
<2025年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜