1

私のclient.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $name = '172.20.10.189'; #Server IP
my $port = '7890';

my $socket = IO::Socket::INET->new('PeerAddr' => $name,
                                   'PeerPort' => $port,
                                'Proto' => 'tcp') or die "Can't create socket ($!)\n";

print "Client sending\n";
while (1) {
    my $msg = <STDIN>;
    print $socket $msg;
    print scalar <$socket>;
}
close $socket
    or die "Can't close socket ($!)\n";

私のサーバー.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $port = "7890";

my $socket = IO::Socket::INET->new('LocalPort' => $port,
                                   'Proto' => 'tcp',
                                   'Listen' => SOMAXCONN)
    or die "Can't create socket ($!)\n";


while (my $client = $socket->accept) {
    my $name = gethostbyaddr($client->peeraddr, AF_INET);
    my $port = $client->peerport;
    while (<$client>) {
        print "[$name $port] $_";
        my @out = `$_`;
        print @out;
        print $client "$.: @out";
    }
    close $client
        or die "Can't close ($!)\n";
}

die "Can't accept socket ($!)\n";

私のクライアントはコマンド (ls -lrt /) をサーバーに送信しており、サーバーはそのコマンドを実行し、出力をクライアントに送り返すことになっています。

問題:-

コマンドはサーバー上で正常に実行されますが、最初の行のみがクライアントに送信されます。クライアントから任意のキーをもう一度押すと、出力の次の行がクライアントに送信されます。

または、複数行の出力をクライアントに送信する方法を教えてください。

どんな助けでも大歓迎です。

ありがとうアビシェーク

4

2 に答える 2

3

サーバーはすべての行をクライアントに送信しますが、クライアントは 1 行だけを読み取ることを選択します。

print scalar <$socket>;

を削除するとscalar、動作するはずです。ただし、アーキテクチャは依然としてセキュリティの悪夢です。

  • すべてのサーバーは汚染モード ( -Tswitch ) で実行する必要があります。
  • クライアントから送信されたコマンドをやみくもに実行しないでください。非常に厳格な検証テストに合格したコマンドのみを実行し、悪意がないように見えるコマンドは実行しないでください。
  • SSH を複製しようとしているのかもしれませんが、代わりにそのプログラムを見たいと思うかもしれません。
  • サーバーはいかなる種類の認証も行いません。少なくとも、すべての入力をログに記録します。
于 2012-12-06T10:04:50.947 に答える
0

それはばかげた間違いでした...そして私は最初の問題を次のように修正し、クライアント側で複数行の出力を取得しました...

Client.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $name = '172.20.10.189'; #Server IP
my $port = '7890';

my $socket = IO::Socket::INET->new('PeerAddr' => $name,
                                   'PeerPort' => $port,
                                   'Proto' => 'tcp')
    or die "Can't create socket ($!)\n";
print "Client sending\n";

while (1) {
        my $msg = <STDIN>;
        print $socket $msg;
        while (<$socket>)
        {
                print "\n$_";
        }
}

$socketを閉じるかdie"ソケットを閉じることができません($!)\ n";

しかし、もう1つ問題があります-

クライアントを手動で閉じて出力を受け取るまで、クライアントが他のいくつかのコマンドを次々に送信し続けるようにしたい。

問題は-最初のコマンドの出力のみを受信します。

誰かがこれについて私を助けてくれますか?

于 2012-12-06T10:09:02.423 に答える