2
# Copyright (C) Simon Josefsson
3
# Copyright (C) Viktor Szakats
4
# SPDX-License-Identifier: BSD-3-Clause
6
# Start sshd, invoke test(s), saving exit code, kill sshd, and
12
# https://testanything.org/tap-specification.html
19
if [ -n "${1:-}" ]; then
26
# Load list of SSHD tests from Makefile.inc
30
if [[ "${l}" = 'SSHD_TESTS ='* ]]; then
32
elif [ "${load}" = '1' ]; then
33
[[ "${l}" =~ [a-z0-9_]+ ]] && tests+="${tests:+ }./${BASH_REMATCH[0]}${EXEEXT:-}"
34
[[ ! "${l}" = *"\\" ]] && break
36
done <<< "$(tr -d $"\r" < "${d}/Makefile.inc")"
39
if [ -n "${SSHD_TESTS_LIMIT_TO:-}" ]; then
40
tests="$(echo "${tests}" | cut -d ' ' -f -"${SSHD_TESTS_LIMIT_TO}")"
41
echo "# limiting tests to the first ${SSHD_TESTS_LIMIT_TO}."
46
d="$(cd "${d}" || exit; pwd)" # sshd needs absolute paths
48
SSHD="${SSHD:-/usr/sbin/sshd}"
49
[[ "${uname}" = *'_NT'* ]] && SSHD="$(cygpath "${SSHD}")"
50
ver="$("${SSHD}" -V 2>&1 || true)"
51
if [[ "${ver}" =~ OpenSSH_[a-zA-Z0-9_\ .,]+ ]]; then
52
ver="${BASH_REMATCH[0]}"
56
echo "# sshd executable: '${SSHD}' (${ver})"
58
# for our test clients:
59
[ -z "${PRIVKEY:-}" ] && export PRIVKEY="${d}/key_rsa"
60
[ -z "${PUBKEY:-}" ] && export PUBKEY="${d}/key_rsa.pub"
61
cakeys="${d}/openssh_server/ca_user_keys.pub"
63
logfsrv="$(mktemp)"; readonly logfsrv
64
logfcli="$(mktemp)"; readonly logfcli
66
echo "# sshd log: '${logfsrv}'"
68
SSHD_FLAGS="${SSHD_FLAGS:-}"
69
if [ -n "${DEBUG:-}" ]; then
72
SSHD_FLAGS+=" -E ${logfsrv}"
76
"${d}"/openssh_server/ssh_host_* \
79
# shellcheck disable=SC2086
81
-f "${SSHD_FIXTURE_CONFIG:-${d}/openssh_server/sshd_config}" \
84
-h "${d}/openssh_server/ssh_host_rsa_key" \
85
-h "${d}/openssh_server/ssh_host_ecdsa_key" \
86
-h "${d}/openssh_server/ssh_host_ed25519_key" \
87
-o 'PidFile sshd.pid' \
88
-o "AuthorizedKeysFile ${PUBKEY} ${d}/openssh_server/authorized_keys" \
89
-o "TrustedUserCAKeys ${cakeys}" \
90
-o 'PermitRootLogin yes' \
95
trap 'kill "${sshdpid}"; echo "# signal killing sshd"; exit 1;' EXIT HUP INT TERM
97
: "started sshd (${sshdpid})"
99
SSH="$(command -v "${SSH:-ssh}" || true)"
100
if [ -n "${SSH}" ]; then
101
echo "# ssh executable: '${SSH}' ($("${SSH}" -V 2>&1 || true))"
102
echo "# ssh log: '${logfcli}'"
103
chmod go-rwx "${PRIVKEY}"
104
if [[ "${uname}" = *'_NT'* ]]; then
105
export MSYS2_ARG_CONV_EXCL='/reset'
106
icacls "${PRIVKEY}" /reset
107
icacls "${PRIVKEY}" /grant:r "${USERNAME}:(R)"
108
icacls "${PRIVKEY}" /inheritance:r
111
# shellcheck disable=SC2086
112
while ! "${SSH:-ssh}" -q -a -k \
115
-o 'StrictHostKeyChecking no' \
116
-o 'UserKnownHostsFile /dev/null' \
117
-o 'ConnectTimeout 3' \
119
-p 4711 ${SSH_FLAGS:-} localhost exit 2>>"${logfcli}"; do
121
if [[ "${count}" -gt 8 ]]; then
122
echo '# giving up waiting for sshd. Tests are expected to fail.'
124
sed 's/^/# /' < "${logfsrv}"
125
echo '# ssh test connect log:'
126
sed 's/^/# /' < "${logfcli}"
129
echo '# waiting for sshd...'
133
echo '# giving time for sshd to launch...'
141
total="$(echo "${tests}" | wc -w | tr -d ' ')"
144
echo "${count}..${total}"
146
export OPENSSH_NO_DOCKER=1
148
for test in ${tests}; do
154
[ "${via_args}" = '1' ] && [ "${total}" = '1' ] && ec="${testerr}"
157
echo "${res} ${count} - sshd-$(basename "${test}")"
163
: "killing sshd (${sshdpid})"
164
kill "${sshdpid}" > /dev/null 2>&1
165
trap '' EXIT HUP INT TERM
167
[ "${via_args}" = '1' ] && [ "${total}" != '1' ] && ec="${anyerror}"