【问题标题】:Perl IO::Socket::INET permission deniedPerl IO::Socket::INET 权限被拒绝
【发布时间】:2023-04-03 22:40:02
【问题描述】:

有一个 perl 脚本来连接在 localhost 上运行的 Java 服务,传递加密的 cookie,并返回解密的数据。当我从命令行运行脚本时,它工作正常。甚至给了 apache 用户一个 shell,并以该用户的身份从命令行运行,这也可以正常工作。如果脚本从 apache 作为 CGI 运行,socket 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();

【问题讨论】:

    标签: perl apache sockets


    【解决方案1】:

    我找到了答案。问题是 SElinux。默认情况下,它不会让 httpd 进程(或从它产生的任何东西,例如 CGI 脚本)建立网络套接字。所以只需要使用命令“setsebool -P httpd_can_network_connect 1”启用该特定功能。现在它完美地工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多