2008年8月20日星期三

整合Apache2.2和Tomcat5.5

自从Apache2.2出来后,apache开始支持proxy-ajp.大家知道Apache里的proxy模块,可以实现双向代理功能,功能非常强大。其实从连接器的实现原理上来说,用proxy模块来实现是非常自然的。proxy模块的功能无非就是把相关的请求发给特定的主机再返回结果。那连接器的功能需求就是要把所有对Servlet/JSP的请求都转给后台的Tomcat。
1.安装包
jdk-1_5_0_09-linux-i586.bin
apache-tomcat-5.5.26.tar.gz
httpd-2.2.9.tar.gz

2.开始安装
a)首先安装jdk,直接拷贝到/usr/local下执行

cd /usr/local
./jdk-1_5_0_09-linux-i586.bin
ln -s /usr/local/jdk1.5.0_09 java

b)解压tomcat到/data/app/tomcat
修改/data/app/tomcat/bin/catalina.sh,在开始添加一行:
JAVA_OPTS='-Xms512m -Xmx1024m'

修改/data/app/tomcat/bin/startup.sh和shutdown.sh,添加java环境变量:
export JAVA_HOME=/usr/local/java

c)最关键的就是安装apache了

# tar zxvf httpd-2.2.9.tar.gz
# cd httpd-2.2.9
# ./configure --prefix=/data/app/apache --enable-proxy
\ --enable-proxy-ajp --enable-proxy-connect
\ --enable-proxy-http --enable-proxy-balancer
\ --enable-so --enable-deflate --enable-headers
\ --enable-include --enable-modules=most
\ -enable-mods-shared=all --enable-rewrite
# make
# make install


d)配置httpd.conf

#加载解析模块(前面我们的linux编译时把下面的模块嵌入到了apache中,所以不用再加载)
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 proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

#禁止使用proxy_ajp代理的目录:
ProxyPass /images/ !

#使用proxy_ajp代理;下面的配置,是把所有目录全用代理(当然,还会跟上面的禁用配置组合成完整的规则)
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/

ProxyRequests Off

ProxyPass /admin balancer://tomcatcluster/admin lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3

ProxyPassReverse /admin balancer://tomcatcluster/admin


BalancerMember ajp://localhost:8009 route=tomcat8080
BalancerMember ajp://localhost:10009 smax=10 route=tomcat10080
BalancerMember ajp://localhost:11009 route=tomcat11080
BalancerMember ajp://localhost:12009 smax=10 route=tomcat12080


e)配置虚拟主机
修改httpd.conf
找到以下内容

# Virtual hosts
# Include conf/extra/httpd-vhosts.conf

将第二行前面的”#”去除。
编辑conf/extra/httpd-vhosts.conf


ServerAdmin 127.0.0.1
DocumentRoot “/data/app/tomcat/webapps“
ServerName 127.0.0.1
CustomLog logs/dummy-127.0.0.1-access_log common
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
ServerName localhost
ServerAlias 127.0.0.1


对应的修改/data/app/tomcat/conf/server.xml
另外继续配置tomcat的oracle连接池:/data/app/tomcat/conf/context.xml

至此apache和tomcat的整合就基本结束了。

阅读全文...

2008年7月28日星期一

关于Nginx Fastcgi的安全问题

没有在Nginx的配置中找到Apache中针对每个虚拟主机设置open_basedir的设置,目前只有禁止在某些特定目录下的php解析。
引用官方配置:
Too many example configs fail to secure the "uploads" directory of the application. Remember that if someone can upload a file named xyz.php and the uploads dir is publically accessible then you have given the attacker an easy way to insert PHP onto your site...

So if your app has an upload dir "/images/" then adjust your fastcgi call along the lines of:

http {
index index.php;
root /var/www/htdocs;
# .php
location ~ .*\.php$ {
include /etc/nginx/fcgi.conf;
if ( $uri !~ "^/images/") {
fastcgi_pass 127.0.0.1:10004;
}
fastcgi_index index.php;
}
}

文件夹路径支持正则表达式。如$uri !~ "/*images*/"表示所有含有images字串的文件夹。找到更好的方法再贴出来。

阅读全文...

2008年7月23日星期三

find的-prune用法 忽略某目录

用find查找时忽略某一目录:

# find -name 123
./a/123
./b/123
./123

# find -path ./a -prune -o -name 123 -print
./b/123
./123

# find -path './[ab]' -prune -o -name 123 -print
./123

注意:-prune参数和-depth、-type等参数冲突,使用后者则-prune失效。

