blob: 33315f2e72dd88c2a13aa395beecf8466f28574c [file] [log] [blame]
#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Command to SSH to a Fuchsia device.
set -eu
# Source common functions
readonly MY_SCRIPT_SRC_DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
# Fuchsia command common functions.
# shellcheck disable=SC1090
source "${MY_SCRIPT_SRC_DIR}/fuchsia-common.sh" || exit $?
function usage {
echo "Usage: $(basename "$0") [args]"
echo " [--help]"
echo " This message."
echo " [--device-name <device hostname>]"
echo " Connects to the device with the given device hostname. Cannot be used with --device-ip."
echo " Defaults to the value from \`fconfig.sh get device-name\`."
echo " [--device-ip <device ip>]"
echo " Connects to the device with the given device ip address. Cannot be used with --device-name."
echo " Defaults to the value from \`fconfig.sh get device-ip\`."
echo " Note: If defaults are configured for both device-name and device-ip, then device-ip is used."
echo " If the device is specified at all, then the first device discovered is used."
echo " [--private-key <identity file>]"
echo " Uses additional private key when using ssh to access the device."
echo " [--sshconfig <sshconfig file>]"
echo " Use the specified sshconfig file instead of fssh's version."
echo " [-q|--quiet]"
echo " Suppress non-error output from fssh.sh (but not from the remote command)."
echo
echo "All positional arguments are passed through to SSH to be executed on the device."
}
PRIVATE_KEY_FILE=""
DEVICE_NAME_FILTER=""
DEVICE_IP_ADDR=""
POSITIONAL=()
SSHCONFIG_FILE=""
QUIET=""
# Parse command line
while (( "$#" )); do
case $1 in
--device-name)
shift
DEVICE_NAME_FILTER="${1}"
;;
--device-ip)
shift
DEVICE_IP_ADDR="${1}"
;;
--private-key)
shift
PRIVATE_KEY_FILE="${1}"
;;
--sshconfig)
shift
SSHCONFIG_FILE="${1}"
;;
--help)
usage
exit 1
;;
-q|--quiet)
QUIET="1"
;;
-*)
if [[ "${#POSITIONAL[@]}" -eq 0 ]]; then
echo "Unknown option ${1}"
usage
exit 1
else
POSITIONAL+=("${1}")
fi
;;
*)
POSITIONAL+=("${1}")
;;
esac
shift
done
if [[ "${DEVICE_IP_ADDR}" == "" && "${DEVICE_NAME_FILTER}" == "" ]]; then
# No device specified on the command line, so use the default IP, then the
# default name if configured.
DEVICE_IP_ADDR="$(get-fuchsia-property device-ip)"
if [[ -n "${DEVICE_IP_ADDR}" ]]; then
if [[ -z "${QUIET}" ]]; then
echo "Using device address ${DEVICE_IP_ADDR}. Use --device-ip or fconfig.sh to use another device."
fi
else
DEVICE_NAME_FILTER="$(get-fuchsia-property device-name)"
if [[ -n "${DEVICE_NAME_FILTER}" ]]; then
if [[ -z "${QUIET}" ]]; then
echo "Using device name ${DEVICE_NAME_FILTER}. Use --device-name or fconfig.sh to use another device."
fi
fi
fi
elif [[ "${DEVICE_IP_ADDR}" != "" && "${DEVICE_NAME_FILTER}" != "" ]]; then
fx-error "Cannot use both --device-name and --device-ip".
exit 1
fi
readonly PRIVATE_KEY_FILE
readonly DEVICE_NAME_FILTER
readonly DEVICE_IP_ADDR
readonly POSITIONAL
target_device_ip="${DEVICE_IP_ADDR}"
# Get the device IP address.
if [[ "${target_device_ip}" == "" ]]; then
target_device_ip=$(get-device-ip-by-name "${DEVICE_NAME_FILTER}")
if [[ ! "$?" || -z "$target_device_ip" ]]; then
fx-error "Error finding device"
exit 2
fi
fi
ssh_args=()
# Build the command line
if [[ "${SSHCONFIG_FILE}" != "" ]]; then
ssh_args+=("-F" "${SSHCONFIG_FILE}")
fi
if [[ "${PRIVATE_KEY_FILE}" != "" ]]; then
ssh_args+=( "-i" "${PRIVATE_KEY_FILE}")
fi
ssh_args+=( "${target_device_ip}" )
if [[ "${#POSITIONAL[@]}" -ne 0 ]]; then
ssh_args+=( "${POSITIONAL[@]}" )
fi
ssh-cmd "${ssh_args[@]}"