119261079SEd Maste#!/bin/sh 219261079SEd Maste# 319261079SEd Maste# usage: configs vmname test_config (or '' for default) 419261079SEd Maste# 519261079SEd Maste# Sets the following variables: 619261079SEd Maste# CONFIGFLAGS options to ./configure 719261079SEd Maste# SSHD_CONFOPTS sshd_config options 819261079SEd Maste# TEST_TARGET make target used when testing. defaults to "tests". 919261079SEd Maste# LTESTS 1019261079SEd Maste 1119261079SEd Masteconfig=$1 12f374ba41SEd Masteif [ "$config" = "" ]; then 13f374ba41SEd Maste config="default" 14f374ba41SEd Mastefi 1519261079SEd Maste 1638a52bd3SEd Masteunset CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO 1738a52bd3SEd Maste 18f374ba41SEd MasteTEST_TARGET="tests compat-tests" 1919261079SEd MasteLTESTS="" 2019261079SEd MasteSKIP_LTESTS="" 2119261079SEd MasteSUDO=sudo # run with sudo by default 2219261079SEd MasteTEST_SSH_UNSAFE_PERMISSIONS=1 231323ec57SEd Maste# Stop on first test failure to minimize logs 241323ec57SEd MasteTEST_SSH_FAIL_FATAL=yes 2519261079SEd Maste 2619261079SEd MasteCONFIGFLAGS="" 2719261079SEd MasteLIBCRYPTOFLAGS="" 2819261079SEd Maste 2919261079SEd Mastecase "$config" in 3019261079SEd Maste default|sol64) 3119261079SEd Maste ;; 3219261079SEd Maste c89) 33edf85781SEd Maste # If we don't have LLONG_MAX, configure will figure out that it can 34edf85781SEd Maste # get it by setting -std=gnu99, at which point we won't be testing 35edf85781SEd Maste # C89 any more. To avoid this, feed it in via CFLAGS. 36edf85781SEd Maste llong_max=`gcc -E -dM - </dev/null | \ 37edf85781SEd Maste awk '$2=="__LONG_LONG_MAX__"{print $3}'` 38edf85781SEd Maste CPPFLAGS="-DLLONG_MAX=${llong_max}" 39edf85781SEd Maste 4019261079SEd Maste CC="gcc" 4119261079SEd Maste CFLAGS="-Wall -std=c89 -pedantic -Werror=vla" 421323ec57SEd Maste CONFIGFLAGS="--without-zlib" 431323ec57SEd Maste LIBCRYPTOFLAGS="--without-openssl" 4419261079SEd Maste TEST_TARGET=t-exec 4519261079SEd Maste ;; 461323ec57SEd Maste cygwin-release) 4738a52bd3SEd Maste # See https://cygwin.com/git/?p=git/cygwin-packages/openssh.git;a=blob;f=openssh.cygport;hb=HEAD 4838a52bd3SEd Maste CONFIGFLAGS="--with-xauth=/usr/bin/xauth --with-security-key-builtin" 4938a52bd3SEd Maste CONFIGFLAGS="$CONFIGFLAGS --with-kerberos5=/usr --with-libedit --disable-strip" 501323ec57SEd Maste ;; 511323ec57SEd Maste clang-12-Werror) 521323ec57SEd Maste CC="clang-12" 531323ec57SEd Maste # clang's implicit-fallthrough requires that the code be annotated with 541323ec57SEd Maste # __attribute__((fallthrough)) and does not understand /* FALLTHROUGH */ 5587c1498dSEd Maste CFLAGS="-Wall -Wextra -O2 -Wno-error=implicit-fallthrough -Wno-error=unused-parameter" 561323ec57SEd Maste CONFIGFLAGS="--with-pam --with-Werror" 571323ec57SEd Maste ;; 5838a52bd3SEd Maste *-sanitize-*) 5938a52bd3SEd Maste case "$config" in 6038a52bd3SEd Maste gcc-*) 6138a52bd3SEd Maste CC=gcc 6238a52bd3SEd Maste ;; 6338a52bd3SEd Maste clang-*) 6438a52bd3SEd Maste # Find the newest available version of clang 6538a52bd3SEd Maste for i in `seq 10 99`; do 6638a52bd3SEd Maste clang="`which clang-$i 2>/dev/null`" 6738a52bd3SEd Maste [ -x "$clang" ] && CC="$clang" 6838a52bd3SEd Maste done 6938a52bd3SEd Maste ;; 7038a52bd3SEd Maste esac 7138a52bd3SEd Maste # Put Sanitizer logs in regress dir. 7238a52bd3SEd Maste SANLOGS=`pwd`/regress 7338a52bd3SEd Maste # - We replace chroot with chdir so that the sanitizer in the preauth 7438a52bd3SEd Maste # privsep process can read /proc. 7538a52bd3SEd Maste # - clang does not recognizes explicit_bzero so we use bzero 7638a52bd3SEd Maste # (see https://github.com/google/sanitizers/issues/1507 7738a52bd3SEd Maste # - openssl and zlib trip ASAN. 7838a52bd3SEd Maste # - sp_pwdp returned by getspnam trips ASAN, hence disabling shadow. 7938a52bd3SEd Maste case "$config" in 8038a52bd3SEd Maste *-sanitize-address) 8138a52bd3SEd Maste CFLAGS="-fsanitize=address -fno-omit-frame-pointer" 8238a52bd3SEd Maste LDFLAGS="-fsanitize=address" 8338a52bd3SEd Maste CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -D_FORTIFY_SOURCE=0 -DASAN_OPTIONS=\"detect_leaks=0:log_path='$SANLOGS'/asan.log\"' 8438a52bd3SEd Maste CONFIGFLAGS="" 8538a52bd3SEd Maste TEST_TARGET="t-exec" 8638a52bd3SEd Maste ;; 8738a52bd3SEd Maste clang-sanitize-memory) 8838a52bd3SEd Maste CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer" 8938a52bd3SEd Maste LDFLAGS="-fsanitize=memory" 9038a52bd3SEd Maste CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DMSAN_OPTIONS=\"log_path='$SANLOGS'/msan.log\"' 91535af610SEd Maste CONFIGFLAGS="--without-zlib --without-shadow" 92535af610SEd Maste LIBCRYPTOFLAGS="--without-openssl" 9338a52bd3SEd Maste TEST_TARGET="t-exec" 9438a52bd3SEd Maste ;; 9538a52bd3SEd Maste *-sanitize-undefined) 9638a52bd3SEd Maste CFLAGS="-fsanitize=undefined" 9738a52bd3SEd Maste LDFLAGS="-fsanitize=undefined" 9838a52bd3SEd Maste ;; 9938a52bd3SEd Maste *) 10038a52bd3SEd Maste echo unknown sanitize option; 10138a52bd3SEd Maste exit 1;; 10238a52bd3SEd Maste esac 10338a52bd3SEd Maste features="--disable-security-key --disable-pkcs11" 10438a52bd3SEd Maste hardening="--without-sandbox --without-hardening --without-stackprotect" 10538a52bd3SEd Maste privsep="--with-privsep-user=root" 10638a52bd3SEd Maste CONFIGFLAGS="$CONFIGFLAGS $features $hardening $privsep" 10738a52bd3SEd Maste # Because we hobble chroot we can't test it. 10838a52bd3SEd Maste SKIP_LTESTS=sftp-chroot 10938a52bd3SEd Maste ;; 1101323ec57SEd Maste gcc-11-Werror) 111069ac184SEd Maste CC="gcc-11" 1121323ec57SEd Maste # -Wnoformat-truncation in gcc 7.3.1 20180130 fails on fmt_scaled 113069ac184SEd Maste # -Wunused-result ignores (void) so is not useful. See 114069ac184SEd Maste # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425 115069ac184SEd Maste CFLAGS="-O2 -Wno-format-truncation -Wimplicit-fallthrough=4 -Wno-unused-parameter -Wno-unused-result" 116069ac184SEd Maste CONFIGFLAGS="--with-pam --with-Werror" 117069ac184SEd Maste ;; 118069ac184SEd Maste gcc-12-Werror) 119069ac184SEd Maste CC="gcc-12" 120069ac184SEd Maste # -Wnoformat-truncation in gcc 7.3.1 20180130 fails on fmt_scaled 121069ac184SEd Maste # -Wunused-result ignores (void) so is not useful. See 122069ac184SEd Maste # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425 123069ac184SEd Maste CFLAGS="-O2 -Wno-format-truncation -Wimplicit-fallthrough=4 -Wno-unused-parameter -Wno-unused-result" 1241323ec57SEd Maste CONFIGFLAGS="--with-pam --with-Werror" 1251323ec57SEd Maste ;; 1261323ec57SEd Maste clang*|gcc*) 1271323ec57SEd Maste CC="$config" 1281323ec57SEd Maste ;; 12919261079SEd Maste kitchensink) 13019261079SEd Maste CONFIGFLAGS="--with-kerberos5 --with-libedit --with-pam" 13119261079SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --with-security-key-builtin --with-selinux" 132f374ba41SEd Maste CFLAGS="-DSK_DEBUG -DSANDBOX_SECCOMP_FILTER_DEBUG" 13319261079SEd Maste ;; 13419261079SEd Maste hardenedmalloc) 13519261079SEd Maste CONFIGFLAGS="--with-ldflags=-lhardened_malloc" 13619261079SEd Maste ;; 1371323ec57SEd Maste tcmalloc) 1381323ec57SEd Maste CONFIGFLAGS="--with-ldflags=-ltcmalloc" 1391323ec57SEd Maste ;; 1401323ec57SEd Maste krb5|heimdal) 14119261079SEd Maste CONFIGFLAGS="--with-kerberos5" 14219261079SEd Maste ;; 14319261079SEd Maste libedit) 14419261079SEd Maste CONFIGFLAGS="--with-libedit" 14519261079SEd Maste ;; 1461323ec57SEd Maste musl) 1471323ec57SEd Maste CC="musl-gcc" 1481323ec57SEd Maste CONFIGFLAGS="--without-zlib" 1491323ec57SEd Maste LIBCRYPTOFLAGS="--without-openssl" 1501323ec57SEd Maste TEST_TARGET="t-exec" 1511323ec57SEd Maste ;; 15219261079SEd Maste pam-krb5) 15319261079SEd Maste CONFIGFLAGS="--with-pam --with-kerberos5" 15419261079SEd Maste SSHD_CONFOPTS="UsePam yes" 15519261079SEd Maste ;; 15619261079SEd Maste *pam) 15719261079SEd Maste CONFIGFLAGS="--with-pam" 15819261079SEd Maste SSHD_CONFOPTS="UsePam yes" 15919261079SEd Maste ;; 160535af610SEd Maste boringssl) 161535af610SEd Maste CONFIGFLAGS="--disable-pkcs11" 162535af610SEd Maste LIBCRYPTOFLAGS="--with-ssl-dir=/opt/boringssl --with-rpath=-Wl,-rpath," 163535af610SEd Maste ;; 16419261079SEd Maste libressl-*) 16519261079SEd Maste LIBCRYPTOFLAGS="--with-ssl-dir=/opt/libressl --with-rpath=-Wl,-rpath," 16619261079SEd Maste ;; 167a91a2465SEd Maste putty-*) 168a91a2465SEd Maste CONFIGFLAGS="--with-plink=/usr/local/bin/plink --with-puttygen=/usr/local/bin/puttygen" 169a91a2465SEd Maste # We don't need to rerun the regular tests, just the interop ones. 170a91a2465SEd Maste TEST_TARGET=interop-tests 171a91a2465SEd Maste ;; 17219261079SEd Maste openssl-*) 17319261079SEd Maste LIBCRYPTOFLAGS="--with-ssl-dir=/opt/openssl --with-rpath=-Wl,-rpath," 174f374ba41SEd Maste # OpenSSL 1.1.1 specifically has a bug in its RNG that breaks reexec 175f374ba41SEd Maste # fallback. See https://bugzilla.mindrot.org/show_bug.cgi?id=3483 176f374ba41SEd Maste if [ "$config" = "openssl-1.1.1" ]; then 177f374ba41SEd Maste SKIP_LTESTS="reexec" 178f374ba41SEd Maste fi 17919261079SEd Maste ;; 18019261079SEd Maste selinux) 18119261079SEd Maste CONFIGFLAGS="--with-selinux" 18219261079SEd Maste ;; 18319261079SEd Maste sk) 18419261079SEd Maste CONFIGFLAGS="--with-security-key-builtin" 18519261079SEd Maste ;; 18619261079SEd Maste without-openssl) 18719261079SEd Maste LIBCRYPTOFLAGS="--without-openssl" 18819261079SEd Maste TEST_TARGET=t-exec 18919261079SEd Maste ;; 190*3d9fd9fcSEd Maste valgrind-[1-4]|valgrind-unit) 19119261079SEd Maste # rlimit sandbox and FORTIFY_SOURCE confuse Valgrind. 19219261079SEd Maste CONFIGFLAGS="--without-sandbox --without-hardening" 19319261079SEd Maste CONFIGFLAGS="$CONFIGFLAGS --with-cppflags=-D_FORTIFY_SOURCE=0" 19419261079SEd Maste TEST_TARGET="t-exec USE_VALGRIND=1" 19519261079SEd Maste TEST_SSH_ELAPSED_TIMES=1 19619261079SEd Maste export TEST_SSH_ELAPSED_TIMES 19719261079SEd Maste # Valgrind slows things down enough that the agent timeout test 19819261079SEd Maste # won't reliably pass, and the unit tests run longer than allowed 199f374ba41SEd Maste # by github so split into separate tests. 200*3d9fd9fcSEd Maste tests2="integrity try-ciphers rekey" 20138a52bd3SEd Maste tests3="krl forward-control sshsig agent-restrict kextype sftp" 2021323ec57SEd Maste tests4="cert-userkey cert-hostkey kextype sftp-perm keygen-comment percent" 20319261079SEd Maste case "$config" in 20419261079SEd Maste valgrind-1) 205f374ba41SEd Maste # All tests except agent-timeout (which is flaky under valgrind), 206f374ba41SEd Maste # connection-timeout (which doesn't work since it's so slow) 20738a52bd3SEd Maste # and hostbased (since valgrind won't let ssh exec keysign). 20838a52bd3SEd Maste # Slow ones are run separately to increase parallelism. 209f374ba41SEd Maste SKIP_LTESTS="agent-timeout connection-timeout hostbased" 2100fdf8faeSEd Maste SKIP_LTESTS="$SKIP_LTESTS penalty-expire" 211f374ba41SEd Maste SKIP_LTESTS="$SKIP_LTESTS ${tests2} ${tests3} ${tests4} ${tests5}" 21219261079SEd Maste ;; 21319261079SEd Maste valgrind-2) 21419261079SEd Maste LTESTS="${tests2}" 21519261079SEd Maste ;; 21619261079SEd Maste valgrind-3) 21719261079SEd Maste LTESTS="${tests3}" 21819261079SEd Maste ;; 21919261079SEd Maste valgrind-4) 22019261079SEd Maste LTESTS="${tests4}" 22119261079SEd Maste ;; 22219261079SEd Maste valgrind-unit) 22319261079SEd Maste TEST_TARGET="unit USE_VALGRIND=1" 22419261079SEd Maste ;; 22519261079SEd Maste esac 22619261079SEd Maste ;; 227edf85781SEd Maste zlib-develop) 228edf85781SEd Maste INSTALL_ZLIB=develop 229edf85781SEd Maste CONFIGFLAGS="--with-zlib=/opt/zlib --with-rpath=-Wl,-rpath," 230edf85781SEd Maste ;; 23119261079SEd Maste *) 23219261079SEd Maste echo "Unknown configuration $config" 23319261079SEd Maste exit 1 23419261079SEd Maste ;; 23519261079SEd Masteesac 23619261079SEd Maste 23719261079SEd Maste# The Solaris 64bit targets are special since they need a non-flag arg. 23819261079SEd Mastecase "$config" in 23919261079SEd Maste sol64*) 240535af610SEd Maste CONFIGFLAGS="--target=x86_64 --with-cflags=-m64 --with-ldflags=-m64 ${CONFIGFLAGS}" 241535af610SEd Maste LIBCRYPTOFLAGS="--with-ssl-dir=/usr/local/ssl64 --with-rpath=-Wl,-rpath," 24219261079SEd Maste ;; 24319261079SEd Masteesac 24419261079SEd Maste 24519261079SEd Mastecase "${TARGET_HOST}" in 24687c1498dSEd Maste aix*) 247535af610SEd Maste CONFIGFLAGS="--disable-security-key" 248535af610SEd Maste LIBCRYPTOFLAGS="--without-openssl" 24987c1498dSEd Maste # These are slow real or virtual machines so skip the slowest tests 25087c1498dSEd Maste # (which tend to be thw ones that transfer lots of data) so that the 25187c1498dSEd Maste # test run does not time out. 25287c1498dSEd Maste # The agent-restrict test fails due to some quoting issue when run 25387c1498dSEd Maste # with sh or ksh so specify bash for now. 2544d3fc8b0SEd Maste TEST_TARGET="t-exec unit TEST_SHELL=bash" 25587c1498dSEd Maste SKIP_LTESTS="rekey sftp" 25687c1498dSEd Maste ;; 257f374ba41SEd Maste debian-riscv64) 258f374ba41SEd Maste # This machine is fairly slow, so skip the unit tests. 259f374ba41SEd Maste TEST_TARGET="t-exec" 260f374ba41SEd Maste ;; 26119261079SEd Maste dfly58*|dfly60*) 26219261079SEd Maste # scp 3-way connection hangs on these so skip until sorted. 26319261079SEd Maste SKIP_LTESTS=scp3 26419261079SEd Maste ;; 26587c1498dSEd Maste fbsd6) 26687c1498dSEd Maste # Native linker is not great with PIC so OpenSSL is built w/out. 26787c1498dSEd Maste CONFIGFLAGS="${CONFIGFLAGS} --disable-security-key" 26887c1498dSEd Maste ;; 26919261079SEd Maste hurd) 27019261079SEd Maste SKIP_LTESTS="forwarding multiplex proxy-connect hostkey-agent agent-ptrace" 27119261079SEd Maste ;; 27219261079SEd Maste minix3) 273535af610SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --disable-security-key" 274a91a2465SEd Maste # Unix domain sockets don't work quite like we expect, so also 275a91a2465SEd Maste # disable FD passing (and thus multiplexing). 276a91a2465SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --disable-fd-passing" 277535af610SEd Maste LIBCRYPTOFLAGS="--without-openssl" 278a91a2465SEd Maste 27919261079SEd Maste # Minix does not have a loopback interface so we have to skip any 2801323ec57SEd Maste # test that relies on one. 2811323ec57SEd Maste # Also, Minix seems to be very limited in the number of select() 2821323ec57SEd Maste # calls that can be operating concurrently, so prune additional tests for that. 283f374ba41SEd Maste T="addrmatch agent-restrict brokenkeys cfgmatch cfgmatchlisten cfgparse 284a91a2465SEd Maste connect connect-uri dynamic-forward exit-status forwarding 285a91a2465SEd Maste forward-control 286a91a2465SEd Maste hostkey-agent key-options keyscan knownhosts-command login-timeout 2871323ec57SEd Maste reconfigure reexec rekey scp scp-uri scp3 sftp sftp-badcmds 2881323ec57SEd Maste sftp-batch sftp-cmds sftp-glob sftp-perm sftp-uri stderr-data 2890fdf8faeSEd Maste transfer penalty penalty-expire" 2901323ec57SEd Maste SKIP_LTESTS="$(echo $T)" 29119261079SEd Maste TEST_TARGET=t-exec 29219261079SEd Maste SUDO="" 29319261079SEd Maste ;; 29419261079SEd Maste nbsd4) 29519261079SEd Maste # System compiler will ICE on some files with fstack-protector 2961323ec57SEd Maste # SHA256 functions in sha2.h conflict with OpenSSL's breaking sk-dummy 2971323ec57SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --without-hardening --disable-security-key" 29819261079SEd Maste ;; 29987c1498dSEd Maste openwrt-*) 300535af610SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --without-zlib" 301535af610SEd Maste LIBCRYPTOFLAGS="--without-openssl" 30287c1498dSEd Maste TEST_TARGET="t-exec" 30387c1498dSEd Maste ;; 30419261079SEd Maste sol10|sol11) 30519261079SEd Maste # sol10 VM is 32bit and the unit tests are slow. 30619261079SEd Maste # sol11 has 4 test configs so skip unit tests to speed up. 30719261079SEd Maste TEST_TARGET="tests SKIP_UNIT=1" 30819261079SEd Maste ;; 30919261079SEd Maste win10) 31019261079SEd Maste # No sudo on Windows. 31119261079SEd Maste SUDO="" 31219261079SEd Maste ;; 31319261079SEd Masteesac 31419261079SEd Maste 315535af610SEd Mastehost=`./config.guess` 316535af610SEd Mastecase "$host" in 31738a52bd3SEd Maste*cygwin) 31838a52bd3SEd Maste SUDO="" 319f374ba41SEd Maste # Don't run compat tests on cygwin as they don't currently compile. 320f374ba41SEd Maste TEST_TARGET="tests" 32138a52bd3SEd Maste ;; 32238a52bd3SEd Maste*-darwin*) 3231323ec57SEd Maste # Unless specified otherwise, build without OpenSSL on Mac OS since 3241323ec57SEd Maste # modern versions don't ship with libcrypto. 3251323ec57SEd Maste LIBCRYPTOFLAGS="--without-openssl" 3261323ec57SEd Maste TEST_TARGET=t-exec 327a91a2465SEd Maste 328a91a2465SEd Maste # On some OS X runners we can't write to /var/empty. 329a91a2465SEd Maste CONFIGFLAGS="${CONFIGFLAGS} --with-privsep-path=/usr/local/empty" 330a91a2465SEd Maste 331535af610SEd Maste case "$host" in 332535af610SEd Maste *-darwin22.*) 333535af610SEd Maste # sudo -S nobody doesn't work on macos 13 for some reason. 334535af610SEd Maste SKIP_LTESTS="agent-getpeereid" ;; 335535af610SEd Maste esac 3361323ec57SEd Maste ;; 3371323ec57SEd Masteesac 3381323ec57SEd Maste 339535af610SEd Maste# Unless specifically configured, search for a suitable version of OpenSSL, 340535af610SEd Maste# otherwise build without it. 34119261079SEd Masteif [ -z "${LIBCRYPTOFLAGS}" ]; then 342535af610SEd Maste LIBCRYPTOFLAGS="--without-openssl" 34319261079SEd Maste # last-match 344535af610SEd Maste for i in /usr /usr/local /usr/local/ssl /usr/local/opt/openssl; do 345535af610SEd Maste ver="none" 34619261079SEd Maste if [ -x ${i}/bin/openssl ]; then 347535af610SEd Maste ver="$(${i}/bin/openssl version)" 34819261079SEd Maste fi 349535af610SEd Maste case "$ver" in 350535af610SEd Maste none) ;; 351535af610SEd Maste "OpenSSL 0."*|"OpenSSL 1.0."*|"OpenSSL 1.1.0"*) ;; 352535af610SEd Maste "LibreSSL 2."*|"LibreSSL 3.0."*) ;; 353535af610SEd Maste *) LIBCRYPTOFLAGS="--with-ssl-dir=${i}" ;; 354535af610SEd Maste esac 35519261079SEd Maste done 356535af610SEd Maste if [ "${LIBCRYPTOFLAGS}" = "--without-openssl" ]; then 357535af610SEd Maste TEST_TARGET="t-exec" 358535af610SEd Maste fi 35919261079SEd Mastefi 36019261079SEd Maste 36119261079SEd MasteCONFIGFLAGS="${CONFIGFLAGS} ${LIBCRYPTOFLAGS}" 36219261079SEd Maste 36319261079SEd Masteif [ -x "$(which plink 2>/dev/null)" ]; then 36419261079SEd Maste REGRESS_INTEROP_PUTTY=yes 36519261079SEd Maste export REGRESS_INTEROP_PUTTY 36619261079SEd Mastefi 36719261079SEd Maste 36838a52bd3SEd Masteexport CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO 3691323ec57SEd Masteexport TEST_TARGET TEST_SSH_UNSAFE_PERMISSIONS TEST_SSH_FAIL_FATAL 370