2015-01-14 2 views
2

다음과 같은 코드가 있습니다. 나는 그것이 2 ~ 3 번 충돌 코드 (10) 시간을 실행하는 경우처럼Perl Net :: SSH2 쓰레드 크래킹

perl: ath.c:193: _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed. 

: 내 문제는 다음과 같은 오류와 함께 임의의 기준에서 충돌이다. 그것을 고치는 방법?

use warnings; 
use strict; 
use Net::SSH2; 
use threads; 

sub gsmExec { 
    $host = $_[0]; 
    $port = $_[1]; 
    $user = $_[2]; 
    $pass = $_[3]; 
    my $modem = Net::SSH2->new(); 
    print "Trying to connect host $host : $port \n"; 
    if($modem->connect($host,$port)) { 
     print "connected to host ..\n"; 

     if ($modem->auth_password($user,$password) { 
      print "Authorized!!"; 
     } 
    } 
} 

for(my $j = 1; $j <= $modemCount; $j++){ 
     $thrList[$j] = threads->create(\&gsmExec,'host',22,'user','pass'); 
} 
+0

. 유일한 해결책은 그것을 찾고 수정하는 것입니다. – salva

+0

흠 .. 나는 스레드를 포크로 바꿨다. 그것은 내 문제를 해결했다. –

+0

Linux/Unix 상자에서 스크립트를 실행하려면 [Net :: OpenSSH] (https://metacpan.org/pod/Net::OpenSSH) [:: Parallel] (https : //metacpan.org/pod/Net :: OpenSSH :: Parallel) 대신에! – salva

답변

2

정말 거기 perl 오류가 아니다 - 즉 Net::SSH 라이브러리 내의 C 코드의 비트입니다.

몇 가지 징후는이 문제를 공격 할 수있는 유일한 사람이되는이 있습니다

http://www.perlmonks.org/?node_id=936201

http://lists.gnupg.org/pipermail/gcrypt-devel/2006-January/000910.html

그것을하지하게 GnuTLS에 버그가있을 수 있습니다 나타납니다 스레드 안전. 해결 방법은 다음과 같습니다.

  • 단일 스레드 'TLS'비트.
  • 스레딩 대신 fork을 사용하십시오. (Parallel::ForkManager 꽤 좋습니다).
  • Net::OpenSSH::Parallel 트릭을 수행 할 수도 있습니다. 아마 넷 :: SSH2 또는 libssh2에 약간의 버그로 인해 발생
관련 문제