阳光男孩

Never give up!

Entries Tagged ‘Shell’

Linux的Shell编程 bash的内部命令

0顶一下bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo, eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。 1.echo 命令格式:echo arg 功能:在屏幕上显示出由arg指定的字串。 2.eval 命令格式:eval args 功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们...[阅读全文]

0
顶一下

bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo, eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。

1.echo

命令格式:echo arg

功能:在屏幕上显示出由arg指定的字串。

2.eval

命令格式:eval args

功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。

3.exec

命令格式:exec命令参数

功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的 Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。

4.export

命令格式:export变量名 或:export变量名=变量值

功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export 把它的变量向上带入父Shell。

注意:不带任何变量名的export语句将显示出当前所有的export变量。

5.readonly

命令格式:readonly变量名

功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。

6.read

命令格式:read变量名表

功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。

7.shift语句

功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2…在程序中每使用一次shift语句,都使所有的位 置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。

8.wait

功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。

9.exit

功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。

10.“.”(点)

命令格式:. Shell程序文件名

功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。

Comments (337)

Ubuntu下执行shell脚本文件

0顶一下首先,要确保这个文件的类型是可执行的。 有两种办法把文件设置为可执行文件。 1) 直接在文件属性标签中选中 “可执行”,–b 如果用的是图形界面,这个方法最简单直接。 2) 使用命令 chmod +x file.sh。将可执行属性添加到文件属性中。 然后,执行这个shell脚本文件。 1) 双击 file.sh 直接运行。 –b 别笑,图形界面的优点: 简单直接。 2) 使用命令 ./file.sh。 –b 好...[阅读全文]

0
顶一下

首先,要确保这个文件的类型是可执行的。

有两种办法把文件设置为可执行文件。

1) 直接在文件属性标签中选中 “可执行”,–b 如果用的是图形界面,这个方法最简单直接。

2) 使用命令 chmod +x file.sh。将可执行属性添加到文件属性中。

然后,执行这个shell脚本文件。

1) 双击 file.sh 直接运行。 –b 别笑,图形界面的优点: 简单直接。

2) 使用命令 ./file.sh。 –b 好像更简单直接哦。

**********************************************************************************

但是,有个问题西西一直没搞清楚, 在其他 linux 操作系统下,大家通常使用 sh file.sh 这样的命令执行 shell 脚本。而在 Ubuntu 下,sh 有的时候不太好用。有人说是因为 ubuntu 默认的是 dash 而不是 bash。

Comments (217)

在Shell中打开Server Socket

1顶一下工作中的一个需求:需要为一个现存的功能,提供Web访问界面。由于这个功能是用Shell编写的,首先想到的解决方案是通过在Shell中开启一个 Server Socket,来实现一个简单的HTTP服务器,提供给浏览器访问。我并不需要实现所有的HTTP协议,只要能够处理特定的GET请求即可。这个简单的 HTTP服务器将会从浏览器发送的GET请求中截取指定参数,然后通过系统调用执行现存的Shell脚本。在网上查找...[阅读全文]

1
顶一下

工作中的一个需求:需要为一个现存的功能,提供Web访问界面。由于这个功能是用Shell编写的,首先想到的解决方案是通过在Shell中开启一个 Server Socket,来实现一个简单的HTTP服务器,提供给浏览器访问。我并不需要实现所有的HTTP协议,只要能够处理特定的GET请求即可。这个简单的 HTTP服务器将会从浏览器发送的GET请求中截取指定参数,然后通过系统调用执行现存的Shell脚本。在网上查找了一下Shell Socket的相关信息,发现实现技术还挺多。摘录了两种方法(为简明起见,所列代码做了简化),记录于此以备忘。

1.Perl

01use strict;

02use IO::Socket;

03

04my $server_socket       =       IO::Socket::INET->new

05(

06        LocalPort       =>      2010,

07        Listen          =>      SOMAXCONN,

08        Proto           =>      ‘tcp’,

09        Reuse           =>      1,

10        Timeout         =>      60

11) or die “SERVER SOCKET ERROR!n”;

12

13while(1) {

14        next unless my $connection = $server_socket->accept;

15        my $url = get_url($connection);

16

17        if ($url =~ /^.*\/(\?param=(.*))?$/) {

18        if ($1) {

19            system((“myshell”, $2)); #myshell是现有功能的shell程序

20        }

21                send_page($connection);

22        } else {

23                send_404($connection);

24        }

25        $connection->close;

26}

27

28sub send_404 {

29        my $sock = shift;

30        print $sock “HTTP/1.1 404 NOT FOUND\r\n\r\nNOT FOUND\r\n”;

31}

32

33sub send_page {

34        my $sock = shift;

35        my $html = “HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n” .

36                “<html><head><meta http-equiv=’Content-Type’ content=’text/html; charset=UTF-8′/>” .

37                “<title></title></head><body><form method=’get’><input type=’text’ name=’param’/>” .

38                “<input type=’submit’ value=’Submit’/></form></body></html>\r\n”;

39

40        print $sock $html;

41}

42

43sub get_url {

44        my $sock = shift;

45        my $line = “”;

46        while(($line = <$sock>) ne “\r\n”)

47        {

48                if ($line =~ /GET ([^ ]+) /) {

49                        return $1;

50                }

51        }

52        return “”;

53}

保存脚本为appserver.pl, 以”perl appserver.pl &”启动,然后用浏览器访问:2010/”>http://<ip>:2010/即可。由于Linux发行版上一般都自带 Perl,这个方法的适用性还是比较普遍,不过需要熟悉一点Perl语法。

2.nc命令

1while(/bin/true)

2do

3    nc -l -p 2010 -c “$(cat /path/to/myshell)” #myshell从标准输入读取http请求,将http响应打印到标准输出

4done

这种方式可以完全通过shell来实现,相对简洁,但要求nc支持-c选项,且myshell必须是sh语法(不能使用bash)。如果把 shell脚本换成二进制程序,可以使用-e选项。不过有些Linux发行版上默认的nc不支持-c和-e选项(在ubuntu desktop和RHEL上就不行,但在ubuntu server上可以)。

由于部署环境是RHEL,最终我使用了第一种方式来实现我的需求,但第二种方法也很有吸引力。通过在Shell中使用Server Socket,可以轻易地将一个普通脚本或程序包装成一个网络服务,这在某些情况下非常有用,比如来自产品人员或决策者的临时的访问某些功能或数据的需 求。

Comments (218)