2007年9月1日

在 Linux 上使用 Ipmsg 的事项



本文介绍g2ipmsg的安装使用注意事项,包括无法编译安装、显示乱码、安装后无声音、无法传送中文文件名、接收中文文件名乱码等


1、版本选择 --使用2007版的 g2ipmsg。
这是 2007 新开发的 ip messenger ( www.ipmsg.org ),基于 GTK 库,可以单独执行或作为 Applet 放在面板上使用,功能比以前的 JAVA 和 X 版本的完善和稳定--JAVA版不支持文件收发,旧版本好象都不支持接收目录。
如果急用,建议可以先试试用 Wine 跑 win 版本的 ipmsg,但是也不支持接收和发送目录

下面说一下g2ipmsg安装的注意事项

2、解决乱码
下载g2ipmsg解包后找到 g2ipmsg-0.9.1/src/code.c
将文件顶部的宏定义改成
#define IPMSG_INTERNAL_CODE "UTF-8"
#define IPMSG_PROTO_CODE "CP936"
然后重新编译


3、运行 ./configure 不通过
执行 ./configure --prefix=/usr --sysconfdir=/etc --enable-systray
如果不带 --enable-systray ,就不会生成 applet

可以在 make 的时候看一下你的系统差些什么,参照着补全
只要所有组件都齐全,不会有什么问题
需要注意的是:GST是 GStreamer 的 dev 开发包,如果不装也可以编译通过,但是运行的时候新消息没有声音提示
另外网上还有其它的一些报错,比如 gcc 未安装、gettext未安装等,可以依据报出来的错到 google 上搜一下


4、安装后面板的 applet 清单里找不到 g2ipmsg
造成这种情况的可能性很多,可以试一下重启 面板 ( pkill gnome-panel;gnome-panel& )再看看
还可以试一下将 /usr/bin/g2ipmsg 和 /usr/bin/g2ipmsg_applet 拷贝到 /usr/local/bin 下面去(ubuntu )
应该来说Deb安装都不会出现这样的问题,尽量用Deb包安装就没问题,但是网上有些Deb包安装后是日文码的,显示界面里面的中文人名全是乱码,还有些是声音的问题没有解决
可以试着先装Deb包,然后将 make 好的 g2ipmsg 和 g2ipmsg_applet 拷贝过去覆盖


5、无法发送中文文件
因为 g2ipmsg 用 GTK 库写的,如果你的文件名编码是 GB 的,发送时文件名会是乱码,对方就会收到一个空消息,
在发送前将文件名换成 utf-8 的就没有问题了 ( convmv -f gb2312 -t utf8 --notest 测试文档.txt ),可以查阅一下 convmv 的相关用法,如果需要将整个目录里所有文件名换成 utf8 ,用 -r 就行了
还有,如果文件夹名是GB编码的,那么文件夹里面的文件不论是什么编码都无法传送,


6、接收的文件乱码
接收到的文件名总是以 UTF-8 编码的,因为文件管理器 ( Nautilus ) 可以正常显示UTF和 GB 编码的文件名,即始 不同编码的文件名放在一个目录下面,也会显示得很好,但是在终端里看会看到部分文件名正常,另外一些是乱码,这时候也需要用 convmv 将文件名转换一下


7 、新消息没有声音
看一下选项里的声音钩上没有,如果无法选中,参考第3步 configure 中的 GST 部分

2007年8月31日

穿透HTTP代理用 python-xmpp 给 google talk 发消息

python-xmpp 实现了 jabber 的大部分协议,能够用 python 发 jabber 消息
因为 google talk 本身就是基于 jabber 协议扩展的,所以也能给 google talk 发消息


早期的 python-xmpp 不支持 SSL 认证登录,所以只能登到一些非SSL认证的服务器,如 Jabber.org ,再给 google talk 的用户发消息,新版本已经解决这个问题。我现在使用的版本里 auth.py 是 v 1.35 2006/01/18 19:26:43
auth的参数是(节点,密码)
j_CLIENT.auth('shaozx','password')
第一次写的时候传入了 user@gmail.com 导致程序报错,后来跟踪调试,找到了第 143行,
它的本意是通过 user@gmail.com 截断得到 gmail.com,然后 DNS 解晰得到实际服务器 talk.l.google.com,
最后组合得到 user@talk.l.google.com,可是程序里几个变量都叫 server ,把自已也搞糊了!
140 if "DIGEST-MD5" in mecs:
141 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'DIGEST-MD5'})
142 elif "PLAIN" in mecs:
143 sasl_data='%s\x00%s\x00%s'%(self.username+'@'+self._owner.Server,self.username,se lf.password)
144 node=Node('auth',attrs={'xmlns':NS_SASL,'mechanism':'PLAIN'},payload=[base64.enco destring(sasl_data)])
145 else:
146 self.startsasl='failure'
147 self.DEBUG('I can only use DIGEST-MD5 and PLAIN mecanisms.','error')
148 return



我现在使用的python-xmpp里带的 transport .py 版本是 transports.py,v 1.28 2006/01/26 13:09:35
我修改屏蔽了第 182 行,否则使用代理服务器的时候总是报错,无法认证成功,还没想明白为什么
172 def send(self,raw_data):
173 """ Writes raw outgoing data. Blocks until done.
174 If supplied data is unicode string, encodes it to utf-8 before send."""
175 if type(raw_data)==type(u''): raw_data = raw_data.encode('utf-8')
176 elif type(raw_data)<>type(''): raw_data = ustr(raw_data).encode('utf-8')
177 try:
178 self._send(raw_data)
179 # Avoid printing messages that are empty keepalive packets.
180 if raw_data.strip():
181 self.DEBUG(raw_data,'sent')
182 #self._owner.Dispatcher.Event('', DATA_SENT, raw_data)
183 except:
184 self.DEBUG("Socket error while sending data",'error')
185 self._owner.disconnected()


如果是直接连接互联网,connect的写法如下:
j_CLIENT.connect()
中间如果有代理服务器,connect的写法如下:
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
注意 port 变量是整型,用程序代码生成proxy的时候格外要注意,不然会报错
可以参考 python-xmpp 的API文档


如果从命令行或其它地方传入文本,还需要注意编码转换
msg = unicode(msg,'gb18030').encode('utf8')
然后再发送出去
j_CLIENT.send(xmpp.Message('接收者',msg))


sendInitPresence(50)是置发送者状态为“在线”,置发送者状态后接收方会多弹出一个“XXX上线”的消息,我遇到过Palm上的一个jabber客户端,登录成功后就置了一个 0 ,然后死活发不出去消息,晕倒!


