mosh: implement --local option for use without ssh

This commit is contained in:
John Hood
2015-07-29 22:53:43 -04:00
parent 5a20626880
commit 448f9f1bab
2 changed files with 43 additions and 20 deletions
+6
View File
@@ -165,6 +165,12 @@ Do not send the \fBsmcup\fP initialization string and \fBrmcup\fP
deinitialization string to the client's terminal. On many terminals deinitialization string to the client's terminal. On many terminals
this disables alternate screen mode. this disables alternate screen mode.
.TP
.B \-\-local
Invoke \fBmosh-server\fP locally, without using \fBssh\fP. This
option requires the \fBhost\fP argument to be a local, numeric
IPv4/IPv6 address. This option is useful for testing.
.SH ESCAPE SEQUENCES .SH ESCAPE SEQUENCES
The default escape character used by Mosh is ASCII RS (decimal 30). The default escape character used by Mosh is ASCII RS (decimal 30).
+32 -15
View File
@@ -51,6 +51,8 @@ my $ssh = 'ssh';
my $term_init = 1; my $term_init = 1;
my $localhost = undef;
my $help = undef; my $help = undef;
my $version = undef; my $version = undef;
@@ -81,6 +83,8 @@ qq{Usage: $0 [options] [--] [user@]host [command...]
--no-init do not send terminal initialization string --no-init do not send terminal initialization string
--local run mosh-server locally without using ssh
--help this message --help this message
--version version and copyright information --version version and copyright information
@@ -117,6 +121,7 @@ GetOptions( 'client=s' => \$client,
'p=s' => \$port_request, 'p=s' => \$port_request,
'ssh=s' => \$ssh, 'ssh=s' => \$ssh,
'init!' => \$term_init, 'init!' => \$term_init,
'local' => \$localhost,
'help' => \$help, 'help' => \$help,
'version' => \$version, 'version' => \$version,
'fake-proxy!' => \my $fake_proxy, 'fake-proxy!' => \my $fake_proxy,
@@ -157,20 +162,34 @@ if ( defined $port_request ) {
delete $ENV{ 'MOSH_PREDICTION_DISPLAY' }; delete $ENV{ 'MOSH_PREDICTION_DISPLAY' };
my $userhost;
my @command;
my @bind_arguments; my @bind_arguments;
if ( not defined $bind_ip or $bind_ip =~ m{^ssh$}i ) {
if ( ! defined $fake_proxy ) {
if ( scalar @ARGV < 1 ) {
die $usage;
}
$userhost = shift;
@command = @ARGV;
if ( not defined $bind_ip or $bind_ip =~ m{^ssh$}i ) {
if ( not defined $localhost ) {
push @bind_arguments, '-s'; push @bind_arguments, '-s';
} elsif ( $bind_ip =~ m{^any$}i ) { } else {
push @bind_arguments, ('-i', "$userhost");
}
} elsif ( $bind_ip =~ m{^any$}i ) {
# do nothing # do nothing
} elsif ( $bind_ip =~ m{^[0-9\.]+$} ) { } elsif ( $bind_ip =~ m{^[0-9\.]+$} ) {
push @bind_arguments, ('-i', "$bind_ip"); push @bind_arguments, ('-i', "$bind_ip");
} else { } else {
print STDERR qq{$0: Unknown server binding option: $bind_ip\n}; print STDERR qq{$0: Unknown server binding option: $bind_ip\n};
die $usage; die $usage;
} }
} else {
my ( $host, $port ) = @ARGV;
if ( defined $fake_proxy ) {
use Errno qw(EINTR); use Errno qw(EINTR);
my $have_ipv6 = eval { my $have_ipv6 = eval {
require IO::Socket::IP; require IO::Socket::IP;
@@ -189,8 +208,6 @@ if ( defined $fake_proxy ) {
} }
} }
my ( $host, $port ) = @ARGV;
# Resolve hostname and connect # Resolve hostname and connect
my $afstr = 'AF_' . uc( $family ); my $afstr = 'AF_' . uc( $family );
my $af = eval { IO::Socket->$afstr } or die "$0: Invalid family $family\n"; my $af = eval { IO::Socket->$afstr } or die "$0: Invalid family $family\n";
@@ -231,13 +248,6 @@ if ( defined $fake_proxy ) {
exit; exit;
} }
if ( scalar @ARGV < 1 ) {
die $usage;
}
my $userhost = shift;
my @command = @ARGV;
# Count colors # Count colors
open COLORCOUNT, '-|', $client, ('-c') or die "Can't count colors: $!\n"; open COLORCOUNT, '-|', $client, ('-c') or die "Can't count colors: $!\n";
my $colors = ""; my $colors = "";
@@ -278,6 +288,13 @@ if ( $pid == 0 ) { # child
push @server, '--', @command; push @server, '--', @command;
} }
if ( defined( $localhost )) {
delete $ENV{ 'SSH_CONNECTION' };
chdir; # $HOME
print "MOSH IP ${userhost}\n";
exec( $server, @server );
die "Cannot exec $server: $!\n";
}
my $quoted_self = shell_quote( $0, "--family=$family" ); my $quoted_self = shell_quote( $0, "--family=$family" );
exec "$ssh " . shell_quote( '-S', 'none', '-o', "ProxyCommand=$quoted_self --fake-proxy -- %h %p", '-n', '-tt', $userhost, '--', "$server " . shell_quote( @server ) ); exec "$ssh " . shell_quote( '-S', 'none', '-o', "ProxyCommand=$quoted_self --fake-proxy -- %h %p", '-n', '-tt', $userhost, '--', "$server " . shell_quote( @server ) );
die "Cannot exec ssh: $!\n"; die "Cannot exec ssh: $!\n";