阅读全文...

2008年7月17日星期四

PHPMyAdmin中文乱码问题简单解决办法

去phpMyAdmin的根目录下,打开以下这个文件:
libraries/select_lang.lib.php
1、找到有"zh-gb2312"的那一行,把'zh-gb2312' 改成 'zh-gb2312-utf-8'
  为什么这样加?那是因为服务器会把没有"-utf-8"的语言过滤掉。
2、找到"$GLOBALS['mysql_charset_map'] = array("那一行
  把'gb2312' => 'gb2312',
  改成 'gb2312' => 'latin1',
  保存,OK,在进入phpMyAdmin管理,选择语言chinese simplified(zh-gb2312-utf-8)
切记要选择语言为chinese simplified(zh-gb2312-utf-8)!
3、编辑phpMyAdmin/libraries/下的string.lib.php
将第41行的
mb_internal_encoding($GLOBALS['charset']);
改为:mb_internal_encoding('utf-8');

重新进入PHPMyAdmin就OK了

阅读全文...

[转帖][备忘]About Bash Shell program

`command` 执行command后取输出作为字串。'`' 为tab上方的键

脚本文件头行若写成#!/bin/sh 即为使用系统默认shell (/binsh为链接文件)

如果省略#!,那么这个脚本文件将不能使用shell内建的指令,such as ‘if else esle fi"

注释:在行后添加注释时,#前需要一个空格。

';'用于在同一行中分隔多个命令

'.'等价于source命令。

':'等价于"NOP",它的返回值为0,也就是shell返回的true。
1、在一个2元命令中提供一个占位符,如: ${username=`whoami`} 如果没有":"的话,将给出一个错误,除非"username"是个命令。
2、在和 > (重定向操作符)结合使用时,把一个文件截断到0长度,没有修改它的权限.
如果文件在之前并不存在,那么就创建它.如:
1 : > data.xxx #文件"data.xxx"现在被清空了.
2
3 #与 cat /dev/null >data.xxx 的作用相同
4 #然而,这不会产生一个新的进程,因为":"是一个内建命令.
注意: 这只适用于正规文件,而不是管道,符号连接,和某些特殊文件

$? 退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
$$ 进程ID变量.
() 命令组.如: (a=hello;echo $a) Warning!: ()中的命令列表,将作为一个子shell来运行.
在()中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的.

&在后台执行命令。
下面这个比较特别
for i in 1 2 3 4 5 6 7 8 9 10 #第一个循环
do
echo -n "$i"
done& #here is the unique。

- 用于重定向标准输入输出 like this:tar cf - .

$arg <-> ${arg}

全引用: '

从命令行中传进来的参数,$0, $1, $2, $3... like: char * arg[].
$* 类似env 环境变量数组
$# 就是args

shift 左移变量 $1的值将被替换成$2...注意$0保持原状

$?读取最后执行命令的退出码。一般情况下,0为成功,非0失败。

文件测试操作
----------------
返回true如果...
-e 文件存在
-a 文件存在
这个选项的效果与-e相同.但是它已经被弃用了,并且不鼓励使用
-f file是一个regular文件(不是目录或者设备文件)
-s 文件长度不为0
-d 文件是个目录
-b 文件是个块设备(软盘,cdrom等等)
-c 文件是个字符设备(键盘,modem,声卡等等)
-p 文件是个管道
-h 文件是个符号链接
-L 文件是个符号链接
-S 文件是个socket
-t 关联到一个终端设备的文件描述符
这个选项一般都用来检测是否在一个给定脚本中的stdin[-t0]或[-t1]是一个终端
-r 文件具有读权限(对于用户运行这个test)
-w 文件具有写权限(对于用户运行这个test)
-x 文件具有执行权限(对于用户运行这个test)
-g set-group-id(sgid)标志到文件或目录上
如果一个目录具有sgid标志,那么一个被创建在这个目录里的文件,这个目录属于创建
这个目录的用户组,并不一定与创建这个文件的用户的组相同.对于workgroup的目录
共享来说,这非常有用.见<>第58页.
-u set-user-id(suid)标志到文件上
如果运行一个具有root权限的文件,那么运行进程将取得root权限,即使你是一个普通
用户.[1]这对于需要存取系统硬件的执行操作(比如pppd和cdrecord)非常有用.如果
没有suid标志的话,那么普通用户(没有root权限)将无法运行这种程序.
见<>第58页.
-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd
对于设置了suid的文件,在它的权限标志中有"s".
-k 设置粘贴位,见<>第65页.
对于"sticky bit",save-text-mode标志是一个文件权限的特殊类型.如果设置了这
个标志,那么这个文件将被保存在交换区,为了达到快速存取的目的.如果设置在目录
中,它将限制写权限.对于设置了sticky bit位的文件或目录,权限标志中有"t".
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/
如果一个用户并不时具有stick bit位的目录的拥有者,但是具有写权限,那么用户只
能在这个目录下删除自己所拥有的文件.这将防止用户在一个公开的目录中不慎覆盖
或者删除别人的文件,比如/tmp(当然root或者是目录的所有者可以随便删除或重命名
其中的文件).
-O 你是文件的所有者.
-G 文件的group-id和你的相同.
-N 从文件最后被阅读到现在,是否被修改.

