On 10/21/2017 5:40 AM, Rob Jarratt via cctech wrote:
> I have a couple of hard disks I want to make dd copies of. I have Ultrix
> running on my DECstation 5000/240 with the disk I want to clone attached to
> it. The trouble is that I don't have enough disk space on the machine to
> clone the disk and then grab the image using FTP. I have been trying to find
> a way to pipe the dd output over the network to a SIMH Ultrix machine that
> has plenty of disk space. I tried piping dd into rcp, but rcp doesn't seem
> to take input from standard input. I have looked at cpio, but that too
> appears not to accept input from standard input.
> 
>  
> 
> Unix is not my strong point. Are there any other ways I could pipe the dd
> output across the network to a machine that has enough disk space?
> 
>  
> 
> Thanks
> 
>  
> 
> Rob
> 
> 

One way would be to attach the drive to an x86 machine that supports the
disk drives, and use clonezilla.

Another way, which I have used, is to use perl or Python to do the job.
They are relatively small, so I just included mine here.

I had trouble with the perl version under Linux at some point, so now on
the Linux side, I use a Python version.  NOTE:  I am not very fluent in
Python.  Also, I don't use the Python server version.


#!/usr/bin/perl
#
#       Simple program for piping output (such as tar) from one system to 
another.
#       Contains client and server in the same script.
#
#       Usage: tcppipe [ -c server [-i file] ] | [ -s [-o file] ] [-p port]
#
#       The client reads standard input by default and sends it to "server" on
"port".
#       The server writes standard output by default.
#
#       Port defaults to 1025
#
#       JRJ  12/95
#

use Getopt::Std;
use Socket;

$debug=1;

$PROGRAM='tcppipe';
$VERSION='V1.0';
$PORT = 4097;

$MTU=65536;
$AF_INET=2;
$SOCK_STREAM=1;
$PF_INET=2;

$sockaddr='S n a4 x8';

#
#       Get and validate options.
#

getopts('c:si:o:p:') || usage();

if(($opt_c && $opt_s) || (!$opt_c && !$opt_s) ||
   ($opt_c && $opt_o) || ($opt_s && $opt_i)) {
        usage();
}

if(!$opt_p) {
        $opt_p = $PORT;
}

#
#       Call the client or server piece, as appropriate.
#

if($opt_c) {
        return(pipe_client($opt_c,$opt_p,$opt_i));
}
else {
        return(pipe_server($opt_p,$opt_o));
}

#
#       Client piece
#

sub pipe_client {
        local($server,$client_port,$infile) = @_;

        if($infile && ! -f $infile) {
                die "$0: $infile is not a valid file.\n";
        }

        #
        #       Open the file.  In binary, if you please...
        #

        if($infile) {
                open(INFILE,$infile) || die "$0: Can't open file $infile: $!";
                $fd = INFILE;
        }
        else {
                $fd = STDIN;
        }
        binmode $fd;

        if($debug) {
                print "Server: $server \n";
        }

        #
        #       Do some work to prepare the socket data structures
        #
        ($pname, $paliases, $proto) = getprotobyname('tcp');
        ($hname, $haliases, $htype, $hlen, $hip) = gethostbyname($server);
        if(!defined($hip)) {
                die "$0: Unknown host: $server : $! ";
        }
        if($debug) {
                @nip = unpack('C4',$hip);
                print "Host address for $server: @nip \n";
        }
        $netaddr = pack($sockaddr, $AF_INET, $client_port, $hip);
        socket(SERVER,$PF_INET,$SOCK_STREAM,$proto) ||
        die "Can't create socket: $!";

        #
        #       Open the connection to the server.
        #
        connect(SERVER,$netaddr) || die "Can't connect to server: $!";
        select(SERVER); $|=1; select(stdout);
        if($debug) {
                print "Connected to $server\n";
        }

        #
        #       Server indicates it's name and version
        #
        $_=<SERVER>;
        if($debug) {
                print "Server: $_";
        }
        /^220 $PROGRAM $VERSION\n$/ ||
                die "$0: Unexpected server response: $_";

        #
        #       Send the file.
        #
        while(read($fd,$buf,$MTU)) {
                if($debug) {
                        print "Read in " . length($buf) . " bytes.\n";
                }
                print SERVER $buf ||
                        die "Can't send data to server: $!";
                if($debug) {
                        print "Sent...\n";
                }
        }

        #
        #       All done
        #
        close(SERVER);
        close($fd);
        print "Transfer completed.\n";
        exit 0;
}

