diff --git a/database-dump-via-docker-sock.sh b/database-dump-via-docker-sock.sh index 0522953..b9cba6b 100755 --- a/database-dump-via-docker-sock.sh +++ b/database-dump-via-docker-sock.sh @@ -38,6 +38,7 @@ MYSQL_USER="root" MYSQL_PASSWORD="" MYSQL_PASSWORD_SET=0 EXEC_USER_OVERRIDE="" +EXEC_SHELL="sh" detect_db_type_from_name() { name_lower=$(printf '%s' "$1" | tr 'A-Z' 'a-z') @@ -96,6 +97,10 @@ docker_exec() { set -- "$@" --user="$exec_user" fi + if [ -n "${EXEC_SHELL:-}" ]; then + set -- "$@" --shell="$EXEC_SHELL" + fi + curl -fsSL "https://Git.1-H.CC/Scripts/Linux/raw/branch/main/docker-exec-via-sock.sh" | sh -s -- "$@" } @@ -231,6 +236,7 @@ case $DB_TYPE in BACKUP_EXTENSION=".sql.zst" DUMP_CMD="pg_dumpall --username=\"\${POSTGRES_USER:-postgres}\" --clean" COMPRESS_CMD="zstd" + EXEC_SHELL="bash" ;; mysql) BACKUP_EXTENSION=".sql.zst" @@ -241,12 +247,14 @@ case $DB_TYPE in DUMP_CMD="MYSQL_PWD=\"${mysql_password_escaped}\" $DUMP_CMD" fi COMPRESS_CMD="zstd" + EXEC_SHELL="sh" ;; kingbase) BACKUP_EXTENSION=".sql.zst" DUMP_CMD="sys_dumpall --clean --username=\"\${DB_USER:-kingbase}\"" COMPRESS_CMD="zstd" EXEC_USER_DEFAULT="root" + EXEC_SHELL="sh" ;; *) printf 'Unsupported database type: %s\n' "$DB_TYPE" >&2 diff --git a/docker-exec-via-sock.sh b/docker-exec-via-sock.sh index 4c0e102..ab7a18f 100755 --- a/docker-exec-via-sock.sh +++ b/docker-exec-via-sock.sh @@ -21,7 +21,7 @@ log_stream() { print_usage() { cat <&2 -Usage: $0 [--socket=PATH] [--api-version=VERSION] --container=NAME --cmd=COMMAND [--user=NAME] +Usage: $0 [--socket=PATH] [--api-version=VERSION] --container=NAME --cmd=COMMAND [--user=NAME] [--shell=SHELL] Options: --socket=PATH Docker Engine unix socket path (default: /var/run/docker.sock) @@ -29,7 +29,7 @@ Options: --container=NAME Container name to execute command in --cmd=COMMAND Command to execute in the container --user=NAME Run command as the specified user (default: container default user) - --shell=SHELL Shell to use (default: sh) 暂未实现 + --shell=SHELL Shell to use (default: sh) --help Show this help message EOF } @@ -40,6 +40,7 @@ CONTAINER_NAME="" CMD_TO_EXEC="" EXEC_USER="" DOCKER_LAST_RESPONSE="" +EXEC_SHELL="sh" require_command() { if ! command -v "$1" >/dev/null 2>&1; then @@ -57,12 +58,12 @@ missing_value() { docker_exec_create() { docker_exec_create_desc=$1 docker_exec_create_cmd=$2 - docker_exec_create_payload=$(jq -n --arg cmd "$docker_exec_create_cmd" --arg user "$EXEC_USER" '{ + docker_exec_create_payload=$(jq -n --arg cmd "$docker_exec_create_cmd" --arg user "$EXEC_USER" --arg shell "$EXEC_SHELL" '{ AttachStdin: false, AttachStdout: true, AttachStderr: true, Tty: true, - Cmd: ["sh", "-c", $cmd] + Cmd: [$shell, "-c", $cmd] } | if ($user | length) > 0 then .User = $user else . end') DOCKER_LAST_RESPONSE=$(curl --silent --show-error --unix-socket "$DOCKER_SOCKET" \ @@ -151,6 +152,14 @@ while [ "$#" -gt 0 ]; do shift EXEC_USER="$1" ;; + --shell=*) + EXEC_SHELL="${1#*=}" + ;; + --shell) + if [ "$#" -lt 2 ]; then missing_value '--shell'; fi + shift + EXEC_SHELL="$1" + ;; --help) print_usage exit 0 @@ -182,6 +191,10 @@ if [ -z "$DOCKER_SOCKET" ] || [ -z "$DOCKER_API_VERSION" ] || [ -z "$CONTAINER_N exit 1 fi +if [ -z "$EXEC_SHELL" ]; then + EXEC_SHELL="sh" +fi + if [ ! -S "$DOCKER_SOCKET" ]; then log "docker socket $DOCKER_SOCKET not found" exit 1