自带的程序原型 xsend.py 简化如下:
#!/usr/bin/python
# -*- coding: utf8 -*-
import xmpp

j_CLIENT=xmpp.Client('gmail.com',debug=[])
j_CLIENT.connect(proxy={'host':'192.168.1.254','port':8080,'user':'guest','password':'cisco'})
#j_CLIENT.connect()
j_CLIENT.auth('shaozx','password')
#j_CLIENT.sendInitPresence(50)
j_CLIENT.send(xmpp.Message('shaozx@gmail.com','test'))


写python的东西感觉架着滑翔机,
对老手来说是一种享受,而新手战战兢兢如履薄冰
最后祝你好运!

修正 libgmail 报HTTP Error 400: Bad Request 的 BUG

前段时间写了一个检查邮件的 python 脚本,调用 libgmail

这几天发现不能用了,总是报 HTTP Error 400: Bad Request

上网搜了一下,是因为 gmail 把 URL 改了,(越来越不厚道了)

来源:http://www.thescripts.com/forum/thread696534.html

修改 libgmail v0.1.5.1

第 317 行
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)

增加一行,变成:
try:
link = re.search(RE_PAGE_REDIRECT, pageData).group(1)
redirectURL = urllib.unquote(link)
redirectURL = redirectURL.replace('\\x26','&')
---

2007年8月30日

SSH的常见使用方法

telnet已经是非常古董级的产品,老的telnet都是明文传送数据(包括密码),很容易被网络上的其它节点监听导致泄密,新一点的telnet加了一层SSL传输加密但是支持不是很广泛。

这里介绍一些SSH命令和使用方法,详细的配置和参数说明可以参考相关的手册。
1、登录
2、使用证书登录
3、穿透防火墙
4、文件拷贝
5、目录挂载



1、登录时指定用户名和主机
ssh 与 telnet 有些不同。后者会提示你输入用户名,而前者默认使用当前的登录用户名,但是大部分情况下,远端要使用的用户名都不是本地登录的用户名
可以用如下方法指定用户名

ssh -l user host
或
ssh user@host

然后系统才会提示你输入 user 用户的密码。
如果是第一次登录该主机,在输入密码前还会看到一段提示你是否接受密钥的对话,输入 yes 按受即可


2、用证书登录
用证书登录可以不用每次手工输入密码,只需要输入 ssh user@host 就直接进入服务器,因此可以将服务器端的密码设得很复杂以提高安全性,但是一定要保护好客户端的证书。
使用证书登书方式需要2份证书文件:
一份放在本地的 $HOME/.ssh目录下面,id_rsa,有点象IC卡钥匙
另一份放在任意多的主机上面,好比IC卡锁,id_rsa.pub

证书文件一般放在 $HOME/.ssh 目录下面,如果你还没有这个目录或者这个目录下没有任何文件,就需要生成新的公钥私钥
在客户端执行:
ssh-keygen -t rsa
(一路回车即可)
会在 $HOME/.ssh 下面产生两个文件
-rw------- 1 biff biff 1671 2007-08-30 10:46 id_rsa
rw-r--r-- 1 biff biff 395 2007-08-30 10:46 id_rsa.pub
id_rsa是私钥,安全级别较高,只允许本人查看
而 id_rsa.pub 是准备送到其它服务器上去的,给别人是没关系的。

有了证书以后就需要把公钥放到服务器上去
ssh-copy-id -i id_rsa.pub user@server
这条命令会提示你输入远端user用户的密码,然后将公钥追加到远端用户$HOME/.ssh目录下面的authorized_keys文件里
遇到新的SSH服务器以后,只需要执行这一步就行了,千万不要重新生成密钥,不然前面的那些主机就又不认得新密钥了

然后试试 ssh user@host ,就可以直接进入,不会再提示你输入密码了。
不过有个例外!如果远端服务器的用户名与密码相同,你使用密钥登录就不会成功


3、穿过代理服务器 ( 摘自 Open SSH Client 官方文档 )
ssh本身不能穿透代理服务器,需要配合其它的程序进行转发
在 fedora 中,检查是否已经安装了 nc ( netcat ),在 $HOME/.ssh/config 文件中增加一行

ProxyCommand nc -X connect -x 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"connect"换成"4"或者"5",这个"4"或者"5"对应你的SOCKS代理的版本。

在Debian 3.2和Ubuntu 6.06中你可以使用connect-proxy程序来连接HTTP代理。首先得安装这个connect-proxy软件包,然后在 ~/.ssh/config 文件中增加类似这样的一行:

ProxyCommand connect-proxy -H 192.168.2.67:808 %h %p

如果你是使用SOCKS代理,则需要把上面的"-H"换成"-S"。

Mandriva 2006与Debian 3.2的情形类似,只是它的软件包和程序的名字都叫connect,作相应的修改就可以了。

( 我在 Ubuntu gutsy 下面穿透 http-proxy 成功 )


4、文件拷贝
如果服务器有ssh服务,就等于一条带加密的FTP传送带,可以进行文件拷贝了。
scp ./file1 user@server:path/file1
将当前目录下的 file1 文件复制到server主机的user用户下 path目录下
反之亦然,可以将远程文件复制到本地


5、挂载远程目录
如果服务器上开启了ssh服务,就可以将服务器上的目录挂载成本地目录,然后就可以直接用 cp / rm 之类的本地文件操作命令来操作远程文件,也能直接用 vi 等命令对远程文件进行编辑,跟操作本地文件一样方便。参考 http://www.pkblogs.com/binsos/2007/06/linux.html

2007年8月10日

中国人在复制什么?

一直在用 Gaim,今天试了一下 Gajim ,印象里这个软件是可以语音的,但是不行

然后上 google 搜了一下 "google talk linux 语音"

呵,好家伙,满满的一屏全是一样的标题:“Linux将可以跟Google talk 语音通话了”

这是我很久很久以前在 linuxfans 论坛上发的一则新闻,

有史以来我也就发过这么一次,而且内容还是从英文网站摘来的

抄也就罢了,竟然很少引用了原文出处的!

我算是有点公德心的,每次引用总是小心意意的加上原文出处,即使忘记了也会再去搜一次

又想起前次那个“昨天,财务找我”的段子

最后的感想是:互联网出名其实很容易,但是不一定是你的名字!

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

唠叨归唠哪,细看了一下 Google 搜索的排名

我在 Ubuntu China 新闻组里发的贴基本上能排上前几位,

