2021-06-08 09:05:27 +02:00
|
|
|
# $OpenBSD: sshcfgparse.sh,v 1.9 2021/06/08 07:05:27 dtucker Exp $
|
2016-06-03 06:10:41 +02:00
|
|
|
# Placed in the Public Domain.
|
|
|
|
|
|
|
|
tid="ssh config parse"
|
|
|
|
|
2019-07-23 15:32:48 +02:00
|
|
|
dsa=0
|
|
|
|
for t in $SSH_KEYTYPES; do
|
|
|
|
case "$t" in
|
|
|
|
ssh-dss) dsa=1 ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2018-07-04 15:51:12 +02:00
|
|
|
expect_result_present() {
|
|
|
|
_str="$1" ; shift
|
|
|
|
for _expect in "$@" ; do
|
|
|
|
echo "$f" | tr ',' '\n' | grep "^$_expect\$" >/dev/null
|
|
|
|
if test $? -ne 0 ; then
|
|
|
|
fail "missing expected \"$_expect\" from \"$_str\""
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
expect_result_absent() {
|
|
|
|
_str="$1" ; shift
|
|
|
|
for _expect in "$@" ; do
|
|
|
|
echo "$f" | tr ',' '\n' | grep "^$_expect\$" >/dev/null
|
|
|
|
if test $? -eq 0 ; then
|
|
|
|
fail "unexpected \"$_expect\" present in \"$_str\""
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2016-06-03 06:10:41 +02:00
|
|
|
verbose "reparse minimal config"
|
|
|
|
(${SSH} -G -F $OBJ/ssh_config somehost >$OBJ/ssh_config.1 &&
|
|
|
|
${SSH} -G -F $OBJ/ssh_config.1 somehost >$OBJ/ssh_config.2 &&
|
2021-06-08 08:51:47 +02:00
|
|
|
diff $OBJ/ssh_config.1 $OBJ/ssh_config.2) || fail "failed to reparse minimal"
|
2016-06-03 06:10:41 +02:00
|
|
|
|
|
|
|
verbose "ssh -W opts"
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config host | awk '/exitonforwardfailure/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "no" || fail "exitonforwardfailure default"
|
2016-06-03 06:10:41 +02:00
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -W a:1 h | awk '/exitonforwardfailure/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "yes" || fail "exitonforwardfailure enable"
|
2016-06-03 06:10:41 +02:00
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -W a:1 -o exitonforwardfailure=no h | \
|
|
|
|
awk '/exitonforwardfailure/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "no" || fail "exitonforwardfailure override"
|
2016-06-03 06:10:41 +02:00
|
|
|
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config host | awk '/clearallforwardings/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "no" || fail "clearallforwardings default"
|
2016-06-03 06:10:41 +02:00
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -W a:1 h | awk '/clearallforwardings/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "yes" || fail "clearallforwardings enable"
|
2016-06-03 06:10:41 +02:00
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -W a:1 -o clearallforwardings=no h | \
|
|
|
|
awk '/clearallforwardings/{print $2}'`
|
2018-10-04 23:16:02 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2016-07-14 03:24:21 +02:00
|
|
|
test "$f" = "no" || fail "clearallforwardings override"
|
2016-06-03 06:10:41 +02:00
|
|
|
|
2018-04-06 06:18:35 +02:00
|
|
|
verbose "user first match"
|
|
|
|
user=`awk '$1=="User" {print $2}' $OBJ/ssh_config`
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config host | awk '/^user /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-04-06 06:18:35 +02:00
|
|
|
test "$f" = "$user" || fail "user from config, expected '$user' got '$f'"
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -o user=foo -l bar baz@host | awk '/^user /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-04-06 06:18:35 +02:00
|
|
|
test "$f" = "foo" || fail "user first match -oUser, expected 'foo' got '$f' "
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config -lbar baz@host user=foo baz@host | awk '/^user /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-04-06 06:18:35 +02:00
|
|
|
test "$f" = "bar" || fail "user first match -l, expected 'bar' got '$f'"
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config baz@host -o user=foo -l bar baz@host | awk '/^user /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-04-06 06:18:35 +02:00
|
|
|
test "$f" = "baz" || fail "user first match user@host, expected 'baz' got '$f'"
|
|
|
|
|
2021-02-25 00:12:35 +01:00
|
|
|
verbose "pubkeyacceptedalgorithms"
|
2018-07-04 15:51:12 +02:00
|
|
|
# Default set
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none host | awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-07-04 15:51:12 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519" "ssh-ed25519-cert-v01.*"
|
|
|
|
expect_result_absent "$f" "ssh-dss"
|
|
|
|
# Explicit override
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none -opubkeyacceptedalgorithms=ssh-ed25519 host | \
|
|
|
|
awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-07-04 15:51:12 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519"
|
|
|
|
expect_result_absent "$f" "ssh-ed25519-cert-v01.*" "ssh-dss"
|
|
|
|
# Removal from default set
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none -opubkeyacceptedalgorithms=-ssh-ed25519-cert* host | \
|
|
|
|
awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-07-04 15:51:12 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519"
|
|
|
|
expect_result_absent "$f" "ssh-ed25519-cert-v01.*" "ssh-dss"
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none -opubkeyacceptedalgorithms=-ssh-ed25519 host | \
|
|
|
|
awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2018-07-04 15:51:12 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519-cert-v01.*"
|
|
|
|
expect_result_absent "$f" "ssh-ed25519" "ssh-dss"
|
|
|
|
# Append to default set.
|
2019-07-23 15:32:48 +02:00
|
|
|
# This is not tested when built !WITH_OPENSSL
|
|
|
|
if [ "$dsa" = "1" ]; then
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none -opubkeyacceptedalgorithms=+ssh-dss-cert* host | \
|
|
|
|
awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-07-23 15:32:48 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519" "ssh-dss-cert-v01.*"
|
|
|
|
expect_result_absent "$f" "ssh-dss"
|
2021-02-25 00:12:35 +01:00
|
|
|
f=`${SSH} -GF none -opubkeyacceptedalgorithms=+ssh-dss host | \
|
|
|
|
awk '/^pubkeyacceptedalgorithms /{print $2}'`
|
2019-12-10 00:12:46 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-07-23 15:32:48 +02:00
|
|
|
expect_result_present "$f" "ssh-ed25519" "ssh-ed25519-cert-v01.*" "ssh-dss"
|
|
|
|
expect_result_absent "$f" "ssh-dss-cert-v01.*"
|
|
|
|
fi
|
2018-07-04 15:51:12 +02:00
|
|
|
|
2019-12-21 03:33:07 +01:00
|
|
|
verbose "agentforwarding"
|
|
|
|
f=`${SSH} -GF none host | awk '/^forwardagent /{print$2}'`
|
2021-04-29 21:41:08 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-12-21 03:33:07 +01:00
|
|
|
expect_result_present "$f" "no"
|
|
|
|
f=`${SSH} -GF none -oforwardagent=no host | awk '/^forwardagent /{print$2}'`
|
2021-04-29 21:41:08 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-12-21 03:33:07 +01:00
|
|
|
expect_result_present "$f" "no"
|
|
|
|
f=`${SSH} -GF none -oforwardagent=yes host | awk '/^forwardagent /{print$2}'`
|
2021-04-29 21:41:08 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-12-21 03:33:07 +01:00
|
|
|
expect_result_present "$f" "yes"
|
|
|
|
f=`${SSH} -GF none '-oforwardagent=SSH_AUTH_SOCK.forward' host | awk '/^forwardagent /{print$2}'`
|
2021-04-29 21:41:08 +02:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2019-12-21 03:33:07 +01:00
|
|
|
expect_result_present "$f" "SSH_AUTH_SOCK.forward"
|
|
|
|
|
2021-06-08 09:05:27 +02:00
|
|
|
verbose "command line override"
|
|
|
|
cat >$OBJ/ssh_config.0 <<EOD
|
|
|
|
Host *
|
|
|
|
IPQoS af21 cs1
|
|
|
|
TunnelDevice 1:2
|
|
|
|
EOD
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config.0 -oipqos=cs1 host | awk '/^ipqos /{print$2}'`
|
2022-03-11 22:53:27 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2021-06-08 09:05:27 +02:00
|
|
|
expect_result_present "$f" "cs1"
|
|
|
|
f=`${SSH} -GF $OBJ/ssh_config.0 -otunneldevice=3:4 host | awk '/^tunneldevice /{print$2}'`
|
2022-03-11 22:53:27 +01:00
|
|
|
if [ "$os" == "windows" ]; then
|
|
|
|
f=${f/$'\r'/} # remove CR (carriage return)
|
|
|
|
fi
|
2021-06-08 09:05:27 +02:00
|
|
|
expect_result_present "$f" "3:4"
|
|
|
|
|
2016-06-03 06:10:41 +02:00
|
|
|
# cleanup
|
|
|
|
rm -f $OBJ/ssh_config.[012]
|