f1 -nt f2
文件f1比f2新
f1 -ot f2
f1比f2老
f1 -ef f2
f1和f2都硬连接到同一个文件

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))

字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为"null".就是长度为0.
-n 字符串不为"null"
注意:
使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
或者就是未用""引用的字符串本身,放到[]结构中(见Example 7-6)虽然一般情况下可
以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.[1]

混合比较

-a 逻辑与
exp1 -a exp2 如果exp1和exp2都为true的话,这个表达式将返回true

-o 逻辑或
exp1 -o exp2 如果exp1和exp2中有一个为true的话,那么这个表达式就返回true

<< 左移1位(每次左移都将乘2)

<<= 左移几位,=号后边将给出左移几位
let "var <<= 2"就是左移2位(就是乘4)

>> 右移1位(每次右移都将除2)
>>= 右移几位
& 按位与
&= 按位与赋值
| 按位或
|= 按位或赋值
~ 按位非
! 按位否?(没理解和上边的~有什么区别?),感觉是应该放到下边的逻辑操作中
^ 按位异或XOR
^= 异或赋
|| 逻辑或
&& 逻辑与

阅读全文...

2008年4月18日星期五

PHP的mhash和mcrypt支持

志愿通的网站需要添加mhash和mcrypt模块
首先在SourceForge上下载mhash和mcrypt (mcrypt要下载Libmcrypt和mcrypt两个包)
mhash下载
mcrypt下载
下载后先安装Mhash

# tar zxvf mhash-0.9.9.tar.gz
# cd mhash-0.9.9
# ./configure
# make install

按照PHP手册的配置安装Libmcrypt

# tar zxvf libmcrypt-2.5.8.tar.gz
# cd libmcrypt-2.5.8
# ./configure --disable-posix-threads
# make install

最后安装mcrypt,mcrypt与以上两个包有依赖性的,因此必须按此顺序安装
直接configure报错:configure: error: "You need at least libmhash 0.8.15 to compile this program. http://mhash.sf.net/"
由于先前安装了mhash,多半是没有找到mhash的lib文件的路径,修改LD_LIBRARY_PATH:

# cd mcrypt-2.6.4
# LD_LIBRARY_PATH=/usr/local/lib ./configure
# make
# make install

安装成功!
重新编译PHP:
./configure --with-mcrypt[=DIR] --with-mhash[=DIR]
查看phpinfo,成功添加mhash和mcrypt模块!

阅读全文...

2008年3月19日星期三

MySQL同步故障:" Slave_SQL_Running:No"

今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
....
Seconds_Behind_Master:NULL

原因:
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.

解决办法I:
1.首先停掉Slave服务:slave stop
到主服务器上查看主机状态:
记录File和Position对应的值。


mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000020 | 135617781 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)

3.到slave服务器上执行手动同步:

mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3307,
> master_log_file='mysql-bin.000020',
> master_log_pos=135617781;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)

再次查看slave状态发现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
解决办法II:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;

阅读全文...

2008年3月6日星期四

使用DBLINK创建oracle数据库链接

首先保证所有的oracle能够识别其他的host,编辑/etc/hosts做命名和IP的对应;
编辑所有的tnsname.ora,保证所有的oracle均能够通过统一的命名访问其他的oracle
数据库全局名称可以用以下命令查出:
SQL>SELECT * FROM GLOBAL_NAME;
修改可以用以下语句来修改参数值:
SQL>ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
I.当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。

oracle数据库之间进行连接通讯。
创建数据库链接的语法如下:
CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’


这样在某一台数据库上都能够操作其他的数据库,例如
如果我们在oracle3上要查询oracle4上的一个表:
oracle3 sql> select id,name from table1@oracle4;

