知识大全 在Shell中打开Server Socket

Posted

篇首语:没有锯不倒的树,没有敲不响的钟。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Shell中打开Server Socket相关的知识,希望对你有一定的参考价值。

在Shell中打开Server Socket  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

   Perl

   use strict;

   use IO::Socket;

  

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

   (

           LocalPort       =>     

           Listen          =>      SOMAXCONN

           Proto           =>      tcp

           Reuse           =>     

           Timeout         =>     

   ) or die SERVER SOCKET ERROR!n ;

  

   while( )

           next unless my $connection = $server_socket >accept;

           my $url = get_url($connection);

  

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

           if ($ )

               system(( myshell $ )); #myshell是现有功能的shell程序

          

                   send_page($connection);

           else

                   send_ ($connection);

          

           $connection >close;

  

  

   sub send_

           my $sock = shift;

           print $sock HTTP/ NOT FOUND\\r\\n\\r\\nNOT FOUND\\r\\n ;

  

  

   sub send_page

           my $sock = shift;

           my $ = HTTP/ OK\\r\\nContent Type: text/; charset=UTF \\r\\n\\r\\n

                   <><head><meta equiv= Content Type content= text/; charset=UTF />

                   <title></title></head><body><form method= get ><input type= text name= param />

                   <input type= submit value= Submit /></form></body></>\\r\\n ;

  

           print $sock $;

  

  

   sub get_url

           my $sock = shift;

           my $line = ;

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

          

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

                           return $ ;

                  

          

           return ;

  

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

   nc命令

   while(/bin/true)

   do

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

   done

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

cha138/Article/program/Java/hx/201311/26300

相关参考