1、LINUX系统启动级别
查看/etc/inittab文件,其主要内容如下:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
... ...
0:停机(不要设置为启动默认级别)
1:单用户模式
2:多用户,无NFS(如果您没有配置网络,该级别与3一样)
3:完全多用户模式
4:不使用
5:X11图形模式
6:重启(不要设置为启动默认级别)
如果想让系统不用图形模式登陆可将id:5:initdefault: 中的5改为3即可。
2、Linux运行级别
Linux 启动时,运行一个叫做init 的程序,然后由它来启动后面的任务,包括多用户环境,网络等。
那么,到底什么是运行级别呢?简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1 到6 ,具有不同的功能。这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是那些放在/etc/rc.d 目录下的文件。
大多数的Linux 发行版本中,启动脚本放在/etc/rc.d/init.d,这些脚本被ln 命令来连接到 /etc/rc.d/rcn.d 目录(这里的n 就是运行级0-6)。如:/etc/rc.d/rc5.d 下面的S10network 就是连接到/etc/rc.d/init.d下的network 脚本的。因此,我们可以知道,rc5.d 下面的文件就是和运行级5 有关的。
3、Samba的自启动
samba安装完后,默认是不会自启动的。通过查看/etc/rc.d/rcn.d/目录下的文件或通过chkconfig命令查询,如:
[alisoft@kplan-dev8 ~]$ ll /etc/rc.d/rc5.d
总用量 272
lrwxrwxrwx 1 root root 22 8月 13 11:17 K30spamassassin -> ../init.d/spamassassin
lrwxrwxrwx 1 root root 13 8月 18 21:59 K35smb -> ../init.d/smb
lrwxrwxrwx 1 root root 19 8月 13 11:17 K35vncserver -> ../init.d/vncserver
lrwxrwxrwx 1 root root 17 8月 13 11:17 S10network -> ../init.d/network
文件开头的S 代表start 就是启动服务,K代表kill。后面的数字10 就是启动的顺序。例如,有S80postfix 文件,80 就是顺序在 10 以后,表示postfix启动需先启动网络。/etc/rc.d/rc5.d/K35smb ,K 代表 kill。标准的Linux运行级别为3 或者5 ,Linux启动时,init 就会执行 K35smb 脚本。
[alisoft@kplan-dev8 ~]$ /sbin/chkconfig --list | grep smb
smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
0~6 表示运行级别。on 表示启动;off 表示关闭。
要设置Samba自启动,需通过chkconfig命令进行设置:
[alisoft@kplan-dev8 ~]/sbin/chkconfig --level 35 smb on
[alisoft@kplan-dev8 ~]$ /sbin/chkconfig --list | grep smb
smb 0:off 1:off 2:off 3:on 4:off 5:on 6:off
Linux系统运行级别为3 或者5时,系统就会自启动Samba服务。
posted @
2009-01-07 11:14 josson 阅读(4376) |
评论 (2) |
编辑 收藏
在K-system中,需通过域名来访问,在各个测试环境及开发环境中访问时,需在本地做hosts域名绑定。这在开发、测试过程中就会经常的修改hosts文件,来完成在开发、测试、预发及正式环境之间切换。修改hosts文件并不是件复杂的事,但频繁的修改,也是挺累人的事。因此,写个批处理,自动完成环境域名绑定的工作,也可以省不少心。
域名绑定,包括k-system的域名及依赖环境的域名(如AEP、支付宝等)。不同的开发、测试环境只需变更k-system的变更,依赖环境的域名相同;预发环境只需绑定k-system的域名,不需依赖环境的域名绑定;生产环境则取消所有的域名绑定。基于此,一个hosts文件可分成几个部份:与K-system无关的其他域名绑定;K-system依赖环境的域名绑定;预发环境K-system域名的绑定;开发、测试环境的K-system域名绑定。
根据上述分析,预定义若干hosts文件,分别对应上述列的几部份内容。为每个环境建一个批处理文件,根据环境需要将这些预定义的hosts文件进行组合,并动态替换系统的hosts(C:\WINDOWS\system32\drivers\etc)文件。同时,调用IE,打开K-system登录页面。这样,通过一个批处理,可以很方便的在各个环境中切换,免去经常要去编辑hosts文件的烦扰。
考虑到开发和测试会在多个本地测试环境切换,建立过多的批处理也不是个好办法。这时,可以考虑将本地开发、测试环境的切换用同一个脚本实现,不同的环境由用户提供运行参数来指定。如:"test_env.bat 10.2.225.87",则表示将K-system环境切换到87服务器。
部份批处理内容如下,test_env.bat:
@echo off
rem 根据实际情况,修改windows的安装目录
set WIN_DIR=C:\WINDOWS
echo 生成测试hosts文件.
if exist .env_temp del .env_temp
if "%1"=="" (
type inc\local.default >> .env_temp
goto endl
)
echo #FI 开发、测试环境 >> .env_temp
rem 指定其他的IP
echo %1 fi.alisoft.com image.alisoft.com >> .env_temp
:endl
rem 合并hosts文件
call inc\merger.bat env.host inc\.env_base inc\.env_local .env_temp
rem 备份系统的hosts
set SYS_HOST=%WIN_DIR%\system32\drivers\etc\hosts
set SYS_HOST_BAK=%SYS_HOST%-bak0
if not exist %SYS_HOST_BAK% (
copy %SYS_HOST% %SYS_HOST_BAK%
)
rem 复制hosts文件到系统目录
move env.host %SYS_HOST%
del .env_temp
rem 打开浏览器.
call cmd /c start iexplore https://fi.alisoft.com
echo done!
文件合并批处理 merger.bat:
@echo off
set output=%1
if exist %output% del %output%
:getfile
shift
if "%1"=="" goto end
type %1 >> %output%
goto getfile
:end
set todir=
posted @
2008-12-24 15:09 josson 阅读(599) |
评论 (0) |
编辑 收藏
我们的项目都是基于https协议访问的,由于费用问题,在开发、测试环境中使了一个过期证书。所以每天得面对浏览器提示证书过期问题,若只是页面访问,多确认一下就完了,但遇到系统间的页面跳转、互相调用,就玩不转了。没折,干脆自已做证书。
通过Openssl建立根证书和服务器证书,并用根证书对服务器证书进行签名。
1、使用Openssl的CA脚本来建立根证书(/usr/share/ssl/misc/CA)
运行CA -newca,Openssl会找CA自己的私有密钥密码文件。如果没有这个文件?按回车会自动创建,输入密码来保护这个密码文件。之后会提示你输入公司信息来做CA.crt文件。最后,在当前目录下多了一个demoCA目录,demoCA/private/cakey.pem就是CA的key文件了,而demoCA/cacert.pem就是CA的crt文件了。具体如下:
[root@xplan-dev8 ca]# ./CA -newca
CA certificate filename (or enter to create)
Making CA certificate
Generating a 1024 bit RSA private key
.++++++
++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:Zhejiang
Locality Name (eg, city) [Newbury]:Hangzhou
Organization Name (eg, company) [My Company Ltd]:Mysoft.com corpration
Organizational Unit Name (eg, section) []:Mysoft.com
Common Name (eg, your name or your server's hostname) []:Mysoft.com
Email Address []:
2、生成服务器证书
生成服务器私钥Key文件,openssl genrsa -des3 -out server.key 1024,并输入保护密码:
[root@xplan-dev8 ca]# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..++++++
..++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
生成服务器证书(注:输入Common Name一项时,若需对泛域名支持证书时,需用*.mysoft.com):
[root@xplan-dev8 ca]# openssl req -new -key server.key -out server.csr -days 365
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:Zhejiang
Locality Name (eg, city) [Newbury]:Hangzhou
Organization Name (eg, company) [My Company Ltd]:Mysoft.com
Organizational Unit Name (eg, section) []:Mysoft.com
Common Name (eg, your name or your server's hostname) []:*.mysoft.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
3、用根证书对服务器证书进行签名
把server.crt文件重命名成newreq.pem,然后用CA脚本进行签名,期间会提示要求输入cakey.pem的保护密码。
[root@xplan-dev8 ca]# mv server.csr newreq.pem
[root@xplan-dev8 ca]# ./CA -sign
Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 8 12:27:14 2008 GMT
Not After : Dec 8 12:27:14 2009 GMT
Subject:
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = Mysoft.com
organizationalUnitName = Mysoft.com
commonName = *.mysoft.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
0F:0C:46:82:EB:68:61:CE:6F:06:10:78:BC:7B:2F:10:F8:96:7E:09
X509v3 Authority Key Identifier:
keyid:E0:01:2C:50:62:87:8D:10:7A:17:6D:AB:2C:43:0A:79:EB:5F:26:0C
DirName:/C=CN/ST=Zhejiang/L=Hangzhou/O=Mysoft.com corpration/OU=Mysoft.com/CN=Mysoft.com
serial:00
Certificate is to be certified until Dec 8 12:27:14 2009 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=CN, ST=Zhejiang, L=Hangzhou, O=Mysoft.com corpration, OU=Mysoft.com, CN=Mysoft.com
Validity
Not Before: Dec 8 12:27:14 2008 GMT
Not After : Dec 8 12:27:14 2009 GMT
Subject: C=CN, ST=Zhejiang, L=Hangzhou, O=Mysoft.com, OU=Mysoft.com, CN=*.mysoft.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:f0:46:a7:a3:9d:8d:ce:09:da:f1:02:a0:fd:1f:
5c:df:a5:08:66:ea:13:0d:17:ac:49:92:9f:65:21:
cf:ec:f8:79:73:a1:73:0a:3e:d6:d0:c3:a4:d4:36:
22:b8:4c:82:51:fe:5d:e1:13:22:99:5f:4c:ef:c6:
65:3a:5d:de:1f:83:f2:17:a5:2b:f3:03:94:9a:31:
bc:09:c8:1c:9e:4d:ad:3b:90:2d:dc:65:0c:e3:04:
9b:8a:d5:c2:93:b7:51:8e:fe:92:1d:ee:55:6e:a0:
77:25:e1:a1:24:7f:55:7a:b4:4d:f4:84:83:13:56:
8d:62:be:2d:db:f8:1a:de:35
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
0F:0C:46:82:EB:68:61:CE:6F:06:10:78:BC:7B:2F:10:F8:96:7E:09
X509v3 Authority Key Identifier:
keyid:E0:01:2C:50:62:87:8D:10:7A:17:6D:AB:2C:43:0A:79:EB:5F:26:0C
DirName:/C=CN/ST=Zhejiang/L=Hangzhou/O=Mysoft.com corpration/OU=Mysoft.com/CN=Mysoft.com
serial:00
Signature Algorithm: md5WithRSAEncryption
0b:dc:15:f3:87:5c:e0:07:23:0e:78:47:af:56:fb:43:31:4b:
0d:12:76:57:95:cd:d7:2a:75:00:01:21:96:9d:d4:bf:9d:e9:
b6:26:cc:70:98:95:fd:ca:af:ad:68:fb:10:79:09:05:32:20:
02:7a:84:53:2f:e0:d5:cd:ed:4d:42:e7:d5:9d:90:78:9a:2e:
d8:72:cb:7f:f7:29:30:24:25:f2:0f:2d:b4:9d:a2:b3:24:00:
b4:f7:e9:de:5c:1a:50:d3:59:a4:9c:1d:03:15:04:17:6d:c2:
ab:95:a8:1f:28:e5:ad:3c:a9:a8:c8:30:3a:09:3f:75:5d:70:
2e:af
-----BEGIN CERTIFICATE-----
MIIDfDCCAuWgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBgDELMAkGA1UEBhMCQ04x
ETAPBgNVBAgTCFpoZWppYW5nMREwDwYDVQQHEwhIYW5nemhvdTEfMB0GA1UEChMW
QWxpc29mdC5jb20gY29ycHJhdGlvbjEUMBIGA1UECxMLQWxpc29mdC5jb20xFDAS
BgNVBAMTC0FsaXNvZnQuY29tMB4XDTA4MTIwODEyMjcxNFoXDTA5MTIwODEyMjcx
NFowdzELMAkGA1UEBhMCQ04xETAPBgNVBAgTCFpoZWppYW5nMREwDwYDVQQHEwhI
YW5nemhvdTEUMBIGA1UEChMLQWxpc29mdC5jb20xFDASBgNVBAsTC0FsaXNvZnQu
Y29tMRYwFAYDVQQDFA0qLmFsaXNvZnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDwRqejnY3OCdrxAqD9H1zfpQhm6hMNF6xJkp9lIc/s+HlzoXMKPtbQ
w6TUNiK4TIJR/l3hEyKZX0zvxmU6Xd4fg/IXpSvzA5SaMbwJyByeTa07kC3cZQzj
BJuK1cKTt1GO/pId7lVuoHcl4aEkf1V6tE30hIMTVo1ivi3b+BreNQIDAQABo4IB
DDCCAQgwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0
ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFA8MRoLraGHObwYQeLx7LxD4ln4JMIGt
BgNVHSMEgaUwgaKAFOABLFBih40QehdtqyxDCnnrXyYMoYGGpIGDMIGAMQswCQYD
VQQGEwJDTjERMA8GA1UECBMIWmhlamlhbmcxETAPBgNVBAcTCEhhbmd6aG91MR8w
HQYDVQQKExZBbGlzb2Z0LmNvbSBjb3JwcmF0aW9uMRQwEgYDVQQLEwtBbGlzb2Z0
LmNvbTEUMBIGA1UEAxMLQWxpc29mdC5jb22CAQAwDQYJKoZIhvcNAQEEBQADgYEA
C9wV84dc4AcjDnhHr1b7QzFLDRJ2V5XN1yp1AAEhlp3Uv53ptibMcJiV/cqvrWj7
EHkJBTIgAnqEUy/g1c3tTULn1Z2QeJou2HLLf/cpMCQl8g8ttJ2isyQAtPfp3lwa
UNNZpJwdAxUEF23Cq5WoHyjlrTypqMgwOgk/dV1wLq8=
-----END CERTIFICATE-----
Signed certificate is in newcert.pem
这样就生成了server的证书newcert.pem,把newcert.pem 重命名为server.crt。
4、配置apache
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin sa@mysoft.com
ServerName xplan.mysoft.com
DocumentRoot /home/admin/project/htdocs
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
SSLCertificateFile /home/admin/modules/crt/server.crt
SSLCertificateKeyFile /home/admin/modules/crt/server.key
SSLProxyEngine on
RewriteEngine on
RewriteRule ^/$ /xplan/user/login!login.jspa [L,P]
</VirtualHost>
重启apache时,会提示要求输入服务端证书的密码。如下:
[root@localhost]# bin/apachectl restart
httpd not running, trying to start
Apache/2.2.0 mod_ssl/2.2.0 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.
Server xplan.mysoft.com:443 (RSA)
Enter pass phrase:
OK: Pass Phrase Dialog successful.
5、客户端(IE)导入根证书(ca.cert)
在"选项"->"内容"->"证书"->"受信任根证书颁发机构"中点击"导入",选中"ca.crt",完成导入。或者,直接在点ca.crt文件右键,选择安装即可。
6、重启apache,要求输入密码的问题解决
1)、去掉bin/apachectl start启动的pass phrase,用空pass phrase启动apache
(while preserving the original file):
[root@xplan-dev8 ca]$ cp server.key server.key.org
[root@xplan-dev8 ca]$ openssl rsa -in server.key.org -out server.key
确认server.key 文件为root可读
[root@xplan-dev8 ca]$ chmod 400 server.key
2、编辑
[root@xplan-dev8 ca]$ vi conf/extra/httpd-ssl.conf
注释SSLPassPhraseDialog builtin
在后添加:SSLPassPhraseDialog exec:/usr/local/apache2/conf/apache_pass.sh
[root@xplan-dev8 ca]$ vi conf/apache_pass.sh
#!/bin/sh
echo "密码"
[root@xplan-dev8 ca]$ chmod +x /usr/local/apache2/conf/apache_pass.sh
posted @
2008-12-08 21:19 josson 阅读(2629) |
评论 (1) |
编辑 收藏
1、Spket for eclipse
spket支持JavaScript、XUL/XBL、Laszlo、SVG and Yahoo! Widget等新产品,具有代码自动完成、语法高亮、内容概要等功能特点,可以帮助开发人员高效地创建JavaScript程序,它可以以一个独立的桌面应用程序运行或者以Eclipse的插件运行,从它的官方网站http://www.spket.com/可以下载。
插件安装地址:http://www.spket.com/update
相关资料:
Spket Eclipse Plugin & IDE(Ext在Spket上的安装方法)
spket 1.6.6 破解
2、Propedit for eclipse
不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。
插件安装地址:http://propedit.sourceforge.jp/eclipse/updates/
3、Velocity for eclipse
http://veloeclipse.googlecode.com/svn/trunk/update/
posted @
2008-11-28 10:04 josson 阅读(535) |
评论 (0) |
编辑 收藏
现有需求如下:需对若干服务器做相同的环境配置,且配置工作相当复杂,若人工一台一台的处理比较耗时且容易出错。我们可以考虑先完成一台服务器的配置工作,确认配置无误后,再通过脚本,将相应的配置工作同步到其他所有的服务器中。设有已完成配置的服务器:A (192.168.0.2) 和 待配置的服务器B ~ Z(192.168.0.101 ~ 126)。
实现上述需求,关键有两点:1). 通过ssh信任登录,避免每次同步时要求输入密码;2). 通过rsync命令实现服务器之间文件的同步。具体实现细节如下:
1. 完成单向Trusted SSH Authorized
首先在A产生public/private dsa key pair:
……………………………………………………………………………………………………
[root@kplan-test3 .ssh]# ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
f3:47:3b:b0:2a:50:f8:77:7e:ca:29:85:e8:d9:05:9b root@kplan-test3
[root@kplan-test3 .ssh]#
……………………………………………………………………………………………………
完成上述命令后,会在系统/root/.ssh目录生成两个文件:id_dsa与id_dsa.pub。现在复制id_dsa.pub到B服务器,并更名为 authorized_keys2
……………………………………………………………………………………………………
[root@kplan-test3 .ssh]# scp id_dsa.pub 192.168.0.101:/root/.ssh/authorized_keys2
root@192.168.0.101's password:
id_dsa.pub 100% |*****************************************************| 612 00:00
[root@kplan-test3 .ssh]#
……………………………………………………………………………………………………
如果上述步骤顺利完成的话,现在您可以执行”ssh 192.168.0.101”,无需输入登录密码,即可登录到B服务器了。
2.使用rsync 做Remote sync﹕
rsync特性简介: rsync是unix-like系统下的数据镜像备份工具,从命名上就可以看出来了remote sync。它的特性如下:
1、可以镜像保存整个目录树和文件系统。
2、可以很容易做到保持原来文件的权限、时间等等。
3、无须特殊权限即可安装。
4、优化的流程,文件传输效率高。
5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
6、支持匿名传输。
参数意义如下﹕
-a, --archive
It is a quick way of saying you want recursion and want to preserve almost everything.
-v, --verbose
This option increases the amount of information you are given during the transfer.
-l, --links
When symlinks are encountered, recreate the symlink on the destination.
-R, --relative
Use relative paths. 保留相对路径...才不会让子目录跟 parent 挤在同一层...
--delete
是指如果Server端删除了一文件,那客户端也相应把这一文件删除,保持真正的一致。
-e ssh
建立起加密的连接。
3、同步脚本
创建脚本,实现自动配置工作。
……………………………………………………………………………………………………
[root@kplan-test3 backup]# vi install_env.sh
#!/bin/bash
WEBSERVER='kplan-test1 kplan-test2 kplan-test3'
echo "auto install envirment … ------------------------"
for webserver in $WEBSERVER
do
echo "install server:$webserver's envirment."
echo 'transport file : /etc/profile & /etc/hosts'
rsync -v -r -l -H -p -g -t -S -e ssh --delete /etc/profile root@$webserver:/etc/profile
rsync -v -r -l -H -p -g -t -S -e ssh --delete /etc/hosts root@$webserver:/etc/hosts
echo 'run shell command : /home/init_env.sh'
ssh -q -o StrictHostKeyChecking=no root@$webserver "/home/init_env.sh"
ssh -q -o StrictHostKeyChecking=no root@$webserver "rm -f /home/init_env.sh"
echo " $webserver is end ------------------------- "
done
sleep 1
clear
……………………………………………………………………………………………………
4、其他
如果你想用来做自动备份,则在crontab中加入备份脚本即可。如在每天0时0分做备份(设/root目录下已有完成备份的脚本 backup.sh):
……………………………………………………………………………………………………
[root@kplan-test3 backup]# crontab -e
0 0 * * * /root/backup.sh
……………………………………………………………………………………………………
posted @
2008-10-15 16:50 josson 阅读(531) |
评论 (0) |
编辑 收藏
检查SVN设置如下:
右键->TortoiseSVN->Settings->Look and Feel ->Icon Overlays->Driver Types : 选中"Network drives"后,应用即可。
posted @
2008-09-09 15:38 josson 阅读(799) |
评论 (0) |
编辑 收藏
一、相关资源:
Jboss 下载:
http://www.jboss.org/jbossas/downloads/
Apache 下载(包含OpenSSL的版本):
http://httpd.apache.org/download.cgi
Apache与Tomcat的连接器:
jakarta-tomcat-connectors-jk2.0.4-win32-apachex.x.xx.zip
二、Apache 配置
安装过程很简单,按默认安装即可。Apache配置文件conf/httpd.conf 需要做的修改如下:
#监听443端口
Listen 443
ServerName crm.company.com
#确认下列module启用
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
#需将默认的SSL配置注释(也可将下面虚拟机中关于SSL的配置更改到ssl.conf)
#<IfModule mod_ssl.c>
# Include conf/ssl.conf
#</IfModule>
#定义虚拟主机
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin admin@company.com
ServerName crm.company.com
DocumentRoot E:/projects/crm/htdocs
SSLEngine On
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
SSLCertificateFile D:/Services/crt/crm.crt
SSLCertificateKeyFile D:/Services/crt/crm.key
SSLProxyEngine on
RewriteEngine on
RewriteRule ^/$ /crm/login!login.jspa [L,P]
</VirtualHost>
三、Jboss 配置
解压后即完成安装,应用配置需要修改的配置文件为:server\default\conf\jboss-service.xml
#在此配置属性中加入应用所在路径.或者将应用直接布署到deploy目录下面.
<attribute name="URLs">
deploy/, file:/d:/project/crm/deploy/target/
</attribute>
四、Apache 与 Jboss集成
1、将mod_jk2.so文件拷贝到Apache安装目录下的modules文件夹中,并修改Apache的配置文件(httpd.conf),加入如下内容:
#与Jboss集成所需的配置
<IfModule mod_jk2.c>
JkSet config.file ./workers2.properties
</IfModule>
LoadModule jk2_module modules/mod_jk2.so
2、在Apache配置目录conf下新建文件work.properties,并加入如内容:
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
[uri:/*]
[uri:/*.jsp]
[uri:/*.jspa]
worker=ajp13:localhost:8009
3、JBOSS的server\default\conf目录下,新建一个jk2.properties的文件,内容如下:
# Set the desired handler list
handler.list=apr,request,channelSocket
#
# Override the default port for the socketChannel
channelSocket.port=8009
五、测试
完成上述配置后,分别启动Jboss和Apache,使用https访问应用,如https://crm.company.com,apache收到请求后,按虚拟机中设置的kURL重写规则,转向/crm/login!login.jspa。连接器检测到jspa文件,则将该请求转给Jboss处理。如jspa页面的内容被显示出来,则表示配置成功。
六、小结
配置过程中,httpd.con配置比较容易出现问题,一般使用apache提供的配置文件检测功能,确定httpd.conf正确。其次,可查看apache的log日志文件,按日志文件的错误描述进行处理。
配置过程中,可按步进行:Apache & ssl配置;Jboss 应用配置;集成配置;如此可减少一些问题。
posted @
2008-09-05 14:18 josson 阅读(1444) |
评论 (0) |
编辑 收藏
对于任何数据库来说,提供唯一标识数据表中一行记录的能力是至关重要的。几乎所有数据库都提供了为新添加的行自动生成主键的方法。这样再操作数据库的时候比较方便,但它也带来了一个问题,如果我们需要知道新生成的主键值该怎么办?
有的数据库供应商是预先生成(pre-generate)主键的(如Oracle和PostgreSQL),有的则是事后生成(post-generate)的(如SQL Server和MySQL)。不管是哪种方式,我们都可以使用<selectKey>节点来获取<insert>语句所产生的主键。下面的例子演示了这两种方式下的做法:
<!-- Oracle SEQUENCE Example using .NET 1.1 System.Data.OracleClient -->
<insert id="insertProduct-ORACLE" parameterClass="product">
<selectKey resultClass="int" type="pre" property="Id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
</insert>
<!-- Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MSSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" type="post" property="id" >
select @@IDENTITY as value
</selectKey>
</insert>
<!-- MySQL Example -->
<insert id="insertProduct-MYSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" type="post" property="id" >
select LAST_INSERT_ID() as value
</selectKey>
</insert>
posted @
2008-08-01 14:44 josson 阅读(464) |
评论 (0) |
编辑 收藏
Spring 提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式。
编程式事务:
使用TransactionTemplate进行事务处理(Spring进行commit和rollback),原型定义如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements InitializingBean {
public Object execute(TransactionCallback action) throws TransactionException {
if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
}
else {
TransactionStatus status = this.transactionManager.getTransaction(this);
Object result = null;
try {
// 参数TransactionCallback 是一个接口,接口中定义了doInTransaction方法
// 只要实现TransactionCallback接口,在doInTransaction()方法里编写具体要进行事务处理的代码即可。
result = action.doInTransaction(status);
}
catch (RuntimeException ex) {
// 回滚事务
rollbackOnException(status, ex);
throw ex;
}
catch (Error err) {
// 回滚事务
rollbackOnException(status, err);
throw err;
}
this.transactionManager.commit(status);
return result;
}
}
}
实现TransactionCallback接口。
transactionTemplate.execute(
new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {
//代码实现.
}
}
}
配置文件定义:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="myDataSource" />
</property>
</bean>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
</bean>
posted @
2008-07-28 14:37 josson 阅读(1089) |
评论 (0) |
编辑 收藏
Shell基本语法
像高级程序设计语言一样,Shell也提供说明和使用变量的功能。对Shell来讲,所有变量的取值都是一个字串,Shell程序采用$var的形式来引用名为var的变量的值。
Shell有以下几种基本类型的变量。
(1)Shell定义的环境变量:
Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,用户还可以重新定义这些变量,常用的Shell环境变量有:
HOME 用于保存注册目录的完全路径名。
PATH 用于保存用冒号分隔的目录路径名,Shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM 终端的类型。
UID 当前用户的识别字,取值是由数位构成的字串。
PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1 主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。
PS2 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“”然后回车,或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是>。
(2)用户定义的变量:
用户可以按照下面的语法规则定义自己的变量:
变量名=变量值
要注意的一点是,在定义变量时,变量名前不应加符号$,在引用变量的内容时则应在变量名前加$;在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字串都要用双引号括起来。
在编写Shell程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。
有时我们想要在说明一个变量并对它设置为一个特定值后就不在改变它的值时,可以用下面的命令来保证一个变量的只读性:
readonly 变量名
在任何时候,创建的变量都只是当前Shell的局部变量,所以不能被Shell运行的其他命令或Shell程序所利用,而export命令可以将一个局部变量提供给Shell执行的其他命令使用,其格式为:
export 变量名
也可以在给变量赋值的同时使用export命令:
export 变量名=变量值
使用export说明的变量,在Shell以后运行的所有命令或程序中都可以访问到。
(3)位置参数:
位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,Shell取第一个位置
参数替换程序文件中的$1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个Shell程序的文件名,所以,$0不是一个位置参数,
在显示当前所有的位置参数时是不包括$0的。
(4)预定义变量:
预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的Shell预定义变量有:
$# 位置参数的数量。
$* 所有位置参数的内容。
$? 命令执行后返回的状态。
$$ 当前进程的进程号。
$! 后台运行的最后一个进程号。
$0 当前执行的进程名。
其中,$?用于检查上一个命令执行是否正确。(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错。)
$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
(5)参数置换的变量:
Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有4种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下。
a. 变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
b. 变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。
c.
变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信
息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
d. 变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。
所有这4种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。Shell程序设计的流程控制
和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。
与传统语言不同的是,Shell用于指定条件值的不是布尔运算式,而是命令和字串。
1.测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,其测试符和相应的功能分别如下。
(1)数值测试:
-eq 等于则为真。
-ne 不等于则为真。
-gt 大于则为真。
-ge 大于等于则为真。
-lt 小于则为真。
-le 小于等于则为真。
(2)字串测试:
= 等于则为真。
!= 不相等则为真。
-z字串 字串长度伪则为真。
-n字串 字串长度不伪则为真。
(3)文件测试:
-e文件名 如果文件存在则为真。
-r文件名 如果文件存在且可读则为真。
-w文件名 如果文件存在且可写则为真。
-x文件名 如果文件存在且可执行则为真。
-s文件名 如果文件存在且至少有一个字符则为真。
-d文件名 如果文件存在且为目录则为真。
-f文件名 如果文件存在且为普通文件则为真。
-c文件名 如果文件存在且为字符型特殊文件则为真。
-b文件名 如果文件存在且为块特殊文件则为真。
另外,Linux还提供了与(!)、或(-o)、非(-a)三个逻辑操作符,用于将测试条件连接起来,其优先顺序为:!最高,-a次之,-o最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:
var1=2
var2=$[var1*10+1]
则var2的值为21。
2.if条件语句
Shell程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if 条件命令串
then
条件为真时的命令串
else
条件为假时的命令串
fi
3.for循环
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for变量名 [in数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
4.while和until循环
while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为:
while
若干个命令行1
do
若干个命令行2
done
只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。
until命令是另一种循环结构,它和while命令相似,其格式如下:
until
若干个命令行1
do
若干个命令行2
done
until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
Shell还提供了true和false两条命令用于创建无限循环结构,它们的返回状态分别是总为0或总为非0。
5.case条件选择
if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字串或变量的值从多个选项中选择一项的方法,其格式如下:
case string in
exp-1)
若干个命令行1
;;
exp-2)
若干个命令行2
;;
……
*)
其他命令行
esac
Shell通过计算字串string的值,将其结果依次和运算式exp-1, exp-2等进行比较,直到找到一个匹配的运算式为止。如果找到了匹配项,则执行它下面的命令直到遇到一对分号(;;)为止。
在case运算式中也可以使用Shell的通配符(“*”、“?”、“[ ]”)。通常用 * 作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行“其他命令行”的命令。
6.无条件控制语句break和continue
break用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。
7.函数定义
在Shell中还可以定义函数。函数实际上也是由若干条Shell命令组成的,因此它与Shell程序形式上是相似的,不同的是它不是一个单独的进程,而是Shell程序的一部分。函数定义的基本格式为:
functionname
{
若干命令行
}
调用函数的格式为:
functionname param1 param2…
Shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,因此函数也可以作为if, while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时Shell将把这些参数分别赋予相应的位置参数$1, $2, ...及$*。
8.命令分组
在Shell中有两种命令分组的方法:()和{}。前者当Shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧
中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰。{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们要
真正使用圆括弧和花括弧时(如计算运算式的优先顺序),则需要在其前面加上转义符()以便让Shell知道它们不是用于命令执行的控制所用。
9.信号
trap命令用于在Shell程序中捕捉信号,之后可以有3种反应方式:
(1)执行一段程序来处理这一信号。
(2)接受信号的默认操作。
(3)忽视这一信号。
trap对上面3种方式提供了3种基本形式:
第一种形式的trap命令在Shell接收到与signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽略信号:
trap " " signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为Shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),Shell程序在其终止(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将Shell程序终止的话,Shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致Shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的。当Shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若
commands是用单引号括起来的话,那么Shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体
的值来替换。运行Shell程序的方法
用户可以用任何编辑程序来编写Shell程序。因为
Shell程序是解释执行的,所以不需要编译成目的程序。按照Shell编程的惯例,以bash为例,程序的第一行一般为“#!/bin/bash”,其
中 # 表示该行是注释,叹号 !
告诉Shell运行叹号之后的命令并用文档的其余部分作为输入,也就是运行/bin/bash并让/bin/bash去执行Shell程序的内容。
执行Shell程序的方法有3种。
1.sh Shell程序文件名
这种方法的命令格式为:
bash Shell程序文件名
这实际上是调用一个新的bash命令解释程序,而把Shell程序文件名作为参数传递给它。新启动的Shell将去读指定的文件,可执行文件中列出的命令,当所有的命令都执行完后结束。该方法的优点是可以利用Shell调试功能。
2.sh
格式为:
bash< Shell程序名
这种方式就是利用输入重定向,使Shell命令解释程序的输入取自指定的程序文件。
3.用chmod命令使Shell程序成为可执行的
一个文件能否运行取决于该文档的内容本身可执行且该文件具有执行权。对于Shell程序,当用编辑器生成一个文件时,系统赋予的许可权都是644(rw-r-r--),因此,当用户需要运行这个文件时,只需要直接键入文件名即可。
在这3种运行Shell程序的方法中,最好按下面的方式选择:当刚创建一个Shell程序,对它的正确性还没有把握时,应当使用第一种方式进行调试。当
一个Shell程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。
4.bash程序的调试
在编程过程中难免会出错,有的时候,调试程序比编写程序花费的时间还要多,Shell程序同样如此。
Shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是:
bash -选择项Shell程序文件名
几个常用的选择项是:
-e 如果一个命令失败就立即退出。
-n 读入命令但是不执行它们。
-u 置换时把未设置的变量看做出错。
-v 当读入Shell输入行时把它们显示出来。
-x 执行命令时把命令和它们的参数显示出来。
上面的所有选项也可以在Shell程序内部用“set -选择项”的形式引用,而“set +选择项”则将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时,则可以将该部分用上面两个语句包围起来。
(1)未置变量退出和立即退出
未置变量退出特性允许用户对所有变量进行检查,如果引用了一个未赋值的变量就终止Shell程序的执行。Shell通常允许未置变量的使用,在这种情况
下,变量的值为空。如果设置了未置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退出选择项为-u。
当Shell运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时,如果未经重新定向,该出错信息会显示在终端屏幕上,而
Shell程序仍将继续执行。要想在错误发生时迫使Shell程序立即结束,可以使用-e选项将Shell程序的执行立即终止。
(2)Shell程序的跟踪
调试Shell程序的主要方法是利用Shell命令解释程序的-v或-x选项来跟踪程序的执行。-v选择项使Shell在执行程序的过程中,把它读入的
每一个命令行都显示出来,而-x选择项使Shell在执行程序的过程中把它执行的每一个命令在行首用一个+加上命令名显示出来。并把每一个变量和该变量所
取的值也显示出来。因此,它们的主要区别在于:在执行命令行之前无-v,则显示出命令行的原始内容,而有-v时则显示出经过替换后的命令行的内容。
除了使用Shell的-v和-x选择项以外,还可以在Shell程序内部采取一些辅助调试的措施。例如,可以在Shell程序的一些关键地方使用
echo命令把必要的信息显示出来,它的作用相当于C语言中的printf语句,这样就可以知道程序运行到什么地方及程序目前的状态。bash的内部命令
bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo,
eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上显示出由arg指定的字串。
2.eval
命令格式:eval args
功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。
3.exec
命令格式:exec命令参数
功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export变量名 或:export变量名=变量值
功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly变量名
功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。
6.read
命令格式:read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2…在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
8.wait
功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。
9.exit
功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。
posted @
2008-07-21 13:14 josson 阅读(289) |
评论 (0) |
编辑 收藏