注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。

一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。

II.当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样
通过视图global_name可以获得当前参数的设置:
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------
WAPDB.REGRESS.RDBMS.DEV.US.ORACLE.COM

我们可以通过如下命令修改GLOBAL_NAME
SQL>conn / as sysdba
SQL>update props$ set value$ = 'oradb' where name = 'GLOBAL_DB_NAME';
SQL>commit;
SQL>shutdown immediate
SQL>startup

之后再创建dblink即不带域名。

注意:
1)dblink名必须与远程数据库的全局数据库名(global_name)相同;
2)用户名,口令为远程数据库用户名,口令;
3)主机字符串为本机tnsnames.ora中定义的串;
4)两个同名的数据库间不得建立dblink;
然后,你就可以通过dblink访问远程数据库了。

参考:
oracle数据库链接及数据合并的问题?
在oracle下如何创建database link全面总结
Global_name从何处来?

阅读全文...

2008年2月28日星期四

MSN登不上去,Windows无法自动更新的解决办法之一

可以试一试重新注册一些dll:

1.在 运行 中 cmd后依次执行:
regsvr32 /u softpub.dll
regsvr32 /u wintrust.dll
regsvr32 /u initpki.dll
regsvr32 /u dssenh.dll
regsvr32 /u rsaenh.dll
regsvr32 /u gpkcsp.dll
regsvr32 /u sccbase.dll
regsvr32 /u slbcsp.dll
regsvr32 /u mssip32.dll
regsvr32 /u cryptdlg.dll
exit

2.重启系统
3.再次在“运行”中执行:
regsvr32 softpub.dll
regsvr32 Wintrust.dll
regsvr32 Initpki.dll
regsvr32 Dssenh.dll
regsvr32 Rsaenh.dll
Regsvr32 Gpkcsp.dll
Regsvr32 Sccbase.dll
Regsvr32 Slbcsp.dll
Regsvr32 Mssip32.dll
Regsvr32 Cryptdlg.dll
exit

阅读全文...

2008年2月21日星期四

继续==>关于访问Blogspot

以前介绍了个用Your Freedom访问被GFW阻挡的网站(当然包括我们的Blogspot了),今天发现一个超简单的方法来直接访问Blogspot:修改hosts!
以我的Ubuntu为例:
# vi /etc/hosts
127.0.0.1 localhost
127.0.1.1 victor-desktop
72.14.219.190 deepseabug.blogspot.com
72.14.219.190 ddmmc.blogspot.com

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

OK,什么都不用设置就可以访问我的Blogspot了,哈哈。
至于原因嘛,tracert一下就知道了。

另外还有个方法,就是使用IE/firefox自动配置脚本
Windows下为例:
在FireFox中自动配置代理的地址是:file:///d:/setup/proxy.pac
而在IE中,自动配置脚本的地址应该是:file://d:\setup\proxy.pac
proxy.pac的内容如下:
function FindProxyForURL(url,host){
if(dnsDomainIs(host, ".blogspot.com")){
return "PROXY 72.14.219.190:80";
}
if(dnsDomainIs(host, ".googlepages.com")){
return "PROXY 208.67.219.130:80";
}
if(dnsDomainIs(host, ".wikipedia.org")){
return "PROXY 66.230.200.101:80";
}
if(dnsDomainIs(host, ".wordpress.com")){
return "PROXY 72.232.101.41:80";
}
if(dnsDomainIs(host, ".livejournal.com")){
return "PROXY 204.9.177.19:80";
}
if(dnsDomainIs(host, ".soup.io")){
return "PROXY 77.244.245.130:80";
}
return "DIRECT";
}

阅读全文...

使用mod_limitipconn和bw_mod实现Apache限速

近几天单位某个分网站下载量过大,导致服务器负载很高,拖得其他网站访问也很慢。限速喽~
网上查了下,Apache限速一般都是通过mod_limitipconn和bw_mod两个模块实现。
mod_limitipconn
限制每IP的连接数
mod_bandwidth
限制目录总的带宽使用
话不多说,开始安装:
➩ 首先安装bw_mod模块,官方网站: http://www.ivn.cl/apache/
我是用DSO安装的apache,所以也使用apxs来安装插件,指令如下:
# tar zxvf mod_bw-0.8.tgz
# cd mod_bw
# $APACHE_HOME/bin/apxs -i -a -c mod_bw.c
设置Apache的conf文件:
BandWidthModule
OnForceBandWidthModule On