而实际情况是:这些有点内涵的贴子都是从我的 blog 上转贴过去的

访问量排第一

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

记得看过一则新闻, Google 正在修改排名的算法

也就是文章排序的先后顺序是按登出时间的先后进行排列

还有正在研发的原创登记,让作者认领自已的原创进行标记

“中国在复制世界”的神话还能走多远?

2007年8月6日

在脚本里用 date 命令获得昨天或明天的日期

UNIX 下面写脚本经常要用到取日期,比如当前应用系统的日期是 2006/07/25,就需要计算出明天的日期2006/07/26,然后根据计算得到的日期做一些预处理,比如日期切牌这类的操作。

在 UNIX 环境下,我一直都是传一条 SQL 给数据库,比如 informix 下(oracle类似):

nextday=`dbaccess $SCH_DBS <<! 2>dev/null | cut -d' ' -f2
output to pipe 'grep -v ^$'
select first 1 date+1 from time_table;
!`

test $? && exit
echo $nextday


LINUX 就不必这么麻烦了。
今天看到一篇介绍 linux date命令 的文章,这里介绍的方法你绝对没试过:


假设计算机日期是 2007/08/06 ( 格式化的处理自已搞定,就是 %Y%-m-%d之类的,我就不罗嗦了)

昨天:
date --date='yesterday'
2007年 08月 05日 星期日 19:02:25 CST

前天:
date --date='1 days ago'
2007年 08月 04日 星期六 19:06:34 CST

半小时后: -30 minutes ;上一小时: 1 hour ago;上个月: 1 month ago ;去年:1 year ago


明天:
date --date='next day'
2007年 08月 07日 星期二 19:10:12 CST

date --date='-1 days ago'
2007年 08月 07日 星期二 19:08:51 CST

半小时后: 30 minutes ;下一小时: 1 hour;下个月: 1 month ;明年:1 year 一个月零五天: 1 month 5 day


有意思吧!想想还需要什么功能?

下周:
date --date='1 week'

周未:
date --date='this sunday'

变态组合一下:
date --date='-30 minutes -2 weeks +2 months'

?? 怎么解释?? (把飞机票送过来,时间是)在两个月提前2周半小时 ...... 够变态的!!


这还不够,还需要传入自已给定的时间作参数,计算指定日期时间之前或之后的时间:

我儿子十岁生日:(中国人的习惯是十周岁提前做,嘻嘻)

date --date='2008-08-08 08:08:08 UTC+8 +8 year -8 months' +'%F %T'
2015-12-08 08:08:08

呵呵,这句话的解释是 ^_^ ??

你自已折腾去吧。。。。。



二进制生存 http://www.pkblogs.com/binsos

2007年8月5日

理性看待LINUX桌面应用的现状

-----------------------------
引自 SUSE中文组
http://groups.google.com/group/SuSE_Chinese/browse_frm/thread/213b86da2f1425e4
>很多"全日制"Linux使用者都是网络管理员或程序开发员, 特别是对开发UNIX程序的程序员来说,Linux绝对是利器。

最后一句话是对的 其它都是在胡说
楼主 windows够易用了 linux有些地方不得不打命令 windows不得不打命令的地方很少 因为图形界面出来的早 完善的多了 家用的时
候完全不用打 这让刚接触电脑不久的人没恐惧了
你说的这种情况见证了windows的脆弱性 因为windows的文件结构很不清晰 也不划分开来 内核 驱动 管理工具 命令行全挤一起 你装个什
么软件它就变慢了 你用一段它就快挂了
你是转载的还是杜撰的啊?如果都不是 那你真强 我对你的敬仰之情犹如滔滔江水连绵不绝 也不至于玩到这地步吧
------------------------------

我从98年开始接触LINUX,但一直仅限于接触,只是装装看看,了解一下LINUX的发展状况。


参加工作以后,大概是2001年,工作比较闲的时候就开始用Linux架一些http\ftp\dns之类的服务,感觉linux在服务器方面大有作为,但是身边一直没有成功的案例。当然,这也代表着国内LINUX应用的当时的现状--说的多、用的少。

