262 lines
7.8 KiB
Bash
Executable file
262 lines
7.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
if '[' '-n' "${ZSH_VERSION-}" ']'; then
|
|
'emulate' 'sh' '-o' 'no_aliases' '-o' 'no_glob'
|
|
else
|
|
'set' '-f'
|
|
fi
|
|
|
|
_z4h_bypass=''
|
|
|
|
for _z4h_ssh_cmd in 'tar' 'tail' 'rm' 'mkdir' 'mv' 'cp' 'ln' 'wc' 'cat' 'uname' 'tr'; do
|
|
if ! command -v "$_z4h_ssh_cmd" >'/dev/null' 2>&1; then
|
|
_z4h_bypass='1'
|
|
'break'
|
|
fi
|
|
done
|
|
|
|
if '[' '-z' "$_z4h_bypass" ']'; then
|
|
{
|
|
_z4h_ssh_platform="$('command' 'uname' '-sm')" &&
|
|
_z4h_ssh_platform="$('printf' '%s' "$_z4h_ssh_platform" | 'command' 'tr' '[A-Z]' '[a-z]')" ||
|
|
_z4h_ssh_platform=''
|
|
} 2>'/dev/null'
|
|
|
|
case "$_z4h_ssh_platform" in
|
|
'darwin arm64');;
|
|
'darwin x86_64');;
|
|
'linux aarch64');;
|
|
'linux armv6l');;
|
|
'linux armv7l');;
|
|
'linux armv8l');;
|
|
'linux x86_64');;
|
|
'linux i686');;
|
|
*) _z4h_bypass='1';;
|
|
esac
|
|
fi
|
|
|
|
if '[' '-n' "$_z4h_bypass" ']'; then
|
|
command -v 'rm' >'/dev/null' 2>&1 && 'command' 'rm' '-f' '--' "$0"
|
|
|
|
export TERM=^TERM^
|
|
|
|
if '[' '-x' "${SHELL-}" ']'; then
|
|
case "/$SHELL" in
|
|
*/'ksh93') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'dash') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'vbash') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'bash') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'tcsh') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'csh') 'exec' "$SHELL" '-l'; 'exit';;
|
|
*/'zsh') 'exec' "$SHELL" '-l'; 'exit';;
|
|
esac
|
|
fi
|
|
|
|
'printf' '\001z4h.%s%s' ^DUMP_MARKER^ 'bypass '
|
|
'exit'
|
|
fi
|
|
|
|
'set' '--' "$0"
|
|
|
|
_z4h_ssh_error() {
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' '\033[33mz4h\033[0m: failed to start \033[32mzsh\033[0m on \033[1m%s\033[0m\n' ^SSH_HOST^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' 'See error messages above to identify the culprit.\n'
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' 'Open login shell on \033[1m%s\033[0m:\n' ^SSH_HOST^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' ' \033[4;32mcommand\033[0m \033[32mssh\033[0m %s\n' ^SSH_ARGS^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' 'Open interactive \033[32msh\033[0m on \033[1m%s\033[0m:\n' ^SSH_HOST^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' ' \033[4;32mcommand\033[0m \033[32mssh\033[0m %s sh -i\n' ^SSH_ARGS^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' 'Configure \033[32mz4h\033[0m \033[1mssh\033[0m to open login shell on \033[1m%s\033[0m (like above):\n' ^SSH_HOST^
|
|
>&2 'printf' '\n'
|
|
>&2 'printf' ' \033[32mzstyle\033[0m \033[33m\047:z4h:ssh:%s\047\033[0m enable no\n' ^SSH_HOST^
|
|
>&2 'printf' '\n'
|
|
}
|
|
|
|
_z4h_ssh_mktemp() {
|
|
if '[' '-n' "${TMPDIR-}" '-a' '(' '(' '-d' "${TMPDIR-}" '-a' '-w' "${TMPDIR-}" ')' '-o' \
|
|
'!' '(' '-d' '/tmp' '-a' '-w' '/tmp' ')' ')' ]; then
|
|
'set' '--' "$TMPDIR"
|
|
else
|
|
'set' '--' '/tmp'
|
|
fi
|
|
if command -v 'mktemp' >'/dev/null' 2>&1; then
|
|
_z4h_ssh_tmp="$('command' 'mktemp' '-d' -- "$1"/z4h-ssh.XXXXXXXXXX)"
|
|
else
|
|
_z4h_ssh_tmp="$1"/z4h-ssh.tmp."$$"
|
|
'[' '!' '-e' "$_z4h_ssh_tmp" ']' || 'command' 'rm' '-rf' '--' "$_z4h_ssh_tmp" || 'exit'
|
|
'command' 'mkdir' '-p' '--' "$_z4h_ssh_tmp" || 'exit'
|
|
fi
|
|
}
|
|
|
|
_z4h_ssh_cleanup='"trap" "-" "HUP" "INT" "TERM" "EXIT"; "command" "rm" "-rf" "--" "$@" 2>"/dev/null"'
|
|
'trap' "$_z4h_ssh_cleanup; 'exit' '129'" 'HUP'
|
|
'trap' "$_z4h_ssh_cleanup; 'exit' '130'" 'INT'
|
|
'trap' "$_z4h_ssh_cleanup; 'exit' '143'" 'TERM'
|
|
'trap' "$_z4h_ssh_cleanup; _z4h_ssh_error" 'EXIT'
|
|
|
|
z4h_min_version=^MIN_VERSION^
|
|
z4h_ssh_client=^SSH_CLIENT^
|
|
z4h_ssh_host=^SSH_HOST^
|
|
|
|
'export' Z4H_SSH="$z4h_min_version":"$z4h_ssh_client":"$z4h_ssh_host"
|
|
'export' P9K_TTY="old"
|
|
if '[' ^CAN_SAVE_RESTORE_SCREEN^ '=' '1' ']'; then
|
|
'export' _Z4H_SSH_MARKER=^DUMP_MARKER^
|
|
fi
|
|
|
|
^PRELUDE^
|
|
|
|
_z4h_ssh_tar_c_opt=
|
|
_z4h_ssh_tar_x_opt=
|
|
if _z4h_ssh_tar_v="$('command' 'tar' '--version' 2>&1)"; then
|
|
case "$_z4h_ssh_tar_v" in
|
|
*'GNU tar'*)
|
|
_z4h_ssh_tar_c_opt='--owner=0 --group=0'
|
|
_z4h_ssh_tar_x_opt='--warning=no-unknown-keyword --warning=no-timestamp --no-same-owner'
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
_z4h_ssh_mktemp
|
|
'set' '--' "$@" "$_z4h_ssh_tmp"
|
|
|
|
'command' 'tail' '-c' '+'^DUMP_POS^ '--' "$0" \
|
|
| 'command' 'tar' '-C' "$_z4h_ssh_tmp" $_z4h_ssh_tar_x_opt '-xzf' '-' || 'exit'
|
|
|
|
'command' 'rm' '-f' '--' "$0" || 'exit'
|
|
'shift'
|
|
|
|
_z4h_ssh_src='0'
|
|
|
|
for _z4h_ssh_dst in ^SEND_TO^; do
|
|
_z4h_ssh_src="$((_z4h_ssh_src + 1))"
|
|
case "$_z4h_ssh_dst" in
|
|
'')
|
|
>&2 'printf' '\033[33mz4h\033[0m: \033[31mz4h_ssh_send_files[%s]\033[0m is empty after expansion\n' "$((2 * _z4h_ssh_src + 2))"
|
|
'exit' '1'
|
|
;;
|
|
*/)
|
|
>&2 'printf' '\033[33mz4h\033[0m: \033[1mz4h_ssh_send_files[%s]\033[0m ends with \033[1m/\033[0m after expansion: \033[31m%s\033[0m\n' "$((2 * _z4h_ssh_src + 2))" "$_z4h_ssh_dst"
|
|
'exit' '1'
|
|
;;
|
|
/*);;
|
|
*)
|
|
>&2 'printf' '\033[33mz4h\033[0m: \033[1mz4h_ssh_send_files[%s]\033[0m is not absolute: \033[31m%s\033[0m\n' "$((2 * _z4h_ssh_src + 2))" "$_z4h_ssh_dst"
|
|
'exit' '1'
|
|
;;
|
|
esac
|
|
if '[' '-e' "$_z4h_ssh_dst" ']'; then
|
|
'command' 'rm' '-rf' '--' "$_z4h_ssh_dst" || 'exit'
|
|
fi
|
|
if '[' '-e' "$1"/"$_z4h_ssh_src" ']'; then
|
|
_z4h_ssh_dir="${_z4h_ssh_dst%/*}"
|
|
if '[' '!' '-e' "$_z4h_ssh_dir" ]; then
|
|
'command' 'mkdir' '-p' '--' "$_z4h_ssh_dir" || 'exit'
|
|
fi
|
|
if ! 'command' 'mv' '-f' '--' "$1"/"$_z4h_ssh_src" "$_z4h_ssh_dst" 2>'/dev/null'; then
|
|
'command' 'cp' '-rf' '--' "$1"/"$_z4h_ssh_src" "$_z4h_ssh_dst" || 'exit'
|
|
fi
|
|
fi
|
|
done
|
|
|
|
'rm' '-rf' '--' "$_z4h_ssh_tmp" || 'exit'
|
|
|
|
^SETUP^
|
|
|
|
'set' '--' "$0"
|
|
'printf' '' >"$0" || 'exit'
|
|
|
|
(
|
|
'trap' '-' 'HUP' 'INT' 'TERM' 'EXIT'
|
|
'unset' '-f' '_z4h_ssh_error' '_z4h_ssh_mktemp'
|
|
'unset' '_z4h_ssh_cleanup' '_z4h_ssh_tar_v' '_z4h_ssh_tar_c_opt' '_z4h_ssh_tar_x_opt'
|
|
'unset' '_z4h_ssh_cmd' '_z4h_ssh_tmp' '_z4h_ssh_src' '_z4h_ssh_dst' 'z4h_min_version'
|
|
'unset' 'z4h_ssh_client' 'z4h_ssh_host' '_z4h_ssh_platform'
|
|
export _z4h_ssh_feedback="$0"
|
|
Z4H_BOOTSTRAPPING='1'
|
|
'set' '+f'
|
|
'set' '--'
|
|
if '[' '-n' "${ZSH_VERSION-}" ']'; then
|
|
'setopt' 'aliases'
|
|
fi
|
|
^RUN^
|
|
_z4h_ssh_ret="$?"
|
|
'set' '-f'
|
|
'command' 'rm' '--' "$0" || 'exit'
|
|
'exit' "$_z4h_ssh_ret"
|
|
)
|
|
|
|
_z4h_ssh_ret="${?#0}"
|
|
'[' '-e' "$0" ']' || 'exit' "${_z4h_ssh_ret:-1}"
|
|
|
|
'trap' "$_z4h_ssh_cleanup" 'EXIT'
|
|
'.' "$0"
|
|
'rm' '-f' '--' "$0" || 'exit'
|
|
'set' '--'
|
|
|
|
^TEARDOWN^
|
|
|
|
if ^EMPTY_RETRIEVE_FROM^; then
|
|
'trap' '-' 'HUP' 'INT' 'TERM' 'EXIT'
|
|
'exit' "${_z4h_ssh_ret:-0}"
|
|
fi
|
|
|
|
_z4h_ssh_mktemp
|
|
'set' '--' "$@" "$_z4h_ssh_tmp"
|
|
|
|
_z4h_ssh_dst='0'
|
|
_z4h_ssh_dst_list=''
|
|
|
|
for _z4h_ssh_src in ^RETRIEVE_FROM^; do
|
|
_z4h_ssh_dst="$((_z4h_ssh_dst + 1))"
|
|
if '[' '-z' "$_z4h_ssh_src" ']'; then
|
|
>&2 'printf' '\033[33mz4h\033[0m: empty file source path \033[31mnumber '$((_z4h_ssh_dst+1))'\033[0m\n'
|
|
'exit' '1'
|
|
fi
|
|
if '[' '-e' "$_z4h_ssh_src" ']'; then
|
|
'command' 'ln' '-s' '--' "$_z4h_ssh_src" "$_z4h_ssh_tmp"/"$_z4h_ssh_dst" || 'exit'
|
|
_z4h_ssh_dst_list="$_z4h_ssh_dst_list $_z4h_ssh_dst"
|
|
fi
|
|
done
|
|
|
|
_z4h_dump_size='0'
|
|
|
|
if command -v 'base64' >'/dev/null' 2>&1 && command -v 'tr' >'/dev/null' 2>&1; then
|
|
if '[' '-n' "$_z4h_ssh_dst_list" ']'; then
|
|
case "$_z4h_ssh_tar_v" in
|
|
*'GNU tar'*) _z4h_ssh_tar_opt='--owner=0 --group=0';;
|
|
esac
|
|
'command' 'tar' '-C' "$_z4h_ssh_tmp" $tar_opt '-czhf' "$_z4h_ssh_tmp"/dump.tar.gz \
|
|
'--' $_z4h_ssh_dst_list || 'exit'
|
|
'base64' <"$_z4h_ssh_tmp"/dump.tar.gz >"$_z4h_ssh_tmp"/dump.base64 || 'exit'
|
|
'command' 'tr' '-d' '\n' <"$_z4h_ssh_tmp"/dump.base64 >"$_z4h_ssh_tmp"/dump.base64-sl || 'exit'
|
|
_z4h_dump_size="$('command' 'wc' '-c' <"$_z4h_ssh_tmp"/dump.base64-sl)" || 'exit'
|
|
fi
|
|
fi
|
|
|
|
while '[' "${_z4h_dump_size# }" '!=' "$_z4h_dump_size" ']'; do
|
|
_z4h_dump_size="${_z4h_dump_size# }"
|
|
done
|
|
|
|
'[' "${#_z4h_dump_size}" '-lt' '16' ']' || _z4h_dump_size='0'
|
|
|
|
while '[' "${#_z4h_dump_size}" '-lt' '16' ']'; do
|
|
_z4h_dump_size="$_z4h_dump_size "
|
|
done
|
|
|
|
{
|
|
'printf' '\001z4h.%s%s' ^DUMP_MARKER^ "$_z4h_dump_size" || 'exit'
|
|
if '[' "$_z4h_dump_size" '!=' '0 ' ']'; then
|
|
'command' 'cat' '--' "$_z4h_ssh_tmp"/dump.base64-sl || 'exit'
|
|
fi
|
|
} 2>'/dev/null'
|
|
|
|
'command' 'rm' '-rf' '--' "$@" || 'exit'
|
|
'trap' '-' 'HUP' 'INT' 'TERM' 'EXIT'
|
|
'exit' "${_z4h_ssh_ret:-0}"
|