Dou*_*uch 3 sockets apache perl
使用 Perl 脚本连接本地主机上运行的 Java 服务,传递加密的 cookie,并返回解密的数据。当我从命令行运行脚本时,它工作正常。甚至给 apache 用户一个 shell,并以该用户的身份从命令行运行,这也可以正常工作。如果脚本从 apache 作为 CGI 运行,则套接字 new 返回 undef 和 $! 设置为“权限被拒绝”。???
该服务器上运行 CentOS 6.3,并且 IPtables 被禁用。
#!/usr/bin/perl
use strict;
use CGI;
use IO::Socket;
use JSON;
my $cgi = CGI->new();
my $cookie = $cgi->cookie('attESSec') || shift (@ARGV) || undef;
my $data = JSON::false;
if($cookie){
my $socket = IO::Socket::INET->new(
'PeerHost' => '127.0.0.1',
'PeerPort' => '1500',
'Proto' => 'tcp'
);
if($socket){
$socket->send($cookie . "\r\n");
$socket->recv(my $auth,1024);
$socket->close();
chomp($auth);
if($auth){
$data = (split(/\|/,$auth))[5];
}
}
else{
$data = $!;
}
}
print($cgi->header('application/javascript'));
print(JSON->new()->allow_nonref()->utf8()->encode($data));
exit();
Run Code Online (Sandbox Code Playgroud)
我找到了答案。问题出在 SElinux 上。默认情况下,它不允许 httpd 进程(或从中产生的任何进程,例如 CGI 脚本)建立网络套接字。因此,只需使用命令“setsebool -P httpd_can_network_connect 1”启用该特定功能。现在它工作得很好。