直到2004年才见到第一个案例,是我的一个同事用redhat as4架了一个日报社的web站点(http://www.cb315.com),用的jsp/tomcat。



2005年的时候遇到了suse 10.0,感觉眼前一亮,这才是第一个让我感觉能够真真使用的桌面版LINUX,在5月份的时候,装了win/linux双系统,基本上停在linux下面不进windows了。

当时我是在杭州做一个银行BI项目的开发,工作相对简单--UNIX C编程,只需要telnet就行了,gnome-terminal多标签当然是这方面的利器。

2006年的时候又接触了sshfs和ftpfs,能够将HP-UNIX的远程目录挂载成Linux的本地目录,这样就能够用VIM编辑C程序,不用再受罪忍受标准UNIX-VI了,而且经过一年的使用和学习,自已也写了一些shell脚本用于日常使用,这更增加了对linux的依赖。

这时候已经从“windows是不可或缺的后盾”转变成“进了windows就不适应”。

2006年应该是转折性的一年,从这时候开始,基本上都是在虚拟机里面使用windows,用虚拟机主要还是office和erwin解决不了。


我是绝对的Linux支持者,但还不至于让狂热冲昏头脑,

目前linux服务器应该已经走向实用阶段,虽然标准化和易用性方面已经无人可及,但是在高端应用特性和硬件驱动支持上还是比不上专用的UNIX系统

但是桌面,还仅仅是一个启步。虽然有一些电脑厂商开始预装LINUX,但是这些经过精心处理得"很象windows"的linux仍然是只是能用,并不够用和好用。

WINDOWS仍然占领着主流操作系统市,非IT技术人员对其知之甚少,大部分用计算机的人其实并不知道LINUX的存在。

MS OFFICE套件仍然占领着主流市场,Linux下的相关软件只能兼容,但是无法改变用户的使用习惯和第一体验。就比如很多接触永中office的人都称赞它做得棒,就是因为它做得跟ms office一个样,符合用户的习惯,其实它的功能和应用的广泛性不一定比得上open office

IE,这是一个不能不说的痛,特别是在国内,网银ActiveX的应用,就不多说了。另外,Firfox2.0在速度上超过了ie6,但是感觉还是不及ie7,但这中间可能有IE是集成在系统内核中的原因,但是ff的插件绝对是一流的

IM上面,QQ经常连不上,MSN和GT的语音功能还不完善,路还很长。

2007年7月31日

艰难的往前走: MS Office 与 IPMSG 在 Linux 上的现状

两年前下决心在笔记本上装上 Linux ,当时的想法很简单:只要 telnet 和 vim 就能工作。

因为是为 UNIX 小型机编程,确实只要这两个东西就可以工作了。
但是,实际上还要不时的看看 DOC 文档,经常的要用飞鸽传书(ipmessenger,ipmsg)收发文件。

Word文档格式基本上就是行业标准,这个大家都深有体会,虽然可以用 OpenOffice 打开,但是启动速度让人难以忍受,界面难看至极。
后来试了一下永中office 2007,启动速度、界面都接近 MS Office,最棒的是有些时候 Word 版本出现兼容问题的时候(officexp 的文件在 office2003 上打不开),用 永中office 打开另存一个就好了,特搛面子。不过永中也有缺点:是试用版、由JAVA底层特性带入的因字体库引起乱码。

至于ipmsg,已经是项目组的“行业标准”了,虽然飞鸽传书有 Xwindows 的版本,但是不支持收发文件。
只好用 Wine 模拟,但是收发文件时中文窗口总是乱码,最要命的是不支持传送目录。人家要是想发一个目录过来,还得找人家压一压打包重新再传送。
一年后出了 g2IPMsg,GNOME版本、支持文件传送。无论界面、功能、稳定性各方面都达到了可用的标准。
但是,也不是没有问题。
G程序都用utf-8作内码,传送文件时如果文件名是GB编码就无法传送,还得把文件名转成UTF-8的,发送完毕再转回来。
还好写了一个Natualis的脚本,要传送的时候点一下让脚本去转换,不然累死。

这就好比一对小情侣私奔,
如果日子过得好,大家还会传为美谈;
如果度日艰难,大家就会投来异样或鄙视的目光。
我现在的日子还算过得去。。。。

现在总结一下,转到 Linux 前,需要拟一份 windows 下必需使用的软件、环境,然后装上双系统在 Linux 试用一段时间。如果能找到一个与你工作性质类似的人,而他已经在 Linux 下工作了比较长的一段时间,那就太好了!!

2007年7月20日

[不想妖化 Linux ] 我的 Linux 语录

我一直挂在嘴边的一句话是:“ windows 都用不好的人,就别试 linux 了 ”
走近 Linux 就是一场炼狱。

--自评:“少年不识愁滋味,独上高楼。。。。”



炼狱,一直没有深究这个词是什么意思,好象坏人进了进了地府要炼狱,也好象说是圣人成功前所受的苦也是炼狱
不想妖化Linux,但是它绝不是天堂。

--自评:听过,也新身经历身边 Linux 试用者在地狱里兜了半圈逃出来。。。。



一直想写一篇文章吐一吐胸中的苦水,着实,在笔记本上用了近两年的 Linux ,苦水真是倒也倒不完,但总也抽不出时间来,最近一段时间 Linux 已经离我们更近了,身边有好几个朋友和同事试着要装一个,这才想到,是该给大家提个醒了。但是还是没时间--因为要说退一个准备试用LINUX的人,非常非 常难!

--自评:我很矛盾,一方面我期待身边的Linux社团壮大起来,另一方面,十年过去了,现在仍然不是一个合适的时机。



我不准备谈 Windows + Vmware 跑 linux 的情况,绝大部分没接触过 Linux 的人都会选择这种方式,这好比坐在电视机前看火星 登陆-- 安全、舒适、平静。

--自评:实战才是发现问题的最佳方式,但是对大部分人来说,没有问题可能更能取悦他们



我真真要帮助的是那些准备离开地球,要实实再再的把家搬上火星的朋友们!
搬家前想清楚,搬过去了就别再回来!我在火星等着你们!!

--自评:我可以提供搬家的帮助,但是不要期望我会帮你打扫房子,自已的房子还是要自已装修和打理的

想想挺容易:用脚本改变当前 shell 的环境变量

前言

世上有些事就是这样的,想想挺容易,下手做的时候才发现问题多多
所以,学技术活呀,千万不能眼高手低
明明已经成功N次的操作,可能就会在第N+1次难倒你!!
这不,差点撞到流血。。。。。


引子

---引自我在 Ubuntu China 的发贴

不用 . 或 source 还有没有别的办法修改当前环境变量??

当前环境变量里 a=kkkkkkkk,运行脚本 export a=sssssss ,在脚本运行过程中(fork)变量a是被改了,可是子进程结束 后,当前环境变显的a没有受到影响。

bash里有没有类似C的setenv函数?

---难题说破了就不难了,继续往下看之前想想你有什么高招??


背景

在 Linux 下面改环境变量也不是第一次了,通常是在命令行下面输入: export ORACLE_SID=test ,即刻生效。

如果要长期生效,自然就是加到 .bashrc 或 .profile 里面去,终端启动时会自动加载

如果修改了 .bashrc 或 .profile 文件, 用: . <点号> 把文件读出来执行一遍就行了,如:
. $HOME/.bashrc

其它的还有如,bash的 env、export,ksh的setenv、source,C语言的getenv,setenv等等。


问题

前几天遇到一个这样的问题:
当前环境变量存放了 CVSROOT 的信息:
CVSROOT=:pserver:USER1@host:/cvsdir
当多个客户以 USER1 登录到系统以后,要各自使用自已的用户名操作 CVS

脚本如下:
-------------- mycvs -----------------
#!/bin/bash
printf "%s" " enter your cvs account : "
read user_name

cvs logout
unset CVSROOT

export CVSROOT=":pserver:${user_name}@host:/cvsdir"
cvs login
------------------------------------------

分析

其实是个为了简化操作的脚本,思路很简单,就是重置一下环境变量,然后调用 cvs login 重新登录。

结果呢?问题来了。。。。。这个脚本不能直接运行。

如果在控制台输入 mycvs 运行,当时以新用户名(CVSROOT=":pserver:myname@host:/cvsdir)登录了,但是登录之后的操作,如 cvs commit 等,仍然使用的老环境变量CVSROOT=:pserver:USER1@host:/cvsdir。

!!!!无法更改环境变量!!!!


( 现在回想起来是非常明显的错误,当时还是迷糊了半天 )


我们知道,SHELL 执行一个脚本时是 fork() 一个子进程,所以脚本运行时,都在一个新的环境里面。用 unset 或 export 修改的环境变量其实是一件“复制品”。等到脚本运行完毕,当前 SHELL 的环境变量压跟就不受任何影响。

开始的时候,还在幻想用 C 语言重写这个脚本,因为 C 语言的 setenv() 是直接对内存指针操作的,SHELL 没有能力更改环境变量是因为不能突破 ENV 的限制,但是 C 能够。
现在想想,即始用 C 语言能够实现我所要的效果,也绝不是简单的用 setenv() 就能解决的,因为 setenv() 也是使用的一份“复制品”的环境变量,这些都没逃出 FORK 的圈套。

后来有人提醒我,去掉脚本的Magic标识部分,即不要 #!/bin/bash的部分。这的确令我眼前一亮,痛骂自已怎么忽略了这一点。
我们知道,如果文件是 #!/bin/bash 开头,BASH会将其识别成 BournShell ,但是如果没有Magic头,就会只作为一般的命令行集执行,这两者是有区别的。
但是仍然不行。

(说个题外话,用C语言能通过内存扫描找到并修改环境变量,实现我想要的效果吗?这中间会涉及到安全因素吗?)



结果(两天以后)

找到一个变通的办法, 思路如下:

先写一个脚本,内容是
----------test.sh ------------
read name
export MYNAME=$name

然后在 .bashrc 里定义
alias chgname=". test.sh"


-----this is a very dirty way, 求其它解法 ----

2007年7月12日

sqlplus 里 backspace 键的映射

登到远端 redhat + Oracle 10g,
进入 SQLPLUS 里面按 backspace 键不能删除字符,总是不停的出现 ^H ,

修改 Gnome-Terminal 里的“兼容性设置”,
将“按 backspace 产生” 从 “ctrl+H” 改成 “ASCII DEL”,再按 backspace 可以删除前面的字符了,
可是到了AIX上面又不行了,在 ksh/vt100下面全是 ^?

后来在网上找到一个修正的办法:

Add the following line to your .login file:
    stty erase ^H
This will make backspace work correctly in your sqlplus session.

将 stty erase ^H 加入到启动脚本(如 redhat 的 .bash_profile,或 .profile等 )即可解决

stty 是用来显示和修改虚拟终端特殊键键值定义的,这是一个历史遗留问题。
最早的终端键盘只有标准的ASCII键,所以UNIX对键码的应用非常谨慎,仔细想想 VI 为什么要用 hjkl 作为光标移动键,而不用上下左右?就是这个原因了!

用 stty -a 可以看到当前的扩展键值定义和其它传输属性:
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke



2007年6月28日

用 VIM 管理 Oracle 的 SQL 历史

本文介绍一种方法,尝试用 VIM + SQLPLUS 的方法模拟出 informix 中 dbaccess 的 SQL 读入、运行功能。


可以试试在 vim 的 .vimrc 里面定义这样的热键:

nmap <silent> <F2> :1,.y<CR>:bel new<CR>p:%!sqlplus -s user/passwd<CR>

开一个 vim 写 SQL,写完以后按 F2 就可以从开头执行到当前行

---------解释------------
:1,.y 复制从第一行到当前行
:bel new 在当前窗口下方开个窗口(容纳运行结果)
p 把SQL粘到下面的窗口
:%!sqlplus -s user/passwd 把SQL传给 sqlplus 执行
---结果:上窗口显示编辑的SQL,下窗口显示运行结果---

(你也可以修改一下,改成按 Fx 执行全文,但是我觉得“执行到当前行”更灵活一些)

至于 SQL 历史保存的问题,我写了一个脚本,名字叫 d (很眼熟吧,infomix下用的这个名子,已经成了开 dbaccess 的专用缩写),内容如下:
biff@biffasus:~/bin$ cat d
#!/bin/bash

mkdir -p $HOME/.oracle
cd $HOME/.oracle

vi $HOME/.oracle

cd -

其实什么都没干,很神奇吧(不过你的VIM版本要支持目录编辑)
vim 带参数是目录时它会显示目录下的文件供你编辑,如下:

" ============================================================================
" Netrw Directory Listing (netrw v109)
" /domain/home/biff/.oracle
" Sorted by name
" Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj
" Quick Help: :help -:go up dir D:delete R:rename s:sort-by x:exec
" ============================================================================
../
./
@@test.sql
create_t_cif_info.sql
cur_speed_test.sql
zh16encoding.sql

看到没有,目录下的SQL显示给你供选择,可以直接对SQL文件删除、改名
用光标上移、下移选择文件,回车开始编辑SQL,光标移到最后一行按 F2 开始运行

2007年6月26日

SQLPLUS微型手册

SQLPLUS微型手册

1、启动参数
sqlplus -s 使用 silent 模式(不输出版本相关信息)
Usage: SQLPLUS [ ] [[/] [@]]
[@ [ ] [ ] ...]
where ::= { -s | -? }
-s for silent mode and -? to obtain version number

userid/password@db -- Connection details
/nolog -- Do not login to Oracle. You will need to do it yourself.
-s or -silent -- start sqlplus in silent mode. Not recommended for beginners!
@myscript -- Start executing script called "myscript.sql"



2、查看帮助
> help set
显示关于 set 命令的帮助
> help TOPIC
显示所有可以提供的帮助信息


3、调用SQL语句
> r
执行上一条SQL,与输入 / 效果相同

> r 2
执行缓存里编号为2的SQL

> @ nn
执行当前目录下的 nn.sql 文件


4、保存SQL语句
> save nn
将当前语句存入 nn.sql
> save nn app
将当前语句追加到 nn.sql
>help save
SAV[E] [FILE] file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]]


