diff --git a/commands/core/ssh.drush.inc b/commands/core/ssh.drush.inc
new file mode 100644
index 0000000..874eebc
--- /dev/null
+++ b/commands/core/ssh.drush.inc
@@ -0,0 +1,76 @@
+<?php
+
+/**
+* @file
+*/
+
+function ssh_drush_command() {
+  $items['site-ssh'] = array(
+    'description' => 'Connect to a Drupal site\'s server via SSH',
+    'arguments' => array(
+      'site-alias [ cmd ]' => 'A remote site alias (command is optional), or a list of site aliases (requires a command)',
+    ),
+    'options' => array(
+      'bastion-host' => 'An intermediate host to ssh into before connecting to the real server. Agent forwarding (-A) is always enabled. This may also be specified via the site alias.',
+      'bation-user' => 'The user to ssh into bastion-host as. The default is the username running drush. This may also be specified via the site alias.',
+      'ssh-options' => 'A string of extra options that will be passed to the ssh command (e.g. "-p 100")',
+    ),
+    'examples' => array(
+      'drush ssh @mysite' => 'Open an interactive shell on @mysite\'s server.',
+      'drush ssh @site1,@site2 ls /tmp' => 'Run "ls /tmp" on @site1\'s and @site2\'s server.',
+    ),
+    'aliases' => array('ssh'),
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
+  );
+  return $items;
+}
+
+/**
+ * Command callback.
+ */
+function drush_ssh_site_ssh($alias, $command = NULL) {
+  $site = drush_sitealias_get_record($alias);
+
+  // If we have multiple sites, run ourselves on each one.
+  if (isset($site['site-list'])) {
+    if (empty($command)) {
+      drush_set_error('DRUSH_SITE_SSH_COMMAND_REQUIRED', dt('A command is required when multiple site aliases are specified.'));
+      return;
+    }
+    foreach ($site['site-list'] as $alias) {
+      drush_ssh($alias, $command);
+    }
+    return;
+  }
+
+  // We only accept remote aliases.
+  if (empty($site['remote-host'])) {
+    drush_set_error('DRUSH_SITE_SSH_REMOTE_ALIAS_REQUIRED', dt('@alias is not a remote alias.', array('@alias' => $alias)));
+    return;
+  }
+
+  // Build up the command.
+  $hostname = drush_escapeshellarg($site['remote-host'], "LOCAL");
+  $username = isset($site['remote-user']) ? drush_escapeshellarg($site['remote-user'], "LOCAL") . "@" : '';
+  $ssh_options = isset($site['ssh-options']) ? $site['ssh-options'] : drush_get_option('ssh-options', "-o PasswordAuthentication=no");
+
+  $cmd = "ssh " . $ssh_options . " " . $username . $hostname;
+  if (!empty($command)) {
+    $cmd .= " " . drush_escapeshellarg($command);
+  }
+
+  // Apply bastion host options.
+  $bhost = isset($site['bastion-host']) ? $site['bastion-host'] : drush_get_option('bastion-host', '');
+  $buser = isset($site['bastion-user']) ? $site['bastion-user'] : drush_get_option('bastion-user', $_SERVER['USER']);
+  if (!empty($bhost)) {
+    $cmd = "ssh -A $ssh_options " . drush_escapeshellarg($buser) . '@' . drush_escapeshellarg($bhost) . ' ' . drush_escapeshellarg($cmd);
+  }
+
+  // Execute.
+  if (drush_get_context('DRUSH_VERBOSE') || drush_get_context('DRUSH_SIMULATE')) {
+    drush_print($cmd);
+  }
+  if (!drush_get_context('DRUSH_SIMULATE')) {
+    proc_close(proc_open($cmd, array(0 => STDIN, 1 => STDOUT, 2 => STDERR), $pipes));
+  }
+}
diff --git a/tests/siteSshTest.php b/tests/siteSshTest.php
new file mode 100644
index 0000000..72922e6
--- /dev/null
+++ b/tests/siteSshTest.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * @file
+ *   Tests for archive.drush.inc
+ */
+class siteSshCase extends Drush_TestCase {
+
+  /*
+   * Test drush ssh --simulate.
+   */
+  public function testSiteSsh() {
+    $aliases = array(
+      'interactive' => array(
+        'remote-host' => 'my.server.com',
+        'remote-user' => 'user123',
+        'expected-output' => "ssh -o PasswordAuthentication=no 'user123'@'my.server.com'",
+      ),
+      'bastion.interactive' => array(
+        'remote-host' => 'my.server.com',
+        'remote-user' => 'user123',
+        'bastion-host' => 'bastion.server',
+        'bastion-user' => 'bastion-user',
+        'expected-output' => "ssh -A -o PasswordAuthentication=no 'bastion-user'@'bastion.server' 'ssh -o PasswordAuthentication=no '\''user123'\''@'\''my.server.com'\'''",
+      ),
+    );
+
+    $contents = $this->file_aliases($aliases);
+    $alias_path = UNISH_SANDBOX . "/aliases.drushrc.php";
+    file_put_contents($alias_path, $contents);
+
+    $options = array(
+      'simulate' => NULL,
+      'alias-path' => dirname($alias_path),
+    );
+
+    foreach ($aliases as $alias => $info) {
+      $this->drush('ssh', array("@$alias"), $options);
+      $output = $this->getOutput();
+      $this->assertEquals($info['expected-output'], $output);
+    }
+  }
+}
+
