在Linux安装配置unixODBC

ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。微软公司在1993年以DLL集的方式发布了世界上第一个ODBC产品,现在成为了微软开放服务结构(WOSA,Windows Open Services Architecture)中,有关数据库的一个组成部分。微软的ODBC产品其实就是一个ODBC的驱动管理器,提供一个ODBC应用程序到某种ODBC驱动的接口。在UNIX系统上,有两个开源的ODBC驱动管理器,unixODBC和iODBC。

在Linux下,ODBC可以让一个软件本身不必花费太多的精力而支持多种数据库系统。开源的SIP服务器Asterisk就是这样一个例子。本文就是配置Asterisk服务器的产物,纪录了我将一个MySQL数据库配置为ODBC数据源的详细过程。

类型:LinuxApp,创建时间:一月 1, 2012, 12:16 p.m. 点击查看完整内容。。。
为什么使用SecureCRT或者putty通过ssh登录Linux主机很慢呢

相信很多使用Linux的朋友都会在Windows下使用putty之类的工具登录Linux主机。大家有没有发现,输入密码之后还要过很久才会显示命令提示符。这是不是因为Linux的服务器太糟糕性能太低才会这样呢?其实这是因为OpenSSH在用户登录的时候验证IP。OpenSSH会根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。如果你的网络里没有DNS服务器,或者你的主机名是随便捏造的,花的时间就比较多。

安全和方便有时候两个不得不选一个。我比较希望OpenSSH帮我把等待的时候省起来。方法是修改/etc/ssh/sshd_config文件,添加(或者修改)一行:

UseDNS no

重启一下sshd服务器就可以解决了。

service ssh restart
类型:LinuxApp,创建时间:十二月 31, 2011, 5:39 p.m. 点击查看完整内容。。。
MySQL在初始化权限表时报duplicated key ‘localhost-’错的原因

最近做了一个脚本能够自动将我们在程序以及相应的配置文件、附加库等安装到Linux。平常手动操作的话要半天时间,现在只要十分钟了。而且还大大减少了错误的可能性。这让我十分满意。

可惜这两天碰到一个错误,在脚本安装MySQL的那一步出现了错误。仔细考虑安装MySQL的步骤哪里出错了。首先脚本将从官方网站下载的MySQL解压到/usr/local/project/mysql下。然后根据MySQL安装指南的命令添加mysql用户和组、改变文件的属主以及读写权限,接着运行MySQL的初始化脚本。最后改变data目录的权限。仔细一看,发现只有运行初始化脚本的那个步骤报了错误,其它几个步骤都有达到命令所要求的目的。

初始化脚本的报错信息大概是duplicated key 'localhost-'。之后服务器就没有验证信息,无论使用任何方法都没办法登录(–skip-grant-tables不算)。经过查证,发现这是因为MySQL创建权限表时对于root用户会创建两条记录,一条是root@'localhost',另一条是root@hostname。其中的hostname如果跟localhost重名的话就会报这个错误。

所以这个错误就很好解决了。只要改一下主机名就OK了。。

类型:LinuxApp,创建时间:十二月 31, 2011, 5:32 p.m. 点击查看完整内容。。。
统一KDE3和KDE4程序的外观

使用Linux的朋友应该都会注意到Linux程序的外观通常是不统一的。因为在Linux下面存在着各种各样的图形库。这些图形库由不同的社区维护,在十年之内统一他们估计是不可能的了。想要一个统一外观的Linux,最好的办法只能是尽量选择由使用同一种界面库的程序集合。

目前主流的界面库有三种:gtk2、qt3、qt4。很多Linux下的程序使用GTK2界面库。目前大多数的Linux发行版都使用了GNOME桌面作为默认桌面环境,简单地使用他们就能得到统一的界面了。

从Windows转换到Linux环境的朋友一般会觉得KDE桌面更顺手一些。而且,与GNOME桌面相比,KDE的对应程序功能更加强大,运行更加稳定。可惜,KDE底层界面库最近两年升级,形成了qt3和qt4两种版本。这两个版本使用了不同的配置文件,因为外观上不大一样。不过没关系,使用本文介绍的方法就可以统一他们的外观了。

首先要明白,KDE程序的外观由三部分组成:风格(Style)、颜色(Color)、字体(Font)。风格是指按钮、滚动条、菜单的绘制方法。在KDE的配置程序中,这三个部分都位于“观感(Apperance)”里。

那好,现在就开始动手配置KDE。分别运行KDE3和KDE4的配置程序kcontrolsystemsettings。选相同的风格、相同的颜色、选相同的字体。需要注意的是,KDE3和KDE4相同的风格不是很多,目前只有少数的几种,有些朋友可能就得忍痛割爱了,可能内置的这些风格不是很适合;另外选字体的时候要注意“圆整字体边角(ClearType)”的设置也要一样。我的选择是Plastique(塑料)风格+QtCurve颜色+10号宋体。最后的效果非常好。

上面应该很多朋友可以做到吧。不过还有一些不大容易注意到的,比如root用户的设置可能不大一样,当我们运行管理程序的时候就觉得很碍眼。不过这个也简单,分别运行下面两条命令:

kdesu kcontrol
kdesu systemsettings

就可以打开KDE3和KDE4的设置程序。修改他们跟普通用户的配置一样就OK了。

希望KDE4早日成熟,我们就不用这么麻烦了。

类型:LinuxApp,创建时间:十二月 31, 2011, 5:27 p.m. 点击查看完整内容。。。
用Linux作NAT的简单例子

今天闹了一个笑话。我居然说启用IP_FORWARD之后就是NAT了。

很多有两台电脑的朋友应该都会想怎么样让自己的两台电脑都连上网。 如果其实有一台是WINDOWS的机器,应该是很简单的。只要保证直接连网的机器有两个网卡,然后做一个"Internet连接共享"就可以了。

Linux的机器就比较麻烦一些了。因为Linux下图形界面的工具基本太少。只能用命令来做。同样也是在直接连网的机器(称为Router吧,另一台机器则称为C吧)上安装两个网卡。配置好网络之后,分为三步(都需要root权限):

  1. 启用IP转发。方法是在Router里输入:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  2. 做个NAT。命令是:

    /sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.0.1.0/24 -o eth1 -j MASQUERADE
    

    这条命令比较复杂,/sbin/iptables -t nat -A POSTROUTING是固定的,说明这条命令是做NAT的。

    -s 192.168.1.0/24是指你的两条机器形成的内部网络的网络地址。也可以写成192.168.1.0/255.255.255.0。这两种写法是一样的,详细情况可以Google一下无类IP地址。

    -d 10.0.1.0/24则是外面网络的地址。如果写上这个,表示内部网络的机器只能访问10.0.1.0/24这个网段。通常就不必写了。

    -o eth1,表示凡是满足条件的数据包都转到第2个网络接口上。

    -j MASQUERADE是固定的。。

  3. 在机器C上把默认网关写成Router的IP。

类型:LinuxApp,创建时间:十二月 31, 2011, 5:13 p.m. 点击查看完整内容。。。
在Linux下安装字体

国内很多Linux高手很不厚道。给人介绍一个功能的时候非要用一大堆的命令去做,有时还要修改配置文件。比如安装字体就是一个很典型的例子。

在Linux下安装字体其实是再简单不过的事了。在KDE3和KDE4安装一个TrueType字体都只需要在字体文件上按鼠标右键。在动作里选择“安装字体”。然后KDE会问你是安装到系统目录里还是个人目录里。家用电脑一般无所谓,就安装到系统目录里吧。输入密码就OK了。

类型:LinuxApp,创建时间:十二月 31, 2011, 5:06 p.m. 点击查看完整内容。。。
运行linux的脚本老是出现": No such file or directory"错误

我一直对字符界面有抵触感,即使会用vim,我的linux脚本(python/bash script)一般都是在windows下写完调试好,然后传到linux上的。

不过写好的linux脚本传到linux上运行的时候却经常报这样的错:

$ cat fish.py
#!/usr/bin/env python

print "fish"
$ chmod u+x fish.py
$ ./fish.py
: No such file or directory

找不到文件?可是无论怎么修改脚本,都没办法解决。找不到文件,那应该是第一行的env命令有问题啰?真是让人让人摸不着脑袋,到底是为什么呢?

类型:LinuxApp,创建时间:十二月 31, 2011, 5:04 p.m. 点击查看完整内容。。。
mysql下管理用户的命令

安装完mysql默认的root用户虽然没有设置密码,但是只能在本机登录。如果linux系统本身已经足够安全,这也是一个不错的选择。我见过不少系统,为了操作方便,设置了一些非常简单的密码,这种简单的密码跟不设密码差不多了。

如果要改root用户的密码:首先进入mysql,然后运行

set PASSWORD FOR 'root'@'localhost' = PASSWORD('mypassword');

这条命令也可以用来更改其它用户的密码。从所周知,mysql的用户包含了两部分名字和主机名两部分。所以'root'@'%''root'@'localhost'是不一样的,mysql默认没有创建'root'@'%'这个用户。如果要更改其它用户的密码,只需要替换一下上述命令的用户名部分就可以了。

mysql使用create user命令来创建一个新用户,比如:

create user fish;

就创建了一个名为fish的新用户。使用drop user命令删除一个用户,比如:

drop user 'fish'@'%';

就删除了上面那个用户了。值得注意的是mysql认为单写fish就代表了'fish'@'%'

现在我们创建一个数据库:

:::mysql
create database mydatabase;

然后赋权限给fish这个用户。

grant all on mydatabase.* to fish;

all代表fish拥有该数据库的所有权限,当然,也可以细分权限,比如fish可以只拥有添加数据,而没有添加、删除表的权限。mysql还可以划分细至表的权限,详细的信息查看手册吧。

类型:LinuxApp,创建时间:十二月 31, 2011, 9:57 a.m. 点击查看完整内容。。。
怎么给linux的网卡绑定多个IP

windows下给网卡添加多个IP是很容易的事,那linux下应该怎么做呢?不同的linux发行版有不同的做法。这两天刚好需要做这么一个东西,于是google了一下,在终端下,最普适的方法是使用ifconfig命令。

比如要给第一个以太网网卡绑定192.168.0.1/24这个IP ,192.168.0.1/24这种写法朋友们应该知道吧,24的意思是掩码是255.255.255.0,前24个位是掩码。一条命令搞定:

/sbin/ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0

这里面比较奇怪的是第一个参数eth0:1,据说这个叫虚拟设备?eth0是第一个以太网网卡,如果是第二个以太网网卡的话就是eth1,冒号后面是以0开始的数字,每个IP对应一个。

不过,唯一的问题是,启动系统之后配置的IP就丢了。

对于这个问题,如果是使用redhat的话, 终端下有一个很不错的setup命令。输入setup,选择网络配置,可以看到setup程序列出了所有的网卡,一般就是一个eth0eth1(如果双网卡的话)。我们可以新增一个设备,名为eth0:1,把IP地址和掩码填上去,下次启动就自动添加了这个IP了。想要立即生效的话就运行:

service network restart
类型:LinuxApp,创建时间:十二月 31, 2011, 9:53 a.m. 点击查看完整内容。。。
screen程序使用初探

screen是用于在一个终端上模拟多个终端的linux程序。比如我们使用putty登录到linux,并且要运行多个程序。这时我们就可以使用screen程序。

screen程序的主要特性:

  • 可以模拟多个终端,使用Ctrl+A,N 这样的快捷键方便地切换。
  • 可以把正在进行的工作保存起来,下次登录的时候恢复它们。我们称之为会话管理,每次进行的所有工作组成一个会话。
  • 在不同的终端复制和粘贴,不知道怎么用。。

本文简单介绍screen命令行的使用,以及操作。

类型:LinuxApp,创建时间:十二月 31, 2011, 2 a.m. 点击查看完整内容。。。
配置iptables,把80端口转到8080

今天安装了一个tomcat服务器,不想让服务器直接以root用户运行,就配置了一个低权限的用户给它。但是,众所周知,在unix下,非root用户不能监听1024以上的端口号,这个tomcat服务器就没办法绑定在80端口下。

怎么办呢?有两种方案:

1、使用setuid或者sudo提升程序的权限。这个不好,跟直接用root一样的缺点。

2、把到80端口的服务请求都转到8080端口上。这个又分为两种方法。常见的方法是使用apache监听80端口,然后利用ajp转向把服务转到8080。这个办法有很多好处。比如对于一些静态或者php的url就可以直接由apache提供服务,而只把jsp的请求转到tomcat。这里不再详述。我使用的是第二种方法,利用iptables把80端口映射到8080。很简单,在root权限下运行一条命令:

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

现在就可以看到效果了。不过据说不能拿本机做试验,因为本机的PREROUTING不起效果。你可以拿别人的机器试一下。

大多数Linux发行版本有关于iptables的配置文件,比如基于Redhat的发行版一般有一个/etc/sysconfig/iptables这个文件。使用这条命令把当前的iptables配置写到这个文件里:

iptables-save > /etc/sysconfig/iptables

重新启动机器之后端口映射就仍然有效

类型:LinuxApp,创建时间:十二月 30, 2011, 7:25 p.m. 点击查看完整内容。。。
Linux最近终于有了走向联合的趋势,很好

最近的两个新闻:

显示了Linux阵营正在走向联合,而不是像以前Ubuntu那样的分裂。同时,Linux阵营正在组建越来越多的标准化组织,比如标准化桌面。我觉得这是一件非常好的事。Linux想要发展,这是必由的道路。相信到最后,各个Linux发行版之间会只剩下界面方面的细微差别,软件开发真正编译一次,到处运行

类型:LinuxApp,创建时间:十二月 31, 2011, 12:21 a.m. 点击查看完整内容。。。