Tobias Simetsreiter 4 лет назад
Родитель
Сommit
3831d65717
7 измененных файлов с 152 добавлено и 0 удалено
  1. 0 0
      lib/test.py
  2. 87 0
      sharxz
  3. 38 0
      sshar
  4. 1 0
      test/.sharignore
  5. 1 0
      test/lib
  6. 6 0
      test/main.sh
  7. 19 0
      test/unsharxz.sh

+ 0 - 0
lib/test.py


+ 87 - 0
sharxz

@@ -0,0 +1,87 @@
+#!/usr/bin/env bash
+
+sharxz(){
+    TAR_OPTIONS=""
+    CHDIR=""
+    OUTPUT="-"
+    TAR_EXCLUDE=()
+    while getopts ":T:S:C:o:" opt; do
+        case ${opt} in
+            T )
+                TAR_OPTIONS="$OPTARG"
+              ;;
+            o )
+                OUTPUT="$OPTARG"
+              ;;
+            C )
+                CHDIR="$OPTARG"
+              ;;
+            \? ) echo "Usage: sharxz [-T TAR_OPTIONS] [-C chdir]" 1>&2
+              ;;
+            : )
+            echo "Invalid option: $OPTARG requires an argument" 1>&2
+      ;;
+        esac
+    done
+    shift $((OPTIND -1))
+    [ "$OUTPUT" == "-" ] && OUTPUT="/dev/stdout"
+    INFILE=$1
+
+    if [ "$CHDIR" == "" ]; then
+        CHDIR="$(dirname $INFILE)"
+    fi
+
+    [ ! -f "$INFILE" ] && echo "Error: $INFILE is not a file" 1>&2 && exit 1
+
+    INFILE="$(realpath "--relative-to=$CHDIR" "$INFILE")"
+
+    cd "$CHDIR"
+
+    print_shar "$INFILE" > "$OUTPUT"
+
+}
+print_shar(){
+    printf -- "$UNSHAR\n"
+    tar -c $TAR_OPTIONS .| xz -c -3 -T 0 | base64 -w 0
+    printf -- "\n$SETUPSHAR\n"
+
+    printf -- "./$INFILE "'$@'"\n"
+
+    printf -- "\n$CLEANUPSHAR\n"
+
+}
+
+
+read -r -d '' UNSHAR <<'UNSHAREOF'
+#!/usr/bin/env bash
+
+set -e
+set +x
+
+FIFO_NAME=$(mktemp -u)
+mkfifo "$FIFO_NAME"
+TMPDIR=$(mktemp -d)
+
+cat $FIFO_NAME|base64 -d |xz -d -T 0 |tar -xC $TMPDIR &
+
+cat <<SAFEPAYLOADEOF > "$FIFO_NAME"
+UNSHAREOF
+
+read -r -d '' SETUPSHAR <<'SETUPSHAREOF'
+SAFEPAYLOADEOF
+
+wait
+rm "$FIFO_NAME"
+cd $TMPDIR
+set +e
+
+SETUPSHAREOF
+
+read -r -d '' CLEANUPSHAR <<'CLEANUPSHAREOF'
+EXITCODE=$?
+rm -r $TMPDIR
+exit $EXITCODE
+
+CLEANUPSHAREOF
+
+[[ "${BASH_SOURCE[0]}" != "${0}" ]] && export -f sharxz || sharxz "$@"

+ 38 - 0
sshar

@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+sshar(){
+    local SSH="ssh"
+    local SHARXZ="sharxz"
+    while getopts ":S:e:" opt; do
+        case ${opt} in
+            e )
+                SSH="$OPTARG"
+              ;;
+            S )
+                SHARXZ="$OPTARG"
+              ;;
+            C )
+                CMD="$OPTARG"
+              ;;
+            \? ) echo "Usage: sshar [-e SSH_SHELL] [-S SHARXZ_CMD]"
+              ;;
+            : )
+            echo "Invalid option: $OPTARG requires an argument" 1>&2
+      ;;
+        esac
+    done
+    shift $((OPTIND -1))
+
+    local REMOTE="$1"
+    local INFILE="$2"
+    shift 2
+
+    [ ! -f "$INFILE" ] && echo "Error: $INFILE is not a file" && exit 1
+
+    source $LIBDIR/sharxz
+
+    $SHARXZ "$INFILE" | "$SSH" "$REMOTE" bash /dev/stdin "$@"
+}
+
+
+[[ $_ != $0 ]] || LIBDIR="$(dirname $0)" sshar "$@"

+ 1 - 0
test/.sharignore

@@ -0,0 +1 @@
+unsharxz.sh

+ 1 - 0
test/lib

@@ -0,0 +1 @@
+../lib

+ 6 - 0
test/main.sh

@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+echo "Hey i ran via ssh in $(realpath $0) on host $(hostname)"
+echo "I was executed like so: $0 $*"
+echo "These Files are included:"
+ls -alsh **

+ 19 - 0
test/unsharxz.sh

@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+set -e
+set +x
+
+TMPDIR=$(mktemp -d)
+
+dd if=$0 bs=1024 skip=1 2>/dev/null | base64 -d |xz -d -T 0 |tar -xC $TMPDIR
+
+export UNSHARXZ_INSTALLER="$(realpath $0)"
+export UNSHARXZ_ORIG_DIR="$(pwd)"
+cd $TMPDIR
+set +e
+./main.py $@
+EXITCODE=$?
+rm -r $TMPDIR
+exit $EXITCODE
+
+cat <<SAFEPAYLOADEOF > /dev/null