分类 Unix,Linux,BSD 下的文章

在Ubuntu中一些经常使用的参数操作方法,脚本环境为 sh / bash

#最后一个守护进程pid
echo " last daemon process id : $! "

#exit退出状态
echo " exit status : $? "

#当前脚本进程
echo " process id of this script : $$ "

#脚本名
echo " script name : `basename $0` "

#第一个参数
echo " first param : $1 "

#所有参数
echo " all params : $* "

#所有参数
echo " all params : '$@' "

#参数长度
echo " params length : $# "

以下一些扩展方法,需要 bash 环境


#倒数第一个参数
#或 ${$#}, 但由于大括号中不能嵌套$符号, 要用!代替
echo " last param : ${!#} "
echo " last param : ${@:${#@}} "

#倒数第二个参数
echo " last 2nd param : ${@:${#@}-1:1} "

#最后两个参数
echo " last 2 param : ${@:${#@}-1} "

#从第二个到最后一个参数
echo " from 2nd to last param : ${@:2} "

#从第2个参数开始,连续2个参数
echo " from 2nd, count 2 : ${@:2:2} "

维护服务器时,有可能需要热插拔硬盘,但是Linux好像并不买单,不会自动检测磁盘的装卸,为此热插拔后,我们需要通知Linux服务磁盘状态。

#添加磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#删除磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#查看磁盘
cat /proc/scsi/scsi
#命令输出
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR00 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 01 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02

参数解析:
HOST 是硬盘所在SCSI控制器号(本例中,磁盘所在通道为2);
CHAN 是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
DEV 是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
LUN 是硬盘的lun号(默认情况都是0)

add-apt-repository ppa:relan/exfat 
apt-get update

apt-get install exfat-fuse

mkdir /mnt/exfat
mount.exfat-fuse /dev/sdc1 /mnt/exfat

add-apt-repository 是由 python-software-properties 这个工具包提供的,只有 ubuntu 09.10 之后版本支持。

1: syslog.conf的介绍

对于不同类型的Unix,标准UnixLog系统的设置,实际上除了一些关键词的不同,系统的syslog.conf格式是相同的。syslog采用可配置的、统一的系统登记程序,随时从系统各处接受log请求,然后根据/etc/syslog.conf中的预先设定把log信息写入相应文件中、邮寄给特定用户或者直接以消息的方式发往控制台。值得注意的是,为了防止入侵者修改、删除messages里的记录信息,可以采用用打印机记录或采用方式来挫败入侵者的企图。

2: syslog.conf的格式

/etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进行分隔(使用空格间隔是无效的)。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。如下行所示:
类型.级别 [;类型.级别] TAB 动作

2.1 类型
保留字段中的“类型”代表信息产生的源头,可以是:

auth    认证系统,即询问用户名和口令
cron    系统定时系统执行定时任务时发出的信息
daemon  某些系统的守护程序的syslog,如由in.ftpd产生的log
kern    内核的syslog信息
lpr     打印机的syslog信息
mail    邮件系统的syslog信息
mark    定时发送消息的时标程序
news    新闻系统的syslog信息
user    本地用户应用程序的syslog信息
uucp    uucp子系统的syslog信息
local0-7 种本地类型的syslog信息,这些信息可以又用户来定义
*       代表以上各种设备

2.2 级别
保留字段中的“级别”代表信息的重要性,可以是:

emerg   紧急,处于Panic状态。通常应广播到所有用户; 
alert   告警,当前状态必须立即进行纠正。例如,系统数据库崩溃; 
crit    关键状态的警告。例如,硬件故障; 
err     其它错误; 
warn    警告; 
notice  注意;非错误状态的报告,但应特别处理; 
info    通报信息; 
debug   调试程序时的信息; 
none    通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除邮件信息外其它信息都送出。

2.3 动作
“动作”域指示信息发送的目的地。可以是:

/filename   日志文件。由绝对路径指出的文件名,此文件必须事先建立; 
@host       远程主机; @符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。
user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息; 
*           所有用户。所有已登录的用户都将收到信息。

3: 示例
我编译的MiLinux中使用了如下配置

# First some standard log files.
*.*;auth,authpriv.none;mail.none        /var/log/syslog
*.alert;*.crit;*.err                    /var/log/syserr
auth,authpriv.*                         /var/log/auth.log
mail.*                                  /var/log/mail.log
# Emergencies are sent to everybody logged in.
*.emerg                                :omusrmsg:*

假设有变量

var=http://www.google.com/test.htm

# 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是:www.google.com/test.htm

## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除http://www.google.com/
结果是:test.htm

% 号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.google.com

%%号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是:www.google.com/test.htm

从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:test

从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:test.htm

替换一部分内容

echo ${var/com/net}
echo ${var//com/net}

表示从左边开始,替换第一个(或全部)com为net
结果是:http://www.google.net/test.htm

变量默认值

var=google
echo ${var:+yahoo}
echo ${var:-baidu}

第一行表示变量不为空时输出yahoo,第二行表示变量为空时输出baidu
结果是:yahoo google

注1:左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示
注2:替换时,不可以使用 regexp , 只能用 ? 的文件扩展方式
注3:以上操作基于ubuntu和 http://www.anrip.com/webox 平台*