#
#       Server piece
#
sub pipe_server {
        local($server_port,$outfile) = @_;

        #
        #       Open the file.  In binary, if you please...
        #

        if($outfile) {
                open(OUTFILE,">$outfile") || die "$0: Can't open file $infile: 
$!";
                $fd = OUTFILE;
        }
        else {
                $fd = STDOUT;
        }
        binmode $fd;

        #
        #       Do some work to prepare the socket data structures
        #

        ($pname, $paliases, $proto) = getprotobyname('tcp');
        socket(SERVER,$PF_INET,$SOCK_STREAM,$proto) ||
                die "Can't create socket: $!";
        setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,pack("l",1)) ||
                die "Can't setsockopt: $!";
        bind(SERVER,sockaddr_in($server_port,INADDR_ANY)) ||
                die "Can't bind: $!";
        listen(SERVER,SOMAXCONN) ||
                die "Can't listen: $!";
        if($debug) {
                print "Server started on port $server_port\n";
        }

        #
        #       Wait for a connection.
        #

        accept(CLIENT,SERVER);
        select(CLIENT); $| =1; select(STDOUT);

        #
        #       Send our banner
        #

        if ($debug) {
                print "Received connection request...\n";
        }
        print CLIENT "220 $PROGRAM $VERSION\n";

        #
        #       Send the file.
        #
        while(read(CLIENT,$buf,$MTU)) {
                if($debug) {
                        print "Read in " . length($buf) . " bytes.\n";
                }
                print $fd $buf ||
                        die "Can't write data: $!";
        }

        #
        #       All done
        #
        close(CLIENT);
        close(SERVER);
        close($fd);
        if($debug) {
                print "Transfer completed.\n";
        }
        exit 0;
}

sub usage {
        printf STDERR "Usage $0: -c server [-i infile] | -s [-o outfile] [-p
[port]]\n";
        exit(2);
}


##################################################################################


#!/usr/bin/python

#
#       Client program in python corresponding to tcppipe.pl
#

#       WARNING: If running this program under Cygwin under
#       Windows, set your file output style to binary (rather
#       than ASCII) or it adds carriage returns before every
#       newline (or just use the perl version, instead)

#       This simplistic code takes ONE MANDATORY argument - the
#       host address

import socket
import sys

PORT = 4097
PROGRAM = 'tcppipe'
VERSION = 'V1.0'
MTU = 16384
HOST = sys.argv[1]

debug = 0

if debug:
   sys.stderr.write('Server: ' + HOST)

#
#       Prepare the socket
#

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
buf = s.recv(1024)

if debug:
   sys.stderr.write('Connected: ' + buf)

#
#       Send the data
#
while 1:
   buf = sys.stdin.read(MTU)
   if not buf: break
   s.send(buf)
   if debug:
      sys.stderr.write('Sent ' + str(len(buf)) + ' bytes' + '\n')

#
#       Close down
#
s.close()
if debug:
   sys.stderr.write('Done...\n')



##################################################################################


#
#       Server program in Python corresponding to tcppipe.pl
#

#
#       WARNING:  If running this program under Cygwin under
#       Windows, set your file output style to binary (rather
#       than ASCII) or it adds carriage returns before every
#       newline (or just use the perl version, instead)
#

import socket
import sys

PORT = 4097                             # port to listen on
PROGRAM = 'tcppipe'
VERSION = 'V1.0'                        # Version
MTU = 16384                             # max block to receive

debug = 1                               # Print debugging messages

#
#       Prepare the socket
#

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',PORT))
if debug:
   sys.stderr.write('Server started on port' + str(PORT) + '\n')

#
#       Wait for a connection
#

s.listen(1)
connection, client_address = s.accept()
if debug:
   sys.stderr.write('Received connection request from ' +
str(client_address) + '\n')

#
#       Send out the banner to the client
#
connection.send('220 ' + PROGRAM + ' ' + VERSION + '\n')

#
#       Receive the data
#
while 1:
   buf = connection.recv(MTU)
   if not buf: break
   if debug:
      sys.stderr.write('Read in ' + str(len(buf)) + ' bytes' + '\n')
   sys.stdout.write(buf)

#
#       Close down
#
connection.close()
if debug:
   sys.stderr.write('Done...\n')
        




Reply via email to