) { chomp; if ( m{^MOSH CONNECT } ) { if ( ( $port, $key ) = m{^MOSH CONNECT (\d+?) ([A-Za-z0-9/+]{22})\s*$} ) { last; } else { die "Bad MOSH CONNECT string: $_\n"; } } else { print "$_\n"; } } close(P); # Now read server's IP address. open P, $tmp or die "Cannot open temporary file $tmp: $!\n"; while (
) { chomp; if ( m{^MOSH IP } ) { ( $ip ) = m{^MOSH IP (\S+)\s*$} or die "Bad MOSH IP string: $_\n"; } } close(P); unlink($tmp); if ( not defined $ip ) { die "$0: Did not find remote IP address (is SSH ProxyCommand disabled?).\n"; } if ( not defined $key or not defined $port ) { die "$0: Did not find mosh server startup message.\n"; } # Now start real mosh client. $ENV{ 'MOSH_KEY' } = $key; $ENV{ 'MOSH_PREDICTION_DISPLAY' } = $predict; # Execute the process $client passing "$client @cmdline |" as a displayable # name (e.g. for "ps" or "top" commands). exec {$client} "$client @cmdline |", $ip, $port; sub predict_check { my ( $predict, $env_set ) = @_; if ( not exists { adaptive => 0, always => 0, never => 0 }->{ $predict } ) { my $explanation = $env_set ? " (MOSH_PREDICTION_DISPLAY in environment)" : ""; print STDERR qq{$0: Unknown mode \"$predict\"$explanation.\n\n}; die $usage; } } sub shell_quote { return join ' ', map { (my $a = $_) =~ s/'/'\\''/g; "'$a'" } @_; } sub locale_vars { my @names = qw[LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION LC_ALL]; my @assignments; for ( @names ) { if ( defined $ENV{ $_ } ) { push @assignments, $_ . q{=} . $ENV{ $_ }; } } return @assignments; } sub cat { my ( $from, $to ) = @_; while ( my $n = $from->sysread( my $buf, 4096 ) ) { next if ( $n == -1 && $! == EINTR ); $n >= 0 or last; $to->write( $buf ) or last; } }