103 lines
3.2 KiB
Bash
103 lines
3.2 KiB
Bash
# $OpenBSD: proxyjump.sh,v 1.1 2026/03/30 07:19:02 djm Exp $
|
|
# Placed in the Public Domain.
|
|
|
|
tid="proxyjump"
|
|
|
|
# Parsing tests
|
|
verbose "basic parsing"
|
|
for jspec in \
|
|
"jump1" \
|
|
"user@jump1" \
|
|
"jump1:2222" \
|
|
"user@jump1:2222" \
|
|
"jump1,jump2" \
|
|
"user1@jump1:2221,user2@jump2:2222" \
|
|
"ssh://user@host:2223" \
|
|
; do
|
|
case "$jspec" in
|
|
"jump1") expected="jump1" ;;
|
|
"user@jump1") expected="user@jump1" ;;
|
|
"jump1:2222") expected="jump1:2222" ;;
|
|
"user@jump1:2222") expected="user@jump1:2222" ;;
|
|
"jump1,jump2") expected="jump1,jump2" ;;
|
|
"user1@jump1:2221,user2@jump2:2222")
|
|
expected="user1@jump1:2221,user2@jump2:2222" ;;
|
|
"ssh://user@host:2223") expected="user@host:2223" ;;
|
|
esac
|
|
f=`${SSH} -GF /dev/null -oProxyJump="$jspec" somehost | \
|
|
awk '/^proxyjump /{print $2}'`
|
|
if [ "$f" != "$expected" ]; then
|
|
fail "ProxyJump $jspec: expected $expected, got $f"
|
|
fi
|
|
f=`${SSH} -GF /dev/null -J "$jspec" somehost | \
|
|
awk '/^proxyjump /{print $2}'`
|
|
if [ "$f" != "$expected" ]; then
|
|
fail "ssh -J $jspec: expected $expected, got $f"
|
|
fi
|
|
done
|
|
|
|
verbose "precedence"
|
|
f=`${SSH} -GF /dev/null -oProxyJump=none -oProxyJump=jump1 somehost | \
|
|
grep "^proxyjump "`
|
|
if [ -n "$f" ]; then
|
|
fail "ProxyJump=none first did not win"
|
|
fi
|
|
f=`${SSH} -GF /dev/null -oProxyJump=jump -oProxyCommand=foo somehost | \
|
|
grep "^proxyjump "`
|
|
if [ "$f" != "proxyjump jump" ]; then
|
|
fail "ProxyJump first did not win over ProxyCommand"
|
|
fi
|
|
f=`${SSH} -GF /dev/null -oProxyCommand=foo -oProxyJump=jump somehost | \
|
|
grep "^proxycommand "`
|
|
if [ "$f" != "proxycommand foo" ]; then
|
|
fail "ProxyCommand first did not win over ProxyJump"
|
|
fi
|
|
|
|
verbose "command-line -J invalid characters"
|
|
cp $OBJ/ssh_config $OBJ/ssh_config.orig
|
|
for jspec in \
|
|
"host;with;semicolon" \
|
|
"host'with'quote" \
|
|
"host\`with\`backtick" \
|
|
"host\$with\$dollar" \
|
|
"host(with)brace" \
|
|
"user;with;semicolon@host" \
|
|
"user'with'quote@host" \
|
|
"user\`with\`backtick@host" \
|
|
"user(with)brace@host" ; do
|
|
${SSH} -GF /dev/null -J "$jspec" somehost >/dev/null 2>&1
|
|
if [ $? -ne 255 ]; then
|
|
fail "ssh -J \"$jspec\" was not rejected"
|
|
fi
|
|
${SSH} -GF /dev/null -oProxyJump="$jspec" somehost >/dev/null 2>&1
|
|
if [ $? -ne 255 ]; then
|
|
fail "ssh -oProxyJump=\"$jspec\" was not rejected"
|
|
fi
|
|
done
|
|
# Special characters should be accepted in the config though.
|
|
echo "ProxyJump user;with;semicolon@host;with;semicolon" >> $OBJ/ssh_config
|
|
f=`${SSH} -GF $OBJ/ssh_config somehost | grep "^proxyjump "`
|
|
if [ "$f" != "proxyjump user;with;semicolon@host;with;semicolon" ]; then
|
|
fail "ProxyJump did not allow special characters in config: $f"
|
|
fi
|
|
|
|
verbose "functional test"
|
|
# Use different names to avoid the loop detection in ssh.c
|
|
grep -iv HostKeyAlias $OBJ/ssh_config.orig > $OBJ/ssh_config
|
|
cat << _EOF >> $OBJ/ssh_config
|
|
Host jump-host
|
|
HostkeyAlias jump-host
|
|
Host target-host
|
|
HostkeyAlias target-host
|
|
_EOF
|
|
cp $OBJ/known_hosts $OBJ/known_hosts.orig
|
|
sed 's/^[^ ]* /jump-host /' < $OBJ/known_hosts.orig > $OBJ/known_hosts
|
|
sed 's/^[^ ]* /target-host /' < $OBJ/known_hosts.orig >> $OBJ/known_hosts
|
|
start_sshd
|
|
|
|
verbose "functional ProxyJump"
|
|
res=`${REAL_SSH} -F $OBJ/ssh_config -J jump-host target-host echo "SUCCESS" 2>/dev/null`
|
|
if [ "$res" != "SUCCESS" ]; then
|
|
fail "functional test failed: expected SUCCESS, got $res"
|
|
fi
|