summaryrefslogtreecommitdiff
path: root/site_perl/SSH.pm
blob: d5a0df654e1f43a562effa82ba72c3c32d028cb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package FS::SSH;

use strict;
use vars qw(@ISA @EXPORT_OK $ssh $scp);
use Exporter;
use IPC::Open2;
use IPC::Open3;

@ISA = qw(Exporter);
@EXPORT_OK = qw(ssh scp issh iscp sshopen2 sshopen3);

$ssh="ssh";
$scp="scp";

=head1 NAME

FS::SSH - Subroutines to call ssh and scp

=head1 SYNOPSIS

  use FS::SSH qw(ssh scp issh iscp sshopen2 sshopen3);

  ssh($host, $command);

  issh($host, $command);

  scp($source, $destination);

  iscp($source, $destination);

  sshopen2($host, $reader, $writer, $command);

  sshopen3($host, $reader, $writer, $error, $command);

=head1 DESCRIPTION

  Simple wrappers around ssh and scp commands.

=head1 SUBROUTINES

=over 4

=item ssh HOST, COMMAND 

Calls ssh in batch mode.

=cut

sub ssh {
  my($host,$command)=@_;
  my(@cmd)=($ssh, "-o", "BatchMode yes", $host, $command);
#  	print join(' ',@cmd),"\n";
#0;
  system(@cmd);
}

=item issh HOST, COMMAND

Prints the ssh command to be executed, waits for the user to confirm, and
(optionally) executes the command.

=cut

sub issh {
  my($host,$command)=@_;
  my(@cmd)=($ssh, $host, $command);
  print join(' ',@cmd),"\n";
  if ( &_yesno ) {
    	###print join(' ',@cmd),"\n";
    system(@cmd);
  }
}

=item scp SOURCE, DESTINATION

Calls scp in batch mode.

=cut

sub scp {
  my($src,$dest)=@_;
  my(@cmd)=($scp,"-Bprq",$src,$dest);
#  	print join(' ',@cmd),"\n";
#0;
  system(@cmd);
}

=item iscp SOURCE, DESTINATION

Prints the scp command to be executed, waits for the user to confirm, and
(optionally) executes the command.

=cut

sub iscp {
  my($src,$dest)=@_;
  my(@cmd)=($scp,"-pr",$src,$dest);
  print join(' ',@cmd),"\n";
  if ( &_yesno ) {
    	###print join(' ',@cmd),"\n";
    system(@cmd);
  }
}

=item sshopen2 HOST, READER, WRITER, COMMAND

Connects the supplied filehandles to the ssh process (in batch mode).

=cut

sub sshopen2 {
  my($host,$reader,$writer,$command)=@_;
  open2($reader,$writer,$ssh,'-o','Batchmode yes',$host,$command);
}

=item sshopen3 HOST, WRITER, READER, ERROR, COMMAND

Connects the supplied filehandles to the ssh process (in batch mode).

=cut

sub sshopen3 {
  my($host,$writer,$reader,$error,$command)=@_;
  open3($writer,$reader,$error,$ssh,'-o','Batchmode yes',$host,$command);
}

sub _yesno {
  print "Proceed [y/N]:";
  my($x)=scalar(<STDIN>);
  $x =~ /^y/i;
}

=head1 BUGS

Not OO.

scp stuff should transparantly use rsync-over-ssh instead.

=head1 SEE ALSO

L<ssh>, L<scp>, L<IPC::Open2>, L<IPC::Open3>

=head1 HISTORY

ivan@voicenet.com 97-jul-17

added sshopen2 and sshopen3 ivan@sisd.com 98-mar-9

added iscp ivan@sisd.com 98-jul-25
now iscp asks y/n, issh and took out path ivan@sisd.com 98-jul-30

pod ivan@sisd.com 98-sep-21

=cut

1;