知识大全 在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相关参考