显示标签为“Linux技巧”的博文。显示所有博文
显示标签为“Linux技巧”的博文。显示所有博文

2014年8月22日

Linux Meld 比较工具,升级后怎么设置字符编码

Meld 升级到 3.11 版本后,原来设置语言文字编码的选项消失了。
没有了编码检测设置,在比较文件时常会遇到 "无法提取文件 文件不是使用 ['utf8'] 进行编码的" 或者 "Could not read file, file is not in encodings: ['utf8']"。
参考这里:Meld 3.11.0 and encoding
in meld 1.8.4 I had the option "Encoding". Here I used "utf8 latin1".
In meld 3.11.0 there is no "Encoding" options. It seems to use only utf8.
By comparing some of my files I get the error message:"Could not read file"
--------------------
There is no UI for it. You can set the encodings that will be tried in
Meld's 'detect-encodings' gsettings key.
按网上的回答就是:界面设置编码的地方没有了,配置里面仍然有效。

解决办法:
1、 用命令查看当前设置的编码
      gsettings  get  org.gnome.meld  detect-encodings
2、 用命令设置支持哪些字符集编码检测
      gsettings  set  org.gnome.meld  detect-encodings  "['utf8','cp936','latin1']"

2011年1月13日

挖掘 type 命令

今天测试个脚本,居然发现 ifconfig 命令会找不到,呖。。。。开发无止境,测试无止境!!

修改了一下,用 type 命令重新定位一下,判断系统中 ifconfig 命令的位置,代码如下:
IFCONF="/sbin/ifconfig"
[ ! -x "/sbin/ifconfig" ] &&
IFCONF=`type ifconfig | awk '{print $3}'`

接着又发现新问题了,type 的返回信息很“丰富”啊。。。
启动 bash 以后运行 type ifconfig 返回 ifconfig is /sbin/ifconfig
运行一次 ifconfig 后再运行 type ifconfig 返回 ifconfig is hashed (/sbin/ifconfig)

查看一下帮助,看看有没有什么参数可以用,type --help,
type: usage: type [-afptP] name [name ...]
不过,只有bash才支持这些参数;非POSIX的东西,不敢多用。

为了保证可靠性,修改代码:
IFCONF="/sbin/ifconfig"
[ ! -x "/sbin/ifconfig" ] &&
IFCONF=`type ifconfig | awk '{print $NF}' | sed 's/(\|)//g'`

当然,仍然不放心。。因为 type 有时候还会有这样的输出格式:
(bash) type type --> type is a shell builtin
(ksh) type type --> type is an alias for 'whence -v'

如果某人在环境变量里面 alias ifconfig='ifconifg -a' 了,这个脚本会报错吗?
好象不会,有兴趣可以研究一下。。。。。

2009年12月4日

一些好记又实用的免费DNS服务器

以前总是记本省电信的DNS,问题是出了省这些DNS往往无法访问
外加上国内DNS污染非常严重,后来就不敢用国内DNS了,直接用OpenDNS

OpenDNS : 208.67.222.222 208.67.220.220 还是比较好用的

年初买了个G1,发现G1用的DNS是非常好记啊,速度也快
4.2.2.1
4.2.2.2
4.2.2.3
4.2.2.4
4.2.2.5
在 twitter 上还听到过一个DNS ,长得比较可爱
4.3.2.1

刚刚 google 又出了免费 DNS 服务

8.8.8.8
8.8.4.4

基本上,同学们可以不必再用电信的垃圾DNS了。

2007年10月23日

Intel 声卡不能用 ALSA驱动

新买的T61用的Intel声卡,用Mplayer时只能用 OSS驱动,改成 ALSA 就报找不到声卡

今天偶然的切到另外一个新用户环境下面去,发现居然可以用ALSA,估计是老的环境变量设置引起ALSA的设置不对。

受了好几周的罪,今天终于解决了:
biff@lenovo:~$ asoundconf list
Names of available sound cards:
Intel
biff@lenovo:~$ asoundconf set-default-card Intel
biff@lenovo:~$
然后就OK了

(并不象网上所说的不能用ALSA驱动,也有可能是网上的资料有些老了)

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的东西感觉架着滑翔机,
对老手来说是一种享受,而新手战战兢兢如履薄冰
最后祝你好运!

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月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年7月20日

想想挺容易:用脚本改变当前 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月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,不过很少在线 ]