BandWidth 211.67.64.0/255.255.255.0 100000 //211.67.64.0的用户带宽限制为100K
BandWidth all 10000 //其他用户带宽限制为10K
LargeFileLimit .avi 500 10000 //文件大小超过500K的avi文件限制为10K

// 定义错误码和错误页面
ErrorDocument 510 /errors/maxconexceeded.html
BandWidthError 510

➩ 接下来安装mod_limitipconn模块,官方网站:http://dominia.org/djao/limitipconn2.html
仍然使用DSO的方式来安装这个插件,命令如下:
# tar zxvf mod_limitipconn-0.22.tar.gz
# cd mod_limitipconn-0.22
修改Makefile文件,指定apxs和apachectl的位置
# make install
设置Apache的conf文件:
ExtendedStatus On
LoadModule limitipconn_module mod_limitipconn.so

# 可以将IP线程限制加到虚拟主机里面
<VirtualHost www.abc.cn>
ServerAdmin webmaster@abc.cn
DocumentRoot /data/webapp/abc
ServerName www.abc.cn
<IfModule mod_limitipconn.c>
<Location /bigfiles>//注意这里是虚拟主机根目录下的文件夹
MaxConnPerIP 5
# 在此目录中,除了image文件之外每IP最多保持5个连接
NoIPLimit image/*
MaxConnPerIP 1
</Location>

<Location /mp3>
MaxConnPerIP 1
# 在此目录中,对于audio音频文件每IP最多保持1个连接
OnlyIPLimit audio/mpeg video
</Location>
</IfModule>
</VirtualHost>

重启Apache,完成限速。

阅读全文...

2008年2月13日星期三

邮件服务器Disk Full

昨天发现邮件服务器不能收发邮件了,检查看/var分区满了。进去看/var/spool/clientmqueue有大量小文件。这些是sendmail发送mail时没有发出去的邮件队列。进入这个目录执行 ls | xargs rm -f(文件太多,不能直接rm -f *,系统会说argument too long的)。OK,一切恢复正常。

阅读全文...

2008年1月25日星期五

解决“由于应用程序配置不正确,程序未能启动”

昨天不知道怎么搞的,3天没用Windows就给我找茬,所有基于.Net的程序都报错:“由于应用程序配置不正确,程序未能启动”(包括卡巴斯基,MS Office2007,MSN, MS VS2005...)
折腾半天,又是修复系统的,还是没搞定。刚终于百度到一个好方法:
在目标机器安装VCRedist_x86.exe可以解决这个问题。该文件可以在MSDN网站上下载。
Microsoft Visual C++ 2005 Redistributable Package (x86)下载
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)下载
原因:


        一般认为,VC2005编译出来的东西,如果用了atl或者mfc,需要atl80.dll 或者msmfc80.dll,我在一开始的时候也是这么认为的,我把这两个文件放在了path中可以找到的地方。因此用depends看出来是没问题的。
        但是事实上,从VC2005开始,(可能2003,但是我没有用过)这些dll是不像以前的程序那样直接被加载进进程的。查看%SYSTEMROOT%\winsxs会发现里面有很多类似于x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_6e805841的目录,这些目录里面包含了atl80.dll, msmfc80.dll。然后在manifests 目录里面有对应的manifests:
x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_6e805841.manifest
这是VC8的一个改变。VC8编译的程序在运行时加载动态库(crt, mfc, atl )都是放在一个类似全局类型库的地方。不再像以前MS所建议的那样,为了避免dll hell而把动态库放在程序同级目录。而这个全局类型库的地方就是winSxS,同时加载之前还需要有该dll对应的manifest。
        具体加载dll的时候为什么需要Manifest我不是很清楚,Visual C++ 2005的 program manager Martyn Lovell在他的blog中有提到要解释这样做的原因,但是至今没有下文:(
        暂时能够知道的是,加载dll需要manifest,没有manifest的动态库即使放在path下也不会加载。而VCRedist_x86.exe会帮你把manifest和dll放在正确的地方。

阅读全文...

2008年1月24日星期四

Ubuntu下安装Oracle 10g企业管理器

解压三个10.2.1.0的zip包,运行后 ./runInstaller 提示系统不支持
如下:
检查操作系统版本: 必须是redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
未通过 <<<< 解决办法:sudo vi /etc/redhat-release
内容:entOS release 4.4 (Final) 保存退去就可以了

阅读全文...

Unubtu下安装Oracle 10g企业管理器乱码

好不容易Down下来的OEM ./runInstall的时候居然乱码。java中文环境的问题。安装的过程中看到控制台信息显示Orale的安装程序使用的自带的jre放在tmp目录下,退出后就自动删除了,没法配置,Google了一下找到带参数使用系统jre的办法。
当然前提要系统装的jre中文环境显示正常(以JRE1.5.0为例):
$ cd /usr/lib/jvm/java-1.5.0-sun/jre/lib/fonts
$ sudo mkdir fallback
拷贝中文字体到fallback
$ sudo cp ~/ZhunYan.ttf fallback/
$ sudo mkfontscale
此时生成一个fonts.scale文件,将其加到/usr/lib/jvm/java-1.5.0-sun/jre/lib/fonts/fonts.dir后
注意修改fonts.dir成可写属性
$ sudo cat fonts.scale >> ../fonts.dir
修改环境变量
$ sudo vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
:/usr/games:/usr/lib/jvm/java-1.5.0-sun/bin"
此时JRE1.5.0应该就可以正常显示中文了。
接下来就是运行runInstaller了
$ ./runIstaller -jreLoc /usr/lib/jvm/java-1.5.0-sun/jre
OK 中文界面出来了,再也不是一群方框框了,哈哈

阅读全文...

2008年1月23日星期三

[转]RedHat AS4下安装oracle 10g

  系统环境:
  1、物理内存:16G
  2、交换空间12G
  3、禁用secure Linux
  4、已经安装下列包(为简单起见,安装RedHat AS 4时最好选择全部安装):
   A、X Window System
   B、GNOME Desktop Environment
   C、Editors
   D、Graphical Internet
   E、Text-based Internet
   F、Server Configuration Tools
   G、Development Tools
   H、Administration Tools
   I、System Tools



  开始:
  1.下载软件
  2.解压软件
  3.修改host文件
  4.设置核心参数
  5.参数配置
  6.安装
  7.安装后配置


  
  下载软件
  1.Oracle Database 10g Release 2 (10.2.0.1) Software下载位置:
  http://otn.oracle.com/software/products/database/oracle10g/index.html
  解压软件
  1.解压命令:unzip 10201_database_linux32.zip
  2.解压后产生一个包含安装文件的目录(db/Disk1)(实际上解压到一个名为database的目录,不知道是官方文档有误还是怎么回事)



   修改host文件
  1./etc/hosts文件中必须包含a fully qualified name for the server
  <IP-address> <fully-qualified-machine-name> <machine-name>


  设置核心参数
  1.在/etc/sysctl.conf文件中加入下列行:
  kernel.shmall = 2097152
  kernel.shmmax = 2147483648
  kernel.shmmni = 4096
  # semaphores: semmsl, semmns, semopm, semmni
  kernel.sem = 250 32000 100 128
  fs.file-max = 65536
  net.ipv4.ip_local_port_range = 1024 65000
  net.core.rmem_default=262144
  net.core.rmem_max=262144
  net.core.wmem_default=262144
  net.core.wmem_max=262144
  2.运行下列命令改变核心参数:/sbin/sysctl –p
  3.在/etc/security/limits.conf文件中加入下列行:
  * soft nproc 2047
  * hard nproc 16384
  * soft nofile 1024
  * hard nofile 65536
  4.在/etc/pam.d/login文件中加入下列行,如果里面没有的话:
  session required /lib/security/pam_limits.so
  5.通过编辑/etc/selinux/config 文件禁用secure linux,确认其中的SELINUX标记如下:SELINUX=disabled。也可以通过GUI工具(Applications > System Settings > Security Level),选择SELinux禁用该属性。



  参数配置
  1.检查下列包是否安装,若未安装则要先安装:
  # From RedHat AS4 Disk 2
  cd /media/cdrecorder/RedHat/RPMS
  rpm -Uvh setarch-1.6-1.i386.rpm
  rpm -Uvh compat-libstdc++-33-3.2.3-47.3.i386.rpm
  rpm -Uvh make-3.80-5.i386.rpm
  rpm -Uvh glibc-2.3.4-2.i386.rpm


  # From RedHat AS4 Disk 3
  cd /media/cdrecorder/RedHat/RPMS
  rpm -Uvh openmotif-2.2.3-6.RHEL4.2.i386.rpm
  rpm -Uvh compat-db-4.1.25-9.i386.rpm
  rpm -Uvh libaio-0.3.102-1.i386.rpm
  rpm -Uvh gcc-3.4.3-9.EL4.i386.rpm



  # From RedHat AS4 Disk 4
  cd /media/cdrecorder/RedHat/RPMS
  rpm -Uvh compat-gcc-32-3.2.3-47.3.i386.rpm
  rpm -Uvh compat-gcc-32-c++-3.2.3-47.3.i386.rpm
  2.创建下列组和用户
  groupadd oinstall
  groupadd dba
  groupadd oper


  useradd -g oinstall -G dba oracle
  passwd oracle
  3.创建安装oracle的目录
  mkdir -p /u01/app/oracle/product/10.2.0/db_1
  chown -R oracle.oinstall /u01
  4.用root登录,执行下列指令:
  xhost +<machine-name>
  5.用oracle登录把下列行加在.bash_profile文件末尾,注意把其中ORACLE_SID换成自己的实例名:
  # Oracle Settings
  TMP=/tmp;
  export TMP
  TMPDIR=$TMP;
  export TMPDIR



  ORACLE_BASE=/u01/app/oracle;
  export ORACLE_BASE
  ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1;
  export ORACLE_HOME
  ORACLE_SID=orcl;
  export ORACLE_SID
  ORACLE_TERM=xterm;
  export ORACLE_TERM
  PATH=/usr/sbin:$PATH;
  export PATH
  PATH=$ORACLE_HOME/bin:$PATH;
  export PATH


  LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
  export LD_LIBRARY_PATH
  CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
  export CLASSPATH
  #LD_ASSUME_KERNEL=2.4.1;
  export LD_ASSUME_KERNEL



  if [ $USER = "oracle" ]; then
   if [ $SHELL = "/bin/ksh" ]; then
   ulimit -p 16384
   ulimit -n 65536
   else
   ulimit -u 16384 -n 65536
   fi
  fi



  安装
  1.用oracle用户登录。如果用的是X模式,要把DISPLAY设置如下:
  DISPLAY=<machine-name>:0.0; export DISPLAY
  2.在Disk1目录下用如下命令开始安装:
  ./runInstaller
  3.在安装过程中输入合适的ORACLE_HOME和实例名。详细过程就不说了,大家看着提示填写就好。完成后的画面中会有管理端入口地址和sqlplus入口地址。


  安装后配置
  1.编辑/etc/oratab文件设置每个实例的重启标志为“Y”:
  TSH1:/u01/app/oracle/product/10.2.0/db_1:Y


  OK,安装结束了,你可以从浏览器了键入安装完成管理端地址即可登录进行数据库性能监测调整和用户管理了。



  rpm -Uvh参数是更新安装的意思,如果你根本没装这些包,需要用rpm -ivh参数,查看包的参数是rpm -qa|grep 包名


  [root@jsj ~]# cd /media/cdrom/RPMS
  [root@jsj RPMS]# rpm -Uvh openmotif-2.2.3-6.RHEL4.2.i386.rpm
  openmotif-2.2.3-6.RHEL4.2.i386.rpm: not an rpm package (or package manifest): 输入/输出错误
  [root@jsj RPMS]# rpm -Uvh compat-db-4.1.25-9.i386.rpm
  warning: compat-db-4.1.25-9.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
  Preparing...#######################################[100%]
  package compat-db-4.1.25-9 is already installed
  [root@jsj RPMS]# rpm -Uvh libaio-0.3.102-1.i386.rpm
  libaio-0.3.102-1.i386.rpm: not an rpm package (or package manifest): 输入/输出错误
  [root@jsj RPMS]# rpm -Uvh gcc-3.4.3-9.EL4.i386.rpm
  warning: gcc-3.4.3-9.EL4.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
  Preparing... ########################################### [100%]
  package gcc-3.4.3-9.EL4 is already installed

阅读全文...

2008年1月22日星期二

Ubuntu7.1下进入Motorola E6 USBLan

搞了半天终于能在Ubuntu7.1下Telnet进Motorola E6了。
不知Ubuntu7.1下怎么没有zaurus模块了,要自己重新编译内核
参考:http://www.mail-archive.com/ubuntu-bugs@lists.ubuntu.com/msg572598.html

得到zaurus.ko(这里上传一个提供下载)Ver:2.6.22-14-generic zaurus.ko

$ sudo mkdir /lib/modules/2.6.22-14-generic/kernel/drivers/net/usb
$ sudo cp /usr/src/linux-source-2.6.22-2.6.22/drivers/net/usb/zaurus.ko
/lib/modules/2.6.22-14-generic/kernel/drivers/net/usb
$ sudo depmod -a
$ sudo modprobe zaurus
$ sudo modprobe usbnet
$ sudo modprobe cdc-acm

将E6连接方式设置为USB LAN,连接数据线。dmesg可以看到硬件插入的信息:
$ demsg | grep usb | more
[ 4836.364634] usbcore: registered new interface driver cdc_ether
[ 4836.365758] usbcore: registered new interface driver zaurus
[ 4869.864024] usb 5-5: new high speed USB device using ehci_hcd and address 2
[ 4869.997306] usb 5-5: configuration #1 chosen from 1 choice
[ 4869.998786] usb0: register 'zaurus' at usb-0000:00:1d.7-5, pseudo-MDLM (BLAN) device, b6:68:
8a:d2:17:75

这时ifconfig就已经能看见usb0的一个网卡了
$ sudo ifconfig usb0 192.168.1.1
$ telnet 192.168.1.2
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'.

MontaVista(R) Linux(R) Consumer Electronics Edition 3.1
Linux/armv5tel 2.4.20_mvlcee31-mainstone_pxa27x
(none)login: root

OK,久违了的telnet见面出现了,HOHO~
参考:http://wiki.openezx.org/Get_a_shell
http://blog.csdn.net/yingfox/archive/2007/10/18/1831860.aspx

阅读全文...

2008年1月18日星期五

MYSQL:Host 'hostname' is blocked because of many connection errors

连接数据库出错:MYSQL:Host 'hostname' is blocked because of many connection errors
Google了下
这说明mysqld已经得到了大量(max_connect_errors)的主机'hostname'的在中途被中断了的连接请求。在 max_connect_errors次失败请求后,mysqld认定出错了(象来字一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令 mysqladmin flush-hosts。(如:mysqladmin --socket=/data/app/mysql/data/mysql.sock flush-hosts -h 192.168.50.1 -uroot)
缺省地,mysqld在10个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它: shell> safe_mysqld -O max_connect_errors=10000 &
或者直接在/etc/my.cnf里面增加: set-variable = max_connect_errors=500 ,设置之后重启MYSQL生效.
注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的TCP/IP连接有没有问题。如果你的TCP/IP连接不在运行,增加max_connect_errors变量的值对你也不会有帮助!

阅读全文...

2008年1月10日星期四

【转】find命令常用法

find . -size 8 -prune
寻找大小为8个块(8*512=4096 byte,目录文件的大小)的文件,且仅在当前层目录下 (-prune)

find /logs -name 'admin.log.[0-9][0-9][0-9]' -mtime +7 -exec rm {} \;
删除/logs目录中访问时间在7日以前的,含有数字后缀的admin.log.xxx文件.


find . -name "*.LOG" -mtime +5 -ok rm {} \;
在当前目录中查找所有文件名以.LOG结尾,更改时间在5日以前的文件,并删除它们(删除前先给出提示).

find . -name "*.LOG" -mtime +5 -exec rm {} \;
在当前目录中查找所有文件名以.LOG结尾,更改时间在5日以前的文件,并删除它们(不给出提示,直接删除).

find . -name "core" -print xargs echo " " > /tmp/core.log
在当前目录下查找内存信息转储文件,然后把结果保存到/tmp/core.log文件中
(文件可能很多,使用 xargs 能使结果批量而不是一次输出,以避免参数长度限制或一下生成处理进程数过多)

find / -type f -print xargs file
查找系统中的每一个普通文件,然后使用xargs命令(批量输出而不是一下全部输出)来测试它们分别属于哪类文件

寻找当前目录下所有的可执行文件:
[method 1]
[14:11:25 ~]$ more find_exe.sh
#! /bin/sh
find $1 -name "*" xargs file grep -i "executable" awk -F: '{print $1}'
#find $1 -name "*" xargs file grep -i "executable" cut -d":" -f1
[14:11:25 ~]$ find_exe.sh /root
[method 2]
find . -perm -001 -or -perm -010 -or -perm -100
[ 注: 可理解为 find . -perm -744 查找 比权限744更宽松的,包括755(对应位越大越有相应权限,越宽松) ]

根据时间值来查找
[11:53:43 ~]$ touch file1
[11:54:01 ~]$ touch file2
[11:54:03 ~]$ touch file3
[14:11:24 ~]$ find . -newer file1 ! -newer file3
.
./file2
./file3
[14:11:25 ~]$ find . -newer file1 -and ! -newer file3
.
./file2
./file3
[ 注: 列出一个文件精确到秒的时间值: date -r file1 ]

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2002381

阅读全文...