5、查看表和表结构
>select * from tab;
>select table_name from user_tables;
>desc mytable;


6、改密码
> grant connect to identified by ;


7、配置监听器访问远程主机
修改 $ORACLE_HOME/network/admin/tnsnames.ora ,加入远程主机信息,格式:
local_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL= TCP)(Host= hostname.network)(Port= 1521))
(CONNECT_DATA = (SID = remote_SID))
)
local_SID 给远程主机取的本地名字
HOST 写IP地址
remote_SID 远程连接的库实例名

然后 'sqlplus user/pass@local_SID'


7、使用 & 操作
> select &amp;name from dual;
Enter value for name: *
old 1: select &name from dual
new 1: select * from dual

D
-
X



8、用sqlplus启动和停止实例
$> sqlplus /nolog
> conn system/passwd as sysdba
然后就可以
> startup 启动实例
> shutdown 关闭实例


9、初始化 sqlplus 的环境变量
. oraenv
export ORACLE_SID=[orcl] ? orcl


(摘译自:http://thomas.eibner.dk/oracle/sqlplus/ , 还可以参考 http://orafaq.com/faqplus.htm )

整合 SQLPLUS & VIM

习惯是一种很有意思的事情:有人把 Linux 改成 windows 的操作方式,觉得这样更易用;有人在 Windows 下面加入 linux 的功能,这样顺手点。
在 informix 的 dbaccess 下习惯了整合 vi 进行编辑,现在进到 sqlplus 第一句话就是“怎么不能用 VI 编辑?”。没办法,习惯了 VIM,不扩展一下真的没法用!

在网上查了一下,大致方法有:


1、在 sqlplus 里设置环境变量 set editor=vim

可以每次在 sqlplus 里输入,或写在 $ORACLE_HOME/sqlplus/admin/login.sql里面每次启 sqlplus 时自动调用。也可以写在 .bashrc 里面,加一句 export EDITOR=vim

然后在 sqlplus> 提示符下输入 edit nn.sql 就调用 vi 编辑 nn.sql 文件了
编辑完毕以后 :wq 保存退出,用 @nn 可以调用 nn.sql ( edit 可以用缩写 ed 代替)

其原理说白了就是调用 vi 编辑当前目录下的 nn.sql 文件(因为文件名没有带路径),保存以后用 @nn 命令调用当前目录 nn.sql

这种方法很原始,最不爽的就是会在当前目录下产生很多 SQL 文件,有用没用的都混在一起了。

参考自:http://www.oracle.com/technology/global/cn/pub/articles/kalosi_vim.html (这篇文章实在头重脚轻,长篇大论讲VIM,讲得也不怎么样,只在结尾提了一下 SQLPLUS 设置)



2、直接在 VIM 里面调用 sqlplus
在shell环境下启动 vim 编写 nn.sql ,如
$> vi nn.sql
select * from tab;
然后在 VIM 里面执行命令 : :%!sqlplus -s system/passwd ,如果有错误信息或执行产生的显示数据都会进入到当前文本。

原理:
sqlplus -s user/pass 用 -s 参数屏蔽 sqlplus 的版本信息,后面跟帐号和密码
!command 是 vim 执行外部命令的方式,如 !ls 就是在 vim 里面调用 ls 命令列出工作目录下的文件
% 号是命令执行的范围,%表示全部。当然也可以用 : :3,15 !sqlplsu -s user/pass 来调用 sqlplus 执行第 3~15 行的SQL语句

这种方法很值得一试:首先,工作环境完全变成 vim,对于熟悉 VIM 的用户来说可以在 VIM 里输入、执行SQL,然后操作结果进入到了 VIM 里面可以接着用 VIM 查看、编辑、过滤,一箭双雕

参考:http://www.oracleadvice.com/Tips/UXvi-sqlplus.htm (很不错的oracle技术网站,文章都是短小精干)

2007年6月25日

开篇语:恶补Oracle

很久以前把 Oracle 当 Access 用了两年
现在真的要在 Oracle 上搞开发了,才悔不当初

刚在笔记本的 Linux 上装了个 Oracle 10g
乱码、缺文件、建库报错、监听启动失败。。。。
折腾得够受

然后才发现
竟然完全不知道怎么关闭,只好 KILL 了,够暴力的
KILL掉以后麻烦又来了,该怎么启动呢,急人哟

恨 Linux 怎么就没有个图形界面的图标让我点击呢

只能从零开始了!!

2007年6月20日

成功升级 Ubuntu 到 7.10 Gutsy,偷着乐

早就把 /etc/apt/source.list 改成Gutsy的源了,但是一直没敢全面升级,趁着晚上事情闲点,终于下了“一刀”。

本来不想在笔记本上升级 Ubuntu Gutsy 的,必竞这是工作环境,风险还是挺大的。

但是每天看着三位数的“软件包可升级”就心里痒痒,先是把几个网络软件包升了,后来还是忍不住,终于全面进入7.10了,大伙一起来品味一下:

一边开着Firefox上网,一边升级,
看着系统界面的工具栏变成很烂的GTK原始风格,接着面板上的IP Messager报错退出,然后系统任务监视的Applet也不知道什么时候停止了工作......心里还是有点紧张的(必竞是因为升级 OpenSuSE Alpha4 失败过转到 Ubuntu 来的 ,有点一朝被蛇咬十年怕草绳的味道)

报了几个提示让覆盖配置文件,最后有几个软件包没能从CN99网站找到,就结束了,准备重启。


第一关: GRUB,已经习惯了但还是很难接受

BIOS自检过了就发现 GRUB 的启动选择界面变回到恶心的黑白文本框了,这个倒是在想象之中,因为每次升级完内核或是重装GRUB,系统都会很“热心”的重新生成一次menu.lst,但是这一点着实有些可恶!

还好有每次修改menu.lst系统都会自动产生备份文件,还原回去就好了。把 menu.lst~拷回成menu.lst,OK,我的GRUB背景又回来了,(我用的是那辆老式自行车bike_gua.jpg的图片,有兴趣的可以上Google找一下 grub splashimages ,其实最棒的是 SuSE 的动画界面,不过也没必要花时间搞这么花哨的东西了)。

第二关:SCIM,吓出了一身冷汗
没有SCIM就等于整个系统报废,一个完整的工作环境没有了中文输入法件非常恐怖的事情,但是还是发生了。启动完毕,没发现什么异常,但是打开Firefox发现五笔没办法输入中文了,打五笔的时候还显示的是汉字,上屏就变成两个英语字母了(出一身冷汗。不过心里还有垫底的,至少Google还支持拼音搜索,虽然解决问题不一定非要输中文的问题描述进行搜索,但是有了Google的这个功能还是能给人不少信心)

上Google查找 Gusty 7.10 Scim,没多少关于Scim的BUG,挑了几个看了看,在常去的http://blog.eshangrao.com找到些信息,照着改了 SCIM的配置文件,把 xcim 改成 scim ,重启X,问题解决(目前还不清楚具体是不是这个原因引起的,因为升级失败的十几个包就有4个是与SCIM相关的,而且包括最关键的socket接口包)

第三关:Themes,实在没道理出现的问题
早就把系统的Themes调成MacOS的风格,一直用得不错。升级过程中界面变回到基本的GTK也就罢了,可是重启完仍旧停在这个难看的界面上就有些不对了。明明我的风格文件都在,为什么不沿用升级前的风格呢?实在有些令人费解!!

打开Themse配置才发现,已经不记得升级前用的是哪些风格了(升级前用的是多格主题里的内容拼出来的MacOS效果),只好再东看看西点点,又凑出个与升级前有几分相似的风格出来。有些后悔了,升级前该把自定义的风格保存成自定义配置留一份的。悔不该呀!!(不过其实也无所谓了,风格嘛,换换也好)

第四关:VirtualBox,启动,OK,没问题

VirtualBox也是出不得一点错的。前次升级的时候已经把VMPlaer搞坏了一直没时间理,如果这次VirtualBox也出个三长两短可要了命了,必竞有个VM跑Windows还是非常必要的,有备无患嘛。还好,因为内核没有升级,VirutalBox直接就启动了(不记是内核是什么时候升上来的了)。

所以,每升一次系统,换笔记本的欲望就增强一次,我盯着T5600很久了一直没机会下手,一直想体会一下KVM下“与内核版本无关”的VM会有多么的可靠。

.........

OK,进系统没问题,SCIM没问题,VirtualBox没问题,Firefox没问题,其它的就出不了什么天大的漏子了,还等什么,你还不快升级去。。。。。。


另外简单看了一下

Tomboy升级到7.1了,增加了Tag功能,似乎很实用,不过我已经有的上百条便签不是又得一条条的加Tag,着实很烦!!

登录界面里有 zh_CN.GB18303 的选项了,但不知道是我升级前已经手工配置过的原因还是新版本添加了这一项(记得7.04只有GBK和GB2312的)

2007年6月19日

修改了 curlftpfs 在挂载 AIX 和 HP-UX 时的问题

ftpfs目前仍然不稳定,我在连接hp-ux时遇到中文日期不兼容等问题,
可以参见我在 ubuntu bug 提交的出错报告 [ 我的QQ是274980,不过很少在线 ]

现在发现的不兼容情况如下:

1、在AIX上,早于6个月的数据会显示年份而不显示分秒。这种情况本来
是在程序的考虑范围之内的,但是不知道为什么程序少去掉了一个空格,
导致部分文件名比实际文件名前多了一个空格,自然访问报错。

I'v reported that curlftpfs 0.9 + libcurl 7.15.5 works unnormal with aix ftpserver,
( https://bugs.launchpad.net/ubuntu/+source/curlftpfs/+bug/120018 )
so,i updated curlftpfs to 0.9.1 and update libcurl to 7.16.2,things goes even badder.

with curlftpfs 0.9.1 + 7.16.2 ( mount remote aix ftp direcotry to local linux system ):
files and directories older than six month are displayed error with a space before it.

I had to modify ftpfs-ls.c ,
line 61:
/* "%5s" "%*c" year */
"%5s" SPACES /* year */
line 73:
/* "%5s" "%*c" year */
"%5s" SPACES /* year */

thing goes well, i can list direcotries and vi files now .
NOTICE!! havn't test under other ftpservers !!

files lists by aix ftpserver is:
-rw-r--r-- 1 smisdep tsgrp 502 Nov 16 2006 card_type
-rw-r--r-- 1 smisdep tsgrp 3853069 Nov 22 2006 info.txt
-rw-r--r-- 1 smisdep tsgrp 7827 Nov 22 2006 inst.txt
-rw-r--r-- 1 smisdep tsgrp 12590 Dec 01 2006 m_bmw_data_fhyzhdzd.txt
-rw-r--r-- 1 smisdep tsgrp 15054 Dec 01 2006 m_bmw_data_dwyqtdwwl.txt
-rw-r--r-- 1 smisdep tsgrp 201344 Dec 11 2006 888
-rw-r--r-- 1 smisdep tsgrp 81308 Dec 21 10:23 111.txt
-rw-r--r-- 1 smisdep tsgrp 4533 Dec 21 10:26 create_cardapp_tabel.sql
-rw-rw-rw- 1 smisdep tsgrp 1528 Dec 25 15:31 makeGroup.log
-rw-r----- 1 smisdep tsgrp 12753 Dec 25 16:37 makegroup.sql
-rw-r--r-- 1 smisdep tsgrp 128 Dec 28 10:44 wlq.sql

files modifed at 2006 have double space before it's name ,and those modifed at 2007
have only one space before it's name.


2、第二种情况还没有汇报(因为这是中文Locale的问题,不知道是否有通用性)
在HP-UX 下面设置FTP服务器显示中文日期后,格式如下:

有多种情况,而且空格的出现也不是非常有规律,为了方便说明,我把 年月日用??
代替,大家应该看得明白

drwx------ 2 pcrm pcrm 8192 6??18?? 09:17 bin
drwxrwxrwx 1 pcrm pcrm 18 2006??6?? 8?? data
drwx------ 2 pcrm pcrm 8192 6?? 7?? 16:12 etc
drwx------ 3 pcrm pcrm 8192 6??18?? 09:17 include
drwx------ 6 pcrm pcrm 8192 3??19?? 10:38 init
drwx------ 3 pcrm pcrm 32768 6??18?? 23:04 log
drwx------ 11 pcrm pcrm 8192 6?? 8?? 16:21 public
-rw-r--r-- 1 pcrm pcrm 22266 5??23?? 11:02 t_mng_reportinfo.txt
-rw-r--r-- 1 pcrm pcrm 15977 6?? 7?? 15:48 t_prod_info.txt
-rw-rw-rw- 1 pcrm pcrm 19070 6??15?? 17:54 time20070531.txt
drwx------ 4 pcrm pcrm 8192 6??18?? 08:48 tmp

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

花了两天时间把 curlftpfs的 ftpfs-ls.c 文件进行了修改(版本是curlftpfs-0.9.1)
增加函数 parse_dir_hpux_zhcn

test code here, ( base on curlftpfs0.9.1 -- ftpfs-ls.c )


支持 AIX 下
-rw-r--r-- 1 smisdep tsgrp 502 Nov 16 2006 card_type

支持 HP-UX 下
drwxrwxrwx 1 pcrm pcrm 18 2006年6月 8日 data

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

2007年6月17日

把远程服务挂载成LINUX目录

本文介绍如何利用服务器端的 samba、nfs、ssh、ftp 中任意一个服务,实现远程目录挂载


把远程主机的目录挂载成本地目录的优点是不言而喻的,
能够将远程UNIX的目录挂成本地目录,就可以:

1、用VIM编辑程序,而不用再忍受VI的折磨(语法高亮、ctags扩展)
2、在本地写脚本进行文件备份、维护、VCS版本管理
3、所有操作不被远程主机的 .sh_history 记录
4、更直观的文件拷贝操作 cp /mnt/unix/src/hello.c ~/dev/hello.c
5、更多


本人用到的一些方法如下:


1、本人很少用到,但是也是最可能用到的 -- samba

在window遍天下的今天,哪个Linux用户身边没几百个windows用户?
samba服务历史非常悠久,这个就不用多说了。

命令行:
smbmount //192.168.0.100/d /mnt/winshare -o gid=users,uid=biff

或按如下格式写到fstab:
//server/share /media/share smbfs user,username=xx,password=xx,fmask=777,dmask=777 0 0

以后就可以直接用 mount /media/share 加载了 ( 后面不作特别说明都参照本例 )



2、最正统,但是几乎遇不到的 -- nfs

这个也不用多讲了,多讲也无益,除了做实验学习用过几次,十几年没用到过。

命令行:
mount server:/usr/local/pub /home/unixshare
fstab:
server:/usr/local/pub /home/unixshare nfs rsize=32768,wsize=32768,timeo=14,intr



3、绝对实用,程序员必备 -- sshfs

需要fuse sshfs模块,这通常都是本地linux默认安装,只要远程主机提供了ssh服务就可以使用。

命令行:
sshfs user@192.168.0.100:/ /mnt/share
fstab:
sshfs#user@192.168.0.100 : /mnt/share fuse user,noauto,uid=biff,gid=user 0 0
卸载的时候用:
fusermount -uz /mnt/share ( fusermount -u 是卸载 )

建议通过证书进行ssh认证,以后 mount /mnt/share 的时候就不用输入密码了。

sshfs是最棒的,传输加密、工作稳定、不需要在fstab里留明文密码

但是如果管理员仍然老土到让你用telnet,那就只好另寻高招了



4、补救手段,有总比没有好 -- ftpfs

虽然本人极力推荐sshfs,但是并不是在每个工作环境都那么好久,

管理员不会因为个人的需要而专程到服务器上装个sshserver,但是ftp例外

只要服务端提供了ftp服务,我们还是能偷着乐一把的

命令行:
curlftpfs user:passwd@ftpserver /mnt/ftpshare -o uid=biff,gid=users
fstab:
curlftpfs#user:passwd@192.168.0.100 /mnt/ftpshare fuse rw,user,noauto,uid=biff,gid=users,noauto 0 0


如果你的管理员甚至不给你提供ftp服务(太毒了),那你还是老老实实telnet上去让vi折磨你吧,我也救不了你!


其中方法3、4用到 fuse 模块,这是目前很流行的 user_space mount 方式,
不需要 root 权限就可以将 ssh/ftp/iso/samba/nfs 甚至 gmail 邮箱挂载成本地目录
可以参考这些关键字到google去关注一下:fuse sshfs ftpfs smbfs nfs gmailphs

另外,使用sshfs的过程中遇到个很奇怪的问题,
可以参见前面的文章:Linux下使用 sshfs 挂载 HP-UX 时遇到的巨大BUG

ftpfs目前仍然不稳定,我在连接hp-ux时遇到中文日期不兼容等问题,
可以参见我在 ubuntu bug 提交的出错报告 [ 我的QQ是274980,不过很少在线 ]

Linux下使用 sshfs 挂载 HP-UX 时遇到的巨大BUG

我在用sshfs挂载HP-UX时出现了下面的情况,大家分析一下:

本地系统是 OpenSUSE 10.2,具体的sshfs和fuse版本不记得了(未升过级)
远端是 HP-UX B.11.11 U 9000/800

sshfs 挂载 deva@hp-ux 到 biff@linux下

远程主机名hp-ux,用户 deva 的 uid=1234,gid=105
本地是linux系统,用户 biff 的 uid=1000,gid=100

fstab内容如下:
sshfs#deva@hp_ux_server:/ /mnt/src fuse
user,noauto,umask=007,uid=1000,gid=100 0 0

(留意下面 test 文件UID及GID的变化)

操作过程大至如下:

第一步
local:/mnt/src$ touch test ( 产生一个 test 文件 )

因为 /mnt/src 是挂载的 hp-ux 的目录,在 hp-ux 的 /dev/src 下会产生一个 test 文件
本地 ls -l 查看,test 文件是属于 linux 的 biff 用户,uid=1000,gid=100
远程 ls -l 查看,test 文件是属于 hp-ux 的 deva 用户,udi=1234,gid=105 (正常)

第二步
local:/mnt/src$ gzip -9 test ( 应该产生一个 test.gz 文件 )

本地 ls -l 查看,test.gz 文件是属于 linux 的 biff 用户,uid=1000,gid=100
远程 ls -l 查看,test.gz 文件是属于 hp-ux 的 1000 用户,uid=1000,gid=100 (出错了)

通过这两步操作,我们会在HP-UX系统上产生一个别人用户的文件(文件的UID != deva用户的UID)
telnet hp-ux ,用户名 deva
rm /dev/src/test.gz 提示没有权限访问

产个一两个异常文件还可以在本端用rm干掉,最要命的是不知什么时候产生了一个bak目录,
这个bak目录在HP-UX主机上用户名、用户组分别是 100/1000,
不论本地还是telnet到远端都不能进入,也不能删除,但是可以改名(因为所在目录的写权限是正常的)

HP-UX竟然轻易的让 deva 用户产生了一个非 deva 用户的文件,我认为这是HP UNIX系统的BUG

大家怎么看??

2007年6月16日

昨天,财务找我

昨天,旁边的一个同事告诉我

同事:财务让你上QQ,有事找你

我我:问她msn行不行,我没装QQ (注:我在linux下面pidgin最近上不了QQ)

......1分钟后

同事:财务说她的msn坏了,让你装一个

......启 Virtualbox,进windows

我我:有没有qq安装文件,发一个我

......1分钟后

我我:晕倒,你给的安装文件里面有病毒, QQxxxClient, AV99木马

同事:啊!我装怎么没发现. ....

...... 打开 QQ,提示输验证码 (输完验证码VirtualBox就死掉,直接退出)

...... 连试三次,发现真的是有问题,不是 VirtualBox兼容性有问题就是QQ的程序有问题

.......3分钟后,重启系统进windows,还好有备无患

.......杀毒软件提示:您已经162天未更新病毒库了

.......4分钟后,升级完病毒库,安装QQ,(仍然发现QQ安装文件有AV99木马,KILL掉 )

...... 输完验证码,进入QQ, ( QQ狂跳3分钟,N多未读消息 )

我我: 你找我?什么事

财务: 工资发了,你查一下

我我: 哦

财务: 886

............... 当场晕倒 ...........


2007/06/16