mirror of
https://github.com/msantos/xmppipe
synced 2024-11-16 00:12:59 +00:00
71 lines
1.2 KiB
Bash
Executable File
71 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
## Tunnel ssh over an XMPP MUC
|
|
##
|
|
## Server (system with access to the SSH and XMPP server):
|
|
##
|
|
## # ssh-over-xmpp server <conference> <IP address> <port>
|
|
## ssh-over-xmpp server sshxmpp 1.2.3.4 22
|
|
##
|
|
## Client (system with access to the XMPP server):
|
|
##
|
|
## ssh -o ProxyCommand="ssh-over-xmpp client sshxmpp" 127.0.0.1
|
|
##
|
|
|
|
set -o errexit
|
|
set -o nounset
|
|
set -o pipefail
|
|
|
|
if [ "$DEBUG" ]; then
|
|
set -x
|
|
fi
|
|
|
|
PROGNAME=$0
|
|
TMPDIR=$(mktemp -d)
|
|
out=$TMPDIR/out
|
|
|
|
atexit() {
|
|
rm -rf $TMPDIR
|
|
}
|
|
|
|
decode() {
|
|
while read line; do
|
|
OFS=$IFS
|
|
IFS=:
|
|
set -- $line
|
|
[ "$1" = "m" ] && printf '%b' "${!#//%/\\x}"
|
|
IFS=$OFS
|
|
done
|
|
}
|
|
|
|
server() {
|
|
CONNECT=0
|
|
xmppipe -e -r server -o $1 -b 1024 -x < /dev/null | \
|
|
while read line; do
|
|
case $line in
|
|
p*)
|
|
CONNECT=$((CONNECT + 1))
|
|
if [ "$CONNECT" -gt "1" ]; then
|
|
exec "$PROGNAME" session $@
|
|
fi
|
|
;;
|
|
*) ;;
|
|
esac
|
|
done > /dev/null
|
|
}
|
|
|
|
session(){
|
|
mkdir -p $TMPDIR
|
|
trap atexit 0
|
|
|
|
mkfifo $out
|
|
|
|
nc $2 $3 < $out | xmppipe -P 100 -r session -o $1 -x -s | decode > $out
|
|
}
|
|
|
|
client() {
|
|
xmppipe -P 100 -r client -o $1 -x -s | decode
|
|
}
|
|
|
|
$@
|