初始提交:terminalX 可运行态(M0/M1/M1.5 已真机验证)
- M0: libghostty SSH 终端(渲染/输入/连接)+ 白屏修复(OutputGate) + 会话状态机/自动重连 - M1: tsnet 用户态组网 + SSH-over-tsnet(fd 桥),shell 级真机验证;R5(Go+gvisor+C+++Swift 同进程) retire - M1.5: tmux -CC 原生 tab(MVP) - 结构: packages/(TXCore·TXTransport), apps/TerminalX, vendor/(libghostty-spm/libssh2/mbedtls/tsnet-bridge), artifacts/ - 文档: CLAUDE.md + docs/HANDOFF.md(新会话入口) - 环境: 认证代理→依赖 vendor 本地化;Go 在 ~/.local/go;仅模拟器/未签名 - 待续: M2 mosh, tmux 多 pane, M4 安全(host key/SE) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
169
vendor/libssh2/tests/test_sshd.test
vendored
Executable file
169
vendor/libssh2/tests/test_sshd.test
vendored
Executable file
@@ -0,0 +1,169 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (C) Simon Josefsson
|
||||
# Copyright (C) Viktor Szakats
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
# Start sshd, invoke test(s), saving exit code, kill sshd, and
|
||||
# return exit code.
|
||||
|
||||
set -e
|
||||
set -u
|
||||
|
||||
# https://testanything.org/tap-specification.html
|
||||
|
||||
d="$(dirname "$0")"
|
||||
uname="$(uname)"
|
||||
|
||||
# Load list of tests
|
||||
|
||||
if [ -n "${1:-}" ]; then
|
||||
# for CMake or manual
|
||||
tests="$*"
|
||||
via_args=1
|
||||
else
|
||||
# for autotools
|
||||
via_args=0
|
||||
# Load list of SSHD tests from Makefile.inc
|
||||
tests=''
|
||||
load=0
|
||||
while read -r l; do
|
||||
if [[ "${l}" = 'SSHD_TESTS ='* ]]; then
|
||||
load=1
|
||||
elif [ "${load}" = '1' ]; then
|
||||
[[ "${l}" =~ [a-z0-9_]+ ]] && tests+="${tests:+ }./${BASH_REMATCH[0]}${EXEEXT:-}"
|
||||
[[ ! "${l}" = *"\\" ]] && break
|
||||
fi
|
||||
done <<< "$(tr -d $"\r" < "${d}/Makefile.inc")"
|
||||
fi
|
||||
|
||||
if [ -n "${SSHD_TESTS_LIMIT_TO:-}" ]; then
|
||||
tests="$(echo "${tests}" | cut -d ' ' -f -"${SSHD_TESTS_LIMIT_TO}")"
|
||||
echo "# limiting tests to the first ${SSHD_TESTS_LIMIT_TO}."
|
||||
fi
|
||||
|
||||
# Init and start sshd
|
||||
|
||||
d="$(cd "${d}" || exit; pwd)" # sshd needs absolute paths
|
||||
|
||||
SSHD="${SSHD:-/usr/sbin/sshd}"
|
||||
[[ "${uname}" = *'_NT'* ]] && SSHD="$(cygpath "${SSHD}")"
|
||||
ver="$("${SSHD}" -V 2>&1 || true)"
|
||||
if [[ "${ver}" =~ OpenSSH_[a-zA-Z0-9_\ .,]+ ]]; then
|
||||
ver="${BASH_REMATCH[0]}"
|
||||
else
|
||||
ver=''
|
||||
fi
|
||||
echo "# sshd executable: '${SSHD}' (${ver})"
|
||||
|
||||
# for our test clients:
|
||||
[ -z "${PRIVKEY:-}" ] && export PRIVKEY="${d}/key_rsa"
|
||||
[ -z "${PUBKEY:-}" ] && export PUBKEY="${d}/key_rsa.pub"
|
||||
cakeys="${d}/openssh_server/ca_user_keys.pub"
|
||||
|
||||
logfsrv="$(mktemp)"; readonly logfsrv
|
||||
logfcli="$(mktemp)"; readonly logfcli
|
||||
|
||||
echo "# sshd log: '${logfsrv}'"
|
||||
|
||||
SSHD_FLAGS="${SSHD_FLAGS:-}"
|
||||
if [ -n "${DEBUG:-}" ]; then
|
||||
SSHD_FLAGS+=' -d -d'
|
||||
else
|
||||
SSHD_FLAGS+=" -E ${logfsrv}"
|
||||
fi
|
||||
|
||||
chmod go-rwx \
|
||||
"${d}"/openssh_server/ssh_host_* \
|
||||
"${cakeys}"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
"${SSHD}" \
|
||||
-f "${SSHD_FIXTURE_CONFIG:-${d}/openssh_server/sshd_config}" \
|
||||
-o 'Port 4711' \
|
||||
-o 'StrictModes no' \
|
||||
-h "${d}/openssh_server/ssh_host_rsa_key" \
|
||||
-h "${d}/openssh_server/ssh_host_ecdsa_key" \
|
||||
-h "${d}/openssh_server/ssh_host_ed25519_key" \
|
||||
-o 'PidFile sshd.pid' \
|
||||
-o "AuthorizedKeysFile ${PUBKEY} ${d}/openssh_server/authorized_keys" \
|
||||
-o "TrustedUserCAKeys ${cakeys}" \
|
||||
-o 'PermitRootLogin yes' \
|
||||
-D \
|
||||
${SSHD_FLAGS} &
|
||||
sshdpid=$!
|
||||
|
||||
trap 'kill "${sshdpid}"; echo "# signal killing sshd"; exit 1;' EXIT HUP INT TERM
|
||||
|
||||
: "started sshd (${sshdpid})"
|
||||
|
||||
SSH="$(command -v "${SSH:-ssh}" || true)"
|
||||
if [ -n "${SSH}" ]; then
|
||||
echo "# ssh executable: '${SSH}' ($("${SSH}" -V 2>&1 || true))"
|
||||
echo "# ssh log: '${logfcli}'"
|
||||
chmod go-rwx "${PRIVKEY}"
|
||||
if [[ "${uname}" = *'_NT'* ]]; then
|
||||
export MSYS2_ARG_CONV_EXCL='/reset'
|
||||
icacls "${PRIVKEY}" /reset
|
||||
icacls "${PRIVKEY}" /grant:r "${USERNAME}:(R)"
|
||||
icacls "${PRIVKEY}" /inheritance:r
|
||||
fi
|
||||
count=1
|
||||
# shellcheck disable=SC2086
|
||||
while ! "${SSH:-ssh}" -q -a -k \
|
||||
-F /dev/null \
|
||||
-o 'BatchMode yes' \
|
||||
-o 'StrictHostKeyChecking no' \
|
||||
-o 'UserKnownHostsFile /dev/null' \
|
||||
-o 'ConnectTimeout 3' \
|
||||
-i "${PRIVKEY}" \
|
||||
-p 4711 ${SSH_FLAGS:-} localhost exit 2>>"${logfcli}"; do
|
||||
((count++))
|
||||
if [[ "${count}" -gt 8 ]]; then
|
||||
echo '# giving up waiting for sshd. Tests are expected to fail.'
|
||||
echo '# sshd log:'
|
||||
sed 's/^/# /' < "${logfsrv}"
|
||||
echo '# ssh test connect log:'
|
||||
sed 's/^/# /' < "${logfcli}"
|
||||
break
|
||||
fi
|
||||
echo '# waiting for sshd...'
|
||||
sleep 1
|
||||
done
|
||||
else
|
||||
echo '# giving time for sshd to launch...'
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# Run tests
|
||||
|
||||
ec=0
|
||||
count=1
|
||||
total="$(echo "${tests}" | wc -w | tr -d ' ')"
|
||||
anyerror=0
|
||||
|
||||
echo "${count}..${total}"
|
||||
|
||||
export OPENSSH_NO_DOCKER=1
|
||||
|
||||
for test in ${tests}; do
|
||||
if "${test}"; then
|
||||
res='ok'
|
||||
else
|
||||
testerr=$?
|
||||
anyerror=1
|
||||
[ "${via_args}" = '1' ] && [ "${total}" = '1' ] && ec="${testerr}"
|
||||
res='not ok'
|
||||
fi
|
||||
echo "${res} ${count} - sshd-$(basename "${test}")"
|
||||
((count++))
|
||||
done
|
||||
|
||||
# Stop sshd
|
||||
|
||||
: "killing sshd (${sshdpid})"
|
||||
kill "${sshdpid}" > /dev/null 2>&1
|
||||
trap '' EXIT HUP INT TERM
|
||||
|
||||
[ "${via_args}" = '1' ] && [ "${total}" != '1' ] && ec="${anyerror}"
|
||||
|
||||
exit "${ec}"
|
||||
Reference in New Issue
Block a user