Unix传奇(下篇)
- Unix与黑客文化
- Unix的历史教训
- Unix 家族谱
- Unix的特点
- Unix的影响和哲学
- Unix痛恨者手册
Refresh | This website coolshell.cn/category/operatingsystem/unixlinux/page/5 is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh. |
2009年11月11日,光棍节,Google发布了Go语言,马上,就有网友在http://code.google.com/p/go/上找到了一个Go语言包文件操作源码/src/pkg/os/file.go文件的一个最新改动。这个改动的作者就是那个大名鼎鼎的Unix之父Ken Thompson(看看人家,都这么老了,还在写程序,佩服佩服,真是顶级程序员啊——《程序员的八个级别》),而这个改动的Log Message如下所示(把屏抓下来,以免以后某日被放到墙外或是google.com数据丢失或是Google公司倒闭)
Spell it with an “e”
这是一个很著名的典故,要知道这个典故,你需要知道两件事,一个是Ken Thompson的经典语录,一个是Unix的系统调用。
Ubuntu 9.10刚刚release,就有人在网上发表了贴子告诉大家在装完这个操作系统后,还需要去安装的一些开源免费软件,相当丰富。不过,这个贴子的链接被GFW干掉了,所以,你需要使用Tor的支持,或是使用Google Reader才能查看源文(RSS链接)。而这个贴子非常长,所以我无法作全文翻译,不过这个贴子的内容具有很强的指导意义,所以我在这里为大家总结一下该文所提到的那些诸多的东西。(关于那些如何翻墙的事情怎么做我就不多说了,网上有很多相关的文章,你自己搜索一下就可以找到)
1)第一件事自然是下载那些Ubuntu的镜像站点表,以及更新操作系统的一些补丁。“系统”->“管理”-> “更新管理器”。
2)第二件事是设置文件目录共享。就是在文件夹上点右键,在菜单中选“属性”,然后在对话框中选“共享”,那个对话框整得跟XP几乎一模一样。当然,这需要samba的支持。(sudo apt-get install samba)
3)接下来是设置时间同步。通过NTP(Network Time Protocol)同步你的时间。通过点击“系统”->“管理”-> “时间/日期”,然后选择“Keep synchronized with Internet servers”(和Internet服务器同步),于是你需要安装NTP协议。(sudo apt-get install ntp)
我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的,这就是这个命令的用处。可是,这个命令比你想像的要危险得多,也许很多黑客通过ldd的安全问题来攻击你的服务器。其实,ldd的安全问题存在很长的时间了,但居然没有被官方文档所记录来下,这听上去更加难以理解了。怎么?是不是听起来有点不可思议?下面,让我为你细细道来。
首先,我们先来了解一下,我们怎么来使用ldd的,请你看一下下面的几个命令:
(1) $ ldd /bin/grep linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/libc.so.6 (0xb7eca000) /lib/ld-linux.so.2 (0xb801e000) (2) $ LD_TRACE_LOADED_OBJECTS=1 /bin/grep linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/libc.so.6 (0xb7e30000) /lib/ld-linux.so.2 (0xb7f84000) (3) $ LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 /bin/grep linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/libc.so.6 (0xb7f7c000) /lib/ld-linux.so.2 (0xb80d0000)
第(1)个命令,我们运行了 ldd
于 /bin/grep
。我们可以看到命令的输出是我们想要的,那就是 /bin/grep
所依赖的动态链接库。
第(2)个命令设置了一个叫 LD_TRACE_LOADED_OBJECTS 的环境变量,然后就好像在运行命令 /bin/grep
(但其实并不是)。 其运行结果和ldd的输出是一样的!
第(3)个命令也是设置了环境变量 LD_TRACE_LOADED_OBJECTS ,然后调用了动态链接库 ld-linux.so
并把 /bin/grep
作为参数传给它。我们发现,其输出结果还是和前面两个一样的。
看到标题,读者朋友们肯定第一时间想到的MacPort 。
恩,那是一款非常棒的工具。 不过我更愿意推荐各位使用另外一款工具 Fink(http://www.finkproject.org/).
Fink 项目希望把 Unix 上各种开放源码软件带到 Darwin 和 Mac OS X 平台上。 我们通过修改 Unix 软件使得它可以在 Mac OS X 上编译和运行(“移植”),并提供一个方便的分发系统使得每个人都可以下载和使用它。 Fink 使用 Debian 中的象 dpkg 和 apt-get 等工具来提供强大的二进制软件包管理。 你可以随意选择是下载预编译好的二进制安装包或从源代码自己构建一切。
关于 Fink的安装 ,大部分用户可参见http://www.finkproject.org/download/index.php?phpLang=zh。
不过后面我主要想介绍我的安装方式,因为我的Mac 版本是10.6 64bit.所以还是有些差别。也许上述普通方法有效,但是我并未尝试。
安装步骤如下(感谢 http://sage.ucsc.edu/~wgscott/xtal/wiki/index.php/64-bit_Fink_for_10.6)
相信每一个人对于操作系统的重定向不会陌生了。就是>, >>, <, <<,关于重定向的基本知识我就不说了。这里主要讨论bash的重定向中的一个鲜为人知的东西,那就是bash脚本的函数也可以定义相关的重定向操作。这可不是命令级的重定向,这是函数级的重点向。这并不是一个新的东西,我只是想告诉大家一个已经存在了多年但却可能不被人常用的功能。
关于bash的这个函数级的重定向的语法其实很简单,你只需要在函数结尾时加上一些重定向的定义或指示符就可以了。下面是一个示例:
function mytest() { ... } < mytest.in > mytest.out 2> mytest.err
现在,只要是test被调用,那么,这个函数就会从mytest.in读入数据,并把输出重定向到mytest.out文件中,然后标准错误则输出到mytest.err文件中。是不是很简单?
一说起Unix编程,不必多说,最著名的系统调用就是fork,pipe,exec,kill或是socket了(fork(2)
, execve(2)
, pipe(2)
, socketpair(2)
, select(2)
, kill(2)
, sigaction(2)
)这些系统调用都像是Unix编程的胎记或签名一样,表明着它来自于Unix。
下面这篇文章,将向大家展示Unix下最经典的socket的编程例子——使用fork + socket来创建一个TCP/IP的服务程序。这个编程模式很简单,首先是创建Socket,然后把其绑定在某个IP和Port上上侦听连接,接下来的一般做法是使用一个fork创建一个client服务进程再加上一个死循环用于处理和client的交互。这个模式是Unix下最经典的Socket编程例子。
下面,让我们看看用C,Ruby,Python,Perl,PHP和Haskell来实现这一例子,你会发现这些例子中的Unix的胎记。如果你想知道这些例子中的技术细节,那么,向你推荐两本经典书——《Unix高级环境编程》和《Unix网络编程》。
最近有位站长在用我们WebIM客户端的时候,无法登录我们的WebIM服务器,十分惊讶。 在我们的用户里尚属首例,其实更惊讶的是我的CentOS也遇到了同样的问题。然后分析了这位站长的HttpResponse , Shamee :( 一样的OS.
搜了一下,发现的解决方法都是在代码上。 我想可能关键词有错误,因为我坚信我的问题肯定不在代码上,应该是来自OS本身的限制。于是重新debug了一下代码,报错 permission (13) connection。然后直接在洋人的邮件列表里搜了一下。
问题确定了 是SeLinux(http://zh.wikipedia.org/wiki/SELinux)安全策略的限制。
本文来源:http://www.pma.caltech.edu/Publications/alice.in.unix.land.html
(这是一篇1989年的文章)
Alice 正在在她的显示器上读着一些信息,她开会怀疑所有的事情并不是应该的那样。“程序太大了,而无法适应内存”,她读到。
“一个很奇怪的事情”,她说,“我所做的也就是在启动我的字处理程序会运行了14个TSR(terminate-and-stay-resident 常驻程序)。所有这些程序需要使用4M的内存,我希望我能使用超过640K以上的内存”。
就在那个时候,一个小的白色的顾问(一个非常白的顾问)跑过了房间。“哦,我的外套和领带”,他说到,“我要迟到了。并且是每小时150元。”Alice本想对他说点什么,他却跳到了Alice的显示器里并到在操作系统后面消失了。
很多人都对过命令行提示的重要性不屑一顾,甚至是一点都不关心。但是我却一点都不这么认为,一个好的命令行提示可以改变你使用命令的方式。为此,我在internet上找到一些非常实用,优秀,并有趣的bash的命令行提示。下面我将我最喜欢使用的一些命令行提示罗列如下。
注意 – 要使用下面这些提示,你可以拷贝粘贴这些以”PS1″打头的内容到你的终端上,为了使你的改变永久生效,还要将这些内容粘贴到你使用用户的~/.bashrc文件中去。