| Index: telemetry/telemetry/internal/forwarders/cros_forwarder.py
 | 
| diff --git a/telemetry/telemetry/internal/forwarders/cros_forwarder.py b/telemetry/telemetry/internal/forwarders/cros_forwarder.py
 | 
| index 4316954559177e6428cc5584d4359be3ea1fd13a..e59167bbd628c46356d26cd0b8bf7ee669750613 100644
 | 
| --- a/telemetry/telemetry/internal/forwarders/cros_forwarder.py
 | 
| +++ b/telemetry/telemetry/internal/forwarders/cros_forwarder.py
 | 
| @@ -3,7 +3,9 @@
 | 
|  # found in the LICENSE file.
 | 
|  
 | 
|  import logging
 | 
| +import re
 | 
|  import subprocess
 | 
| +import tempfile
 | 
|  
 | 
|  from telemetry.internal import forwarders
 | 
|  from telemetry.internal.forwarders import do_nothing_forwarder
 | 
| @@ -30,16 +32,36 @@ class CrOsSshForwarder(forwarders.Forwarder):
 | 
|      super(CrOsSshForwarder, self).__init__(port_pair)
 | 
|      self._cri = cri
 | 
|      self._proc = None
 | 
| +    self._remote_port = None
 | 
|      forwarding_args = self._ForwardingArgs(
 | 
|          use_remote_port_forwarding, self.host_ip, port_pair)
 | 
| +    err_file = tempfile.NamedTemporaryFile()
 | 
|      self._proc = subprocess.Popen(
 | 
| -        self._cri.FormSSHCommandLine(['sleep', '999999999'], forwarding_args),
 | 
| +        self._cri.FormSSHCommandLine(['-NT'], forwarding_args,
 | 
| +                                     port_forward=use_remote_port_forwarding),
 | 
|          stdout=subprocess.PIPE,
 | 
| -        stderr=subprocess.PIPE,
 | 
| +        stderr=err_file,
 | 
|          stdin=subprocess.PIPE,
 | 
|          shell=False)
 | 
| +    def _get_remote_port(err_file):
 | 
| +      # When we specify the remote port '0' in ssh remote port forwarding,
 | 
| +      # the remote ssh server should return the port it binds to in stderr.
 | 
| +      # e.g. 'Allocated port 42360 for remote forward to localhost:12345',
 | 
| +      # the port 42360 is the port created remotely and the traffic to the
 | 
| +      # port will be relayed to localhost port 12345.
 | 
| +      line = err_file.readline()
 | 
| +      tokens = re.search(r'port (\d+) for remote forward to', line)
 | 
| +      if tokens:
 | 
| +        self._remote_port = int(tokens.group(1))
 | 
| +      return tokens
 | 
| +
 | 
| +    if use_remote_port_forwarding and port_pair.remote_port == 0:
 | 
| +      with open(err_file.name, 'r') as err_file_reader:
 | 
| +        py_utils.WaitFor(lambda: _get_remote_port(err_file_reader), 60)
 | 
| +
 | 
|      py_utils.WaitFor(
 | 
|          lambda: self._cri.IsHTTPServerRunningOnPort(self.host_port), 60)
 | 
| +    err_file.close()
 | 
|      logging.debug('Server started on %s:%d', self.host_ip, self.host_port)
 | 
|  
 | 
|    # pylint: disable=unused-argument
 | 
| @@ -55,6 +77,9 @@ class CrOsSshForwarder(forwarders.Forwarder):
 | 
|  
 | 
|    @property
 | 
|    def host_port(self):
 | 
| +    # Return remote port if it is resolved remotely.
 | 
| +    if self._remote_port:
 | 
| +      return self._remote_port
 | 
|      return self._port_pair.remote_port
 | 
|  
 | 
|    def Close(self):
 | 
| 
 |