2007-10
25

所谓交互式的rpm包,就是说在安装过程中接受用户输入,来完成诸如许可证确认、创建配置文件等工作。

首先要说明,不推荐使用rpm创建交互式安装包。rpm的设计目标就是在完全不需要用户干涉的前提下完成软件的安装、升级等工作,这样可以通过cron或者yum/apt/up2date等脚本完成自动安装和自动升级。而交互式rpm包将破坏这种特性。另外,通过图形界面安装rpm包时,交互式脚本将完全不能执行(因为没有终端)。因此,在rpm中执行脚本时,标准输入是被关闭的,也就是说你无法在rpm安装过程中获得任何用户输入。

但有时真的需要创建交互式rpm包,如迫于工作压力,或者创建内部使用的安装程序,或者作为产品分发给完全不懂计算机的用户等。虽然rpm中的脚本无法获取用户输入,但方法总是人想出来的。

我们知道在spec文件的%post节中可以书写bash脚本,而通过read命令可以获取用户输入。但如果在%post中使用read命令,你会发现read并不等到你输入而是直接就结束了。原因就是rpm安装时关闭了标准输入。我们可以手动将它重新打开,方法就是在read之前加入以下代码:

exec 6<&0 0</dev/tty       # 将标准输入保存到6,然后在标准输入上打开/dev/tty
read MYVAR
exec 0<&6 6<&-               # 恢复备份的标准输入并关闭6

当然标准输入(0)本身就是关闭的,所以不备份应该也无所谓。/dev/tty是指向用户控制台的一个链接,在命令行控制台和远程终端的情况下都可以正确使用。



2007-08
25

最近发现公司的小孩儿们都开始学Linux了,可惜学的都是那些超级麻烦的命令,唉。 其实Linux这样用更简单些……

改IP,可以用 netconfig,可惜每次都得输入完整的IP、掩码、网关和DNS。 不如直接 vi /etc/sysconfig/network-scripts/ifcfg-eth0 再 /etc/init.d/network restart 来得快。

改DNS,最快的就是 vi /etc/resolv.conf,不用重启。

重启httpd,/etc/init.d/httpd restart 要比 service httpd restart快,因为前者可以补齐而后者不能。

修改系统服务,用chkconfig要比setup方便。

看最新的log,用 tail -f /var/log/xxx.log 比 vi /var/log/xxx.log 方便。 看不清的话就先 clear 再 tail -n 0 -f /var/log/xxx.log。

用好bash的历史记录

压缩解压缩别动不动就tar czvf/tar xzvf,要养成不用v的好习惯。文件多了要快上好几倍。

两台机器传文件,scp 要比samba方便。windows的话就装个cygwin,或者用PuTTY自带的pscp.exe也行。

测试网络连接,nc 192.168.1.10 80 要比 telnet 192.168.1.10 80 好用。

修改samba配置,直接修改 /etc/samba/smb.conf 要比图形界面方便。



2007-08
13

下面对fcicq中的这篇文章 别拿这些太当回事: 就这些命令做一些解释, 做个深入浅出版的哈。

其实就是这些命令的排列组合:

  • awk用于写简单脚本;
  • sed用于正则表达式替换;
  • sort用于排序;
  • uniq用于统计。
阅读全文 »

2007-05
17

RedHat系如何查看已安装的软件包的大小,在精简系统时很有用。

for i in `rpm -qa`; do echo -n $i; rpm -qi $i | grep Size | gawk '{ printf("    %s\n", $3); }' ; done > list

分开写就是

for i in `rpm -qa`
do
    echo -n $i
    rpm -qi $i | grep Size | gawk '{ printf("    %s\n", $3); }'
done > list


2007-03
27

忙了一天做幻灯片,累死了。看来就算是自己熟悉的东西,想要给别人讲明白也不是件容易的事儿。 好在工作中发现了一个有用的命令:fc,使得今天总算有点乐趣。fc是bash的一个内部命令, 作用是修改命令历史中的命令。man bash然后搜索fc即可看到用法。

顺便总结一下bash命令行历史的用法:

history
命令查看以前用过的命令行列表。
!123
执行命令历史中编号为123的命令。
!cat
执行最后一条以cat开头的命令。
!!
执行上一条命令。
fc
打开编辑器(vim)编辑上一条命令。
fc 123
编辑命令历史中编号为123的命令。
fc 123 130
编辑命令历史中123-130的八条命令,退出后依次执行
fc ls
编辑最后一条以ls开头的命令。
fc -s ls=cat ls
将最后一条以ls开头的命令中的ls替换成cat,然后执行


2006-12
12

Linux的screen命令不错,习惯了你会觉得它比windows的任务栏好用多了。下面是我的.screenrc,仅供参考。

#
# ~/.screenrc
#

# 启动时不显示欢迎屏幕
startup_message off

#  定义screen的功能键为Ctrl-Z。向终端输入Ctrl-Z时应按 Ctrl-Z z。
escape ^Zz

# 屏幕缓冲区 1024 行。
defscrollback 1024

# 在最下一行显示窗口列表和时钟
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rY}%n %t%{-}%+w %=%{..G} %H(%l) %{..Y} %Y/%m/%d %c:%s "

# 关闭错误提示
vbell off

# 按 Ctrl-Z w 或 Ctrl-Z Ctrl-W 显示窗口列表
bind w windowlist -b
bind ^w windowlist -b
阅读全文 »

2006-12
08

大家都知道Linux下的date命令可以查看或修改系统时间,其实它还能用于日期计算等,十分方便。

首先是最基本的查看、修改时间。

[root@local ~]# date
Thu Dec  7 21:47:52 JST 2006
[root@local ~]# date --set='2006-12-08 14:01:00'
Fri Dec  8 14:01:00 JST 2006

指定日期显示格式,具体的格式指定方法参见 date --help。

[root@local ~]# date +%Y%m%d
20061208
[root@local ~]# date +%F
2006-12-08
[root@local ~]# date +%s
1165554109
[root@local ~]# date -R
Fri, 08 Dec 2006 14:02:09 +0900

时间计算。

[root@local ~]# date -d "2 days ago" +%F
2006-12-06
[root@local ~]# date -d '15 years' +%F
2021-12-08
[root@local ~]# date -d '30 minutes ago'
Fri Dec  8 13:57:17 JST 2006


2006-12
08

用curl下载网页估计大家都会,但是模拟 multipart/form-data 形式的 form 上传文件则稍稍复杂些。命令行如下。

curl -F "action=upload" -F "filename=@file.tar.gz" http://localhost/action.php

如果使用了-F参数,curl就会以 multipart/form-data 的方式发送POST请求。-F参数以name=value的方式来指定参数内容,如果值是一个文件,则需要以name=@file的方式来指定。

如果通过代理,上面的命令有可能会被代理拒绝,这时需要指定上传文件的MIME类型。

curl -x myproxy.com:1080 -F "action=upload" -F "filename=@file.tar.gz;type=application/octet-stream" http://localhost/action.php

另外,如果不上传文件,则可以使用 -d 参数,这时curl会以 application/x-www-url-encoded 方式发送 POST 请求。

curl -d "action=del" -d "id=12" http://localhost/action.php


2006-11
22

主机名一般是在安装时设定好的,若想修改,则需要进行以下步骤。

  1. 执行命令 hostname,修改当前系统的主机名
    # hostname newhost
  2. 修改 /etc/sysconfig/network,使得下次启动时使用新的主机名
    hostname=newhost
  3. 修改 /etc/hosts。不修改的话,apache等需要解析主机名的服务将不能启动
    127.0.0.1    newhost localhost
  4. 最后就是命令行提示符中的主机名还没有改变,如果很在意的话,重新登录一下就行了


2006-11
03

这里有一篇关于如何安装 Ubuntu 6.06 的文章,虽然有些老了,但是本文是在这篇文章的基础上写成的,看看也许能有些参考。

修改 /etc/source.list,将其中的所有 dapper 替换成 edgy。

如果你使用了 http://packages.freecontrib.org/ubuntu/plf/ 的源,则要将这个源的 dapper 替换为 edgy-plf,并执行以下命令以添加公钥。

# wget http://packages.freecontrib.org/ubuntu/plf/12B83718.gpg -O- | sudo apt-key add -

然后执行

# apt-get dist-upgrade

注意观察要更新的软件包,你会发现安装程序需要删除一部分软件,包括显卡驱动!所以升级之后图形界面会有问题,这个问题我们升级以后再修复。

然后就是漫长的下载和安装过程。

如果你以前修改过登录界面(gdm)的主题,那么在安装新版时,安装程序会提示你是否要覆盖/etc/gdm/gdm.conf-custom文件。

Configuration file `/etc/gdm/gdm.conf-custom'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : background this process to examine the situation
 The default action is to keep your current version.
*** gdm.conf-custom (Y/I/N/O/D/Z) [default=N] ?

这时你可以选择 d,然后复制下自己修改过的部分,然后选择 Y 安装新版 gdm.conf-custom,安装结束后将自己的修改内容恢复即可。

安装成功之后重新启动计算机……啊?gdm启动失败……这正是由于上面升级时删掉了显卡驱动的问题。此时先按Ctrl+F2切换到控制台,然后登录系统并切换到 root 用户,执行下列命令:

# apt-get install libgl1-mesa-glx

然后再执行

# apt-get install xorg

如果你以前安装过 ATI 或者 GeForce 的官方显卡驱动,那么系统中的 /etc/X11/xorg.conf 为使用官方驱动的版本,而升级时官方显卡驱动被卸载了,因此需要将 xorg.conf 恢复成安装显卡驱动之前的状态。假设当初安装的是 ATI 驱动并且使用 aticonfig 命令自动配置了显卡,那么原始的 xorg.conf 会备份成 /etc/X11/xorg.conf-original-0,用这个文件恢复即可。

# cp /etc/X11/xorg.conf-original-0 /etc/X11/xorg.conf

然后再次重新启动,这样就可以进入图形界面了。

备注:据旺旺同学的经验,如果按照以上的方法还是不能恢复的话,可以试试以下两个命令:

# apt-get remove xserver-xorg-driver-ati
# apt-get install xserver-xorg-video-ati