vscode-remote-release icon indicating copy to clipboard operation
vscode-remote-release copied to clipboard

`tar -xf --no-same-owner` Option Not Supported on OpenWrt Remote Host for Extracting VS Code Server

Open mcwindy opened this issue 1 year ago • 5 comments

Is there an existing issue for this bug?

  • [x] I have searched the existing open issues and found none that apply.
  • [x] If I find any issue of interest that is related or closed, I will included a link to it in this issue.

Required Troubleshooting Steps

  • [x] I have read and performed the troubleshooting steps
  • [x] I have tried both values of the remote.SSH.useLocalServer setting
  • [x] My issue was not covered in the Tips and Tricks linked from the Troubleshooting Wiki.
  • [x] I will include a complete copy of my Remote - SSH logs by running Remote-SSH: Show Log in the command palette or from View > Output in the menu bar

[Optional] Diagnose with Copilot

I asked @remote-ssh and it helped, but I still want to report this bug

In step 2 of the troubleshooting wiki, what was the result of running the generated SSH command verbatim outside of VS Code?

I COULD successfully SSH to the remote machine with the generated SSH command

Remote-SSH Log

Remote-SSH Log

10:50:32.206] Log Level: 2
[10:50:32.211] SSH Resolver called for "ssh-remote+2", attempt 1
[10:50:32.215] remote.SSH.useLocalServer = false
[10:50:32.215] remote.SSH.useExecServer = true
[10:50:32.215] remote.SSH.showLoginTerminal = false
[10:50:32.215] remote.SSH.remotePlatform = {"2":"linux","159.75.115.50":"linux","root":"linux","lighthouse":"linux","txyun":"linux","azure":"linux","azure2":"linux","azure3":"linux"}
[10:50:32.215] remote.SSH.path = 
[10:50:32.215] remote.SSH.configFile = 
[10:50:32.215] remote.SSH.useFlock = true
[10:50:32.216] remote.SSH.lockfilesInTmp = false
[10:50:32.216] remote.SSH.localServerDownload = auto
[10:50:32.216] remote.SSH.remoteServerListenOnSocket = false
[10:50:32.216] remote.SSH.defaultExtensions = []
[10:50:32.216] remote.SSH.loglevel = 2
[10:50:32.216] remote.SSH.enableDynamicForwarding = true
[10:50:32.216] remote.SSH.enableRemoteCommand = true
[10:50:32.216] remote.SSH.serverPickPortsFromRange = {}
[10:50:32.216] remote.SSH.serverInstallPath = {}
[10:50:32.216] remote.SSH.permitPtyAllocation = false
[10:50:32.216] remote.SSH.preferredLocalPortRange = undefined
[10:50:32.216] remote.SSH.useCurlAndWgetConfigurationFiles = false
[10:50:32.217] remote.SSH.experimental.chat = true
[10:50:32.217] remote.SSH.experimental.enhancedSessionLogs = true
[10:50:32.229] VS Code version: 1.96.2
[10:50:32.229] Remote-SSH version: [email protected]
[10:50:32.229] linux x64
[10:50:32.231] SSH Resolver called for host: 2
[10:50:32.231] Setting up SSH remote "2"
[10:50:32.237] Using commit id "fabdb6a30b49f79a7aba0f2ad9df9b399473380f" and quality "stable" for server
[10:50:32.241] Script variables:
 {
  "ExitCode.0": "OK",
  "ExitCode.64": "LinuxPrereqs",
  "ExitCode.65": "ProxyAuthenticationRequired",
  "ExitCode.128": "UnparsableOutput",
  "ExitCode.129": "EmptyOutput",
  "ExitCode.131": "UnhandledResolverExitCode",
  "ExitCode.132": "OfflineError",
  "ExitCode.133": "SshInstall",
  "ExitCode.134": "FindLocalPort",
  "ExitCode.135": "Timeout",
  "ExitCode.136": "ExhaustedRetries",
  "ExitCode.137": "PermissionDenied",
  "ExitCode.138": "MitmPortForwardingDisabled",
  "ExitCode.139": "Canceled",
  "ExitCode.140": "BadLocalDownloadRequest",
  "ExitCode.141": "LocalDownloadFailed",
  "ExitCode.142": "LocalLockTimeout",
  "ExitCode.143": "NoBash",
  "ExitCode.144": "InvalidHostName",
  "ExitCode.145": "BadInstallScriptResult",
  "ExitCode.146": "ShellRequestFailedOnChannel",
  "ExitCode.147": "InvalidPortRange",
  "ExitCode.148": "SendDisconnectBrokenPipe",
  "ExitCode.149": "LocalServerCrashed",
  "ExitCode.150": "NoFreePortInRange",
  "ExitCode.151": "InvalidCustomServerPath",
  "ExitCode.192": "AlreadyInProgress",
  "ExitCode.193": "ServerDownloadFailed",
  "ExitCode.194": "NoDownloaderAvailable",
  "ExitCode.195": "NoDownloaderAvailableForStatusCheck",
  "ExitCode.196": "UnsupportedArch",
  "ExitCode.197": "StatusCheckFailed",
  "ExitCode.198": "NeedInsidersArch",
  "ExitCode.199": "ServerTransferFailed",
  "ExitCode.200": "ServerFailedToStart",
  "ExitCode.201": "NeedInsidersWindows",
  "ExitCode.202": "CreateInstallDirFailed",
  "ExitCode.203": "UnsupportedPlatform",
  "ExitCode.204": "ServerTerminatedCVE20201416",
  "ExitCode.205": "UnpackFailed",
  "ExitCode.206": "ChangeDirFailed",
  "ExitCode.1023": "UnclassifiedError",
  "ExitCode.OK": "0",
  "ExitCode.LinuxPrereqs": "64",
  "ExitCode.ProxyAuthenticationRequired": "65",
  "ExitCode.UnparsableOutput": "128",
  "ExitCode.EmptyOutput": "129",
  "ExitCode.UnhandledResolverExitCode": "131",
  "ExitCode.OfflineError": "132",
  "ExitCode.SshInstall": "133",
  "ExitCode.FindLocalPort": "134",
  "ExitCode.Timeout": "135",
  "ExitCode.ExhaustedRetries": "136",
  "ExitCode.PermissionDenied": "137",
  "ExitCode.MitmPortForwardingDisabled": "138",
  "ExitCode.Canceled": "139",
  "ExitCode.BadLocalDownloadRequest": "140",
  "ExitCode.LocalDownloadFailed": "141",
  "ExitCode.LocalLockTimeout": "142",
  "ExitCode.NoBash": "143",
  "ExitCode.InvalidHostName": "144",
  "ExitCode.BadInstallScriptResult": "145",
  "ExitCode.ShellRequestFailedOnChannel": "146",
  "ExitCode.InvalidPortRange": "147",
  "ExitCode.SendDisconnectBrokenPipe": "148",
  "ExitCode.LocalServerCrashed": "149",
  "ExitCode.NoFreePortInRange": "150",
  "ExitCode.InvalidCustomServerPath": "151",
  "ExitCode.AlreadyInProgress": "192",
  "ExitCode.ServerDownloadFailed": "193",
  "ExitCode.NoDownloaderAvailable": "194",
  "ExitCode.NoDownloaderAvailableForStatusCheck": "195",
  "ExitCode.UnsupportedArch": "196",
  "ExitCode.StatusCheckFailed": "197",
  "ExitCode.NeedInsidersArch": "198",
  "ExitCode.ServerTransferFailed": "199",
  "ExitCode.ServerFailedToStart": "200",
  "ExitCode.NeedInsidersWindows": "201",
  "ExitCode.CreateInstallDirFailed": "202",
  "ExitCode.UnsupportedPlatform": "203",
  "ExitCode.ServerTerminatedCVE20201416": "204",
  "ExitCode.UnpackFailed": "205",
  "ExitCode.ChangeDirFailed": "206",
  "ExitCode.UnclassifiedError": "1023",
  "InstallUnpackCode.Success": "success",
  "InstallUnpackCode.Error": "error",
  "InstallUnpackCode.MissingFiles": "missingFiles",
  "uuid": "0fb7d2cabd79",
  "startMarker": "0fb7d2cabd79: running",
  "commitId": "fabdb6a30b49f79a7aba0f2ad9df9b399473380f",
  "quality": "stable",
  "token": "a1aaaaa1-a111-1a1a-111a-111111111aaa",
  "vscodeAgentFolder": "$HOME/.vscode-server",
  "allowClientDownload": "1",
  "forceClientDownload": "0",
  "cliNameInArchive": "code",
  "ignoreWgetConfigFlag": " --no-config ",
  "ignoreCurlConfigFlag": " --disable ",
  "wgetTriesSegment": "--tries=1",
  "listenArgs": "--on-host=127.0.0.1 --on-port",
  "getDownloadServerStartTrigger": "0fb7d2cabd79:trigger_server_download",
  "getDownloadServerEndTrigger": "0fb7d2cabd79:trigger_server_download_end",
  "getProgressDownloading": "0fb7d2cabd79%%1%%",
  "getProgressInstalling": "0fb7d2cabd79%%2%%",
  "printVars": "echo \"SSH_AUTH_SOCK==$SSH_AUTH_SOCK==\"\necho \"DISPLAY==$DISPLAY==\""
}
[10:50:32.243] Install and start server if needed
[10:50:32.247] PATH: /home/mcwindy/.bun/bin:/home/mcwindy/.deno/bin:/home/mcwindy/.nvm/versions/node/v22.9.0/bin:/home/mcwindy/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
[10:50:32.247] Checking ssh with "ssh -V"
[10:50:32.263] > OpenSSH_9.7p1 Ubuntu-7ubuntu4, OpenSSL 3.3.1 4 Jun 2024

[10:50:32.267] Running script with connection command: ssh -T -D 33339 -o ConnectTimeout=15 2 sh
[10:50:32.267] Generated SSH command: 'ssh -T -D 33339 -o ConnectTimeout=15 2 sh << 'EOSSH'
# shellcheck shell=sh

echo "0fb7d2cabd79: running"
echo "Script executing under PID: $$"

VSC_TMP="${XDG_RUNTIME_DIR:-/tmp}"

# Configuration
UUID="0fb7d2cabd79"
COMMIT_ID="fabdb6a30b49f79a7aba0f2ad9df9b399473380f"
QUALITY="stable"
TOKEN="d0dfeef5-c991-4f6a-837f-822441760bcc"
VSCODE_AGENT_FOLDER="$HOME/.vscode-server"
ALLOW_CLIENT_DOWNLOAD="1"
FORCE_CLIENT_DOWNLOAD="0"
CLI_NAME_IN_ARCHIVE="code"
IGNORE_WGET_CONFIG_FLAG=" --no-config "
IGNORE_CURL_CONFIG_FLAG=" --disable "
WGET_TRIES_SEGMENT="--tries=1"
LISTEN_ARGS="--on-host=127.0.0.1 --on-port"

CLI_NAME_ON_DISK="${CLI_NAME_IN_ARCHIVE}-${COMMIT_ID}"
CLI_PATH="${VSCODE_AGENT_FOLDER}/${CLI_NAME_ON_DISK}"
CLI_LOG_FILE="${VSCODE_AGENT_FOLDER}/.cli.${COMMIT_ID}.log"

# Marker strings
GET_DOWNLOAD_SERVER_START_TRIGGER="0fb7d2cabd79:trigger_server_download"
GET_DOWNLOAD_SERVER_END_TRIGGER="0fb7d2cabd79:trigger_server_download_end"
GET_PROGRESS_DOWNLOADING="0fb7d2cabd79%%1%%"
GET_PROGRESS_INSTALLING="0fb7d2cabd79%%2%%"

UNPACK_RESULT=
DID_LOCAL_DOWNLOAD=0
DOWNLOAD_TIME=
INSTALL_TIME=
SERVER_START_TIME=

fail_with_exitcode() {
	echo "${UUID}: start"
	echo "exitCode==$1=="
	echo_common_results
	echo "${UUID}: end"
	exit 0
}

echo_common_results() {
	echo "listeningOn==$LISTENING_ON=="
	echo "osReleaseId==$OSRELEASEID=="
	echo "arch==$ARCH=="
	echo "vscodeArch==$VSCODE_ARCH=="
	echo "bitness==$BITNESS=="
	echo "tmpDir==$VSC_TMP=="
	echo "platform==$PLATFORM=="
	echo "unpackResult==$UNPACK_RESULT=="
	echo "didLocalDownload==$DID_LOCAL_DOWNLOAD=="
	echo "downloadTime==$DOWNLOAD_TIME=="
	echo "installTime==$INSTALL_TIME=="
	echo "serverStartTime==$SERVER_START_TIME=="
	echo "execServerToken==${TOKEN}=="
	echo "platformDownloadPath==$PLATFORM_DOWNLOAD_PATH=="
	echo "SSH_AUTH_SOCK==$SSH_AUTH_SOCK=="
echo "DISPLAY==$DISPLAY=="
}

millis() {
	d=$(date +%s%N)
	# Test if 'd' contains any non-digit characters
	if [ -z "${d##*[!0-9]*}" ] || [ "$PLATFORM" != "linux" ]; then
	    # Fallback for MacOS or any date binary that doesn't handle '%N'
		echo $(($(date +%s)*1000))
		return
	fi
	echo $((d/1000000))
}

elapsed() {
	echo $(($(millis) - $1))
}

printenv_indent() {
	echo "printenv:"
	printenv | sed 's/^/    /'
}

#
# Get OS name
#
OSRELEASEID=$(cat /etc/os-release 2>/dev/null | grep -a -E '^ID=' | sed 's/^[Ii][Dd]=//g' | sed 's/"//g')
if [ -z "$OSRELEASEID" ]
then
	OSRELEASEID=$(cat /usr/lib/os-release 2>/dev/null | grep -a -E '^ID=' | sed 's/^[Ii][Dd]=//g' | sed 's/"//g')
	if [ -z "$OSRELEASEID" ]
	then
		OSRELEASEID=$(uname -s)
	fi
fi

#
# Get host platform/architecture
#
UNAME=$(uname -s)
case $UNAME in
	Linux) PLATFORM=linux;;
	Darwin) PLATFORM=macOS;;
	*)
		echo "Unsupported platform: $UNAME"
		fail_with_exitcode 203
		;;
esac

BITNESS=$(getconf LONG_BIT)
ARCH=$(uname -m)
case $ARCH in
	x86_64) VSCODE_ARCH="x64";;
	armv7l | armv8l)
		VSCODE_ARCH="armhf"
		;;
	arm64 | aarch64)
		if [ "$BITNESS" = 32 ]; then
			# Can have 32-bit userland on 64-bit kernel
			VSCODE_ARCH="armhf"
		else
			VSCODE_ARCH="arm64"
		fi
		;;
	*)
		OSRELEASE=$(uname -r)
		case $OSRELEASE in
			*x86_64*) VSCODE_ARCH="x64";;
			*)
				echo "Unsupported architecture: $ARCH"
				fail_with_exitcode 196
			;;
		esac
		;;
esac

if [ "$PLATFORM" = linux ]; then
	if [ "$VSCODE_ARCH" = armhf ]; then
		PLATFORM_DOWNLOAD_PATH=cli-linux-armhf
	else
		PLATFORM_DOWNLOAD_PATH=cli-alpine-$VSCODE_ARCH
	fi
elif [ "$VSCODE_ARCH" = "arm64" ]; then
	PLATFORM_DOWNLOAD_PATH=cli-darwin-arm64
else
	PLATFORM_DOWNLOAD_PATH=cli-darwin-x64
fi

if [ ! -d "$VSCODE_AGENT_FOLDER" ]; then
	mkdir -p "$VSCODE_AGENT_FOLDER"
	chmod 750 "$VSCODE_AGENT_FOLDER"

	error_code=$?
	if [ "${error_code}" -gt 0 ]; then
		echo "Creating the server install dir failed..."
		fail_with_exitcode 202
	fi
fi

#
# Delete old CLIs if needed
#

# shellcheck disable=SC2010
TO_DELETE=$(ls -1 -t "$VSCODE_AGENT_FOLDER" | grep -E "code(-insiders)?-[a-fA-F0-9]{40}" | tail -n +6)
for CLI_TO_DELETE in $TO_DELETE; do
	target_dir="$VSCODE_AGENT_FOLDER/$CLI_TO_DELETE"
	echo "Deleting old install $target_dir"
	rm -rf "$target_dir"
done

do_client_download() {
	DID_LOCAL_DOWNLOAD=1
	echo "Trigger local server download"
	echo "${GET_DOWNLOAD_SERVER_START_TRIGGER}"
	echo artifact==$PLATFORM_DOWNLOAD_PATH==
	echo destFolder==$VSCODE_AGENT_FOLDER==
	echo destFolder2==/vscode-cli-$COMMIT_ID.tar.gz==
	echo "${GET_DOWNLOAD_SERVER_END_TRIGGER}"
	echo "Waiting for client to transfer server archive..."
	echo "Waiting for $VSCODE_AGENT_FOLDER/vscode-cli-$COMMIT_ID.tar.gz.done and vscode-server.tar.gz to exist"

	while true; do
		if [ -f "$VSCODE_AGENT_FOLDER/vscode-cli-$COMMIT_ID.tar.gz.done" ]; then
			if [ ! -f "$VSCODE_AGENT_FOLDER/vscode-cli-$COMMIT_ID.tar.gz" ]; then
				echo "Found flag but not server tar - server transfer failed"
				fail_with_exitcode 199
			fi

			echo "Found flag and server on host"
			rm "$VSCODE_AGENT_FOLDER/vscode-cli-$COMMIT_ID.tar.gz.done"
			break
		else
			printf ' '
			sleep 3
		fi
	done
}

do_client_download_or_fail() {
	error_code="${1:-"1"}"
	if [ "$DID_LOCAL_DOWNLOAD" = "1" ]; then
		echo "Already attempted local download, failing"
		fail_with_exitcode "$error_code"
	elif [ $ALLOW_CLIENT_DOWNLOAD = "1" ]; then
		do_client_download
	else
		fail_with_exitcode "$error_code"
	fi
}

is_program_from_busybox() {
	program=$1
	if command -v busybox > /dev/null 2>&1
	then
		# Check symlink from program to busybox
		if [ -L "$(command -v "$program")" ] && [ "$(readlink -f "$(command -v "$program")")" = "$(command -v busybox)" ]
		then
			echo "Program '$program' is provided by busybox" >&2
			echo 'yes'
			return
		fi
	fi
	echo 'no'
}

supports_flag() {
    program="$1"
    flag="$2"

    if command -v "$program" > /dev/null 2>&1; then
        if "$program" --help 2>&1 | grep -q -- "$flag"
		then
			echo "Program '$program' appears to support flag '$flag'" >&2
			echo 'yes'
			return
		fi
    fi
		echo "Program '$program' is not available or does not appear to support flag '$flag'" >&2
        echo 'no'
}

do_host_download() {
	start=$(millis)
	echo "${GET_PROGRESS_DOWNLOADING}"

	DOWNLOAD_URL=https://update.code.visualstudio.com/commit:$COMMIT_ID/$PLATFORM_DOWNLOAD_PATH/${QUALITY}

	if command -v wget > /dev/null 2>&1
	then
		echo "Downloading with wget"
		IS_WGET_BUSYBOX=$(is_program_from_busybox wget)

		echo "wget is from busybox: $IS_WGET_BUSYBOX"

		if [ "$IS_WGET_BUSYBOX" = 'no' ]
		then
			# Not busybox.
			# Assuming its GNU wget or similar

			if [ -n "$IGNORE_WGET_CONFIG_FLAG" ] && [ "$(supports_flag 'wget' '--no-config')" = "no" ]; then
				echo "Detected that this version of wget does not support '--no-config'. Will not ignore wget default configuration files."
				IGNORE_WGET_CONFIG_FLAG=""
			fi

			WGET_ERRORS=$(2>&1 wget ${IGNORE_WGET_CONFIG_FLAG} ${WGET_TRIES_SEGMENT} --connect-timeout=7 --dns-timeout=7 -nv -O vscode-cli-$COMMIT_ID.tar.gz ${DOWNLOAD_URL})
		else
			# Is busybox.
			# Remove flags for the sake of compatibility

			WGET_ERRORS=$(2>&1 wget -O vscode-cli-$COMMIT_ID.tar.gz ${DOWNLOAD_URL})
		fi

		error_code=$?
		if [ $error_code -ne 0 ]
		then
			echo "wget download failed"
			echo "$WGET_ERRORS"
			printenv_indent

			do_client_download_or_fail 193
		else
			echo "Download complete"
			DOWNLOAD_TIME=$(elapsed $start)
		fi
	else
		command -v curl > /dev/null 2>&1
		error_code=$?
		if [ $error_code -eq 0 ]
		then
			echo "Downloading with curl"
			CURL_STATUS_CODE_RESULT=$(curl ${IGNORE_CURL_CONFIG_FLAG} --connect-timeout 7 -L $DOWNLOAD_URL --output vscode-cli-$COMMIT_ID.tar.gz -w "%{http_code}")
			error_code=$?
			curl_status_code_if_2xx=$(echo "$CURL_STATUS_CODE_RESULT" | grep -E "^2[0-9]{2}$")
			if [ $error_code -ne 0 ] || [ -z "$curl_status_code_if_2xx" ]
			then
				echo "curl download failed"
				echo "HTTP status code: $CURL_STATUS_CODE_RESULT"
				printenv_indent

				do_client_download_or_fail 193
			else
				echo "Download complete"
				DOWNLOAD_TIME=$(elapsed $start)
			fi
		else
			printenv_indent
			echo "Neither wget nor curl is installed"

			do_client_download_or_fail 194
		fi
	fi
}

do_install() {
	start=$(millis)
	echo "${GET_PROGRESS_INSTALLING}"
	UNPACK_RESULT="success"
	echo "tar --version: $(tar --version)"
	tar -xf vscode-cli-$COMMIT_ID.tar.gz --no-same-owner
	TAR_EXIT=$?
	INSTALL_TIME=$(elapsed $start)

	if [ $TAR_EXIT -ne 0 ]
	then
		echo "ERROR: tar exited with a non-zero exit code: $TAR_EXIT"
		UNPACK_RESULT="error"
		do_client_download_or_fail "205"
		do_install
		return
	fi

	mv "$CLI_NAME_IN_ARCHIVE" "$CLI_PATH"

	# cheap sanity check

	if ! eval "$CLI_PATH --version"
	then
		UNPACK_RESULT="missingFiles"
		echo "ERROR: $CLI_PATH don't exist"
		do_client_download_or_fail "205"
		do_install
		return
	fi

	# Delete the leftover folder which might have -web prefix, and the .tar.gz
	rm -rf vscode-cli*
}

#
# Install if needed
#
if [ ! -f "$CLI_PATH" ]
then
	echo "Installing to $VSCODE_AGENT_FOLDER..."
	STASHED_WORKING_DIR="$(pwd)"
	cd "$VSCODE_AGENT_FOLDER" || fail_with_exitcode 206

	if [ $FORCE_CLIENT_DOWNLOAD = "1" ]; then
		do_client_download
	else
		do_host_download
	fi

	do_install
	cd "$STASHED_WORKING_DIR" || fail_with_exitcode 206
else
	echo "Found existing installation at $VSCODE_AGENT_FOLDER..."
fi


#
# Start the server
#
start_server() {
	echo "Starting VS Code CLI..."
	printenv_indent
	start=$(millis)
	if [ -f $CLI_LOG_FILE ]; then
		echo "Removing old logfile at $CLI_LOG_FILE"
		rm "$CLI_LOG_FILE" # See #6265
	fi

	# Stop exporting VSCODE_AGENT_FOLDER once https://github.com/microsoft/vscode/pull/228287 is available and replace with:
	# --extensions-dir "$VSCODE_AGENT_FOLDER/extensions" --user-data-dir "$VSCODE_AGENT_FOLDER/data"
	# See https://github.com/microsoft/vscode-internalbacklog/issues/2604, https://github.com/microsoft/vscode-remote-release/issues/10255
	export VSCODE_AGENT_FOLDER

	touch $CLI_LOG_FILE
	chmod 600 $CLI_LOG_FILE

	VSCODE_CLI_REQUIRE_TOKEN=${TOKEN} "$CLI_PATH" command-shell --cli-data-dir "$VSCODE_AGENT_FOLDER/cli" --parent-process-id $$ ${LISTEN_ARGS} > "$CLI_LOG_FILE" 2>&1 < /dev/null &
	CLI_PID=$!
	echo "Spawned remote CLI: $!"

	count=0
	max_retries=15
	while [ $count -lt $max_retries ]; do
		count=$((count + 1))
		LISTENING_ON=$(cat "$CLI_LOG_FILE" | grep -a -E 'Listening on .+' | grep -v grep | sed 's/Listening on //')
		if [ "$LISTENING_ON" != '' ]
		then
			break
		fi

		# "If sig is 0 (the null signal), error checking is performed but no signal is actually sent.
		# The null signal can be used to check the validity of pid.""
		# Source: https://pubs.opengroup.org/onlinepubs/007908799/xsh/kill.html
		if ! kill -0 $CLI_PID > /dev/null; then
			echo "Exec server process not found"
			cat $CLI_LOG_FILE
			break
		fi

		echo "Waiting for server log..."
		sleep .03
	done
	SERVER_START_TIME=$(elapsed $start)
}

start_server

# What we echo below cannot be wider than 80 characters
echo "${UUID}: start"
echo_common_results
echo "${UUID}: end"

while true; do sleep 180; printf ' '; done

EOSSH'
[10:50:32.268] Using connect timeout of 17 seconds
[10:50:32.775] > [email protected]'s password: 
[10:50:32.775] Got some output, clearing connection timeout
[10:50:32.776] Showing password prompt
[10:50:35.989] Got password response
[10:50:35.989] "install" wrote data to terminal: "*********"
[10:50:36.003] > 
[10:50:36.059] > 0fb7d2cabd79: running
> Script executing under PID: 32269
> sh: getconf: not found
[10:50:36.067] > Installing to /root/.vscode-server...
> 0fb7d2cabd79%%1%%
> Downloading with wget
> wget is from busybox: no
[10:50:36.186] > Program 'wget' is not available or does not appear to support flag '--no-config'
> Detected that this version of wget does not support '--no-config'. Will not ignore wget default configuration files.
[10:50:36.301] > wget download failed
> wget: unrecognized option: tries=1
> Usage: wget [options] <URL>
> Options:
> 	-4				Use IPv4 only
> 	-6				Use IPv6 only
> 	-O <file>			Redirect output to file (use "-" for stdout)
> 	-P <dir>			Set directory for output files
> 	--quiet | -q			Turn off status messages
> 	--continue | -c			Continue a partially-downloaded file
> 	--user=<user>			HTTP authentication username
> 	--password=<password>		HTTP authentication password
> 	--user-agent | -U <str>		Set HTTP user agent
> 	--post-data=STRING		use the POST method; send STRING as the data
> 	--post-file=FILE		use the POST method; send FILE as the data
> 	--spider | -s			Spider mode - only check file existence
> 	--timeout=N | -T N		Set connect/request timeout to N seconds
> 	--proxy=on | -Y on		Enable interpretation of proxy env vars (default)
> 	--proxy=off | -Y off |
> 	--no-proxy           		Disable interpretation of proxy env vars
> 
> HTTPS options:
> 	--ca-certificate=<cert>		Load CA certificates from file <cert>
> 	--no-check-certificate		don't validate the server's certificate
> 	--ciphers=<cipherlist>		Set the cipher list string
> printenv:
> sh: printenv: not found
> Trigger local server download
> 0fb7d2cabd79:trigger_server_download
> artifact==cli-alpine-x64==
> destFolder==/root/.vscode-server==
> destFolder2==/vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz==
> 0fb7d2cabd79:trigger_server_download_end
> Waiting for client to transfer server archive...
> Waiting for /root/.vscode-server/vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz.done and vscode-server.tar.gz to exist
>  
[10:50:36.302] Got request to download on client for {"artifact":"cli-alpine-x64","destPath":"/root/.vscode-server/vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz"}
[10:50:36.302] server download URL: https://update.code.visualstudio.com/commit:fabdb6a30b49f79a7aba0f2ad9df9b399473380f/cli-alpine-x64/stable
[10:50:36.303] Downloading VS Code server locally...
[10:50:37.495] Downloaded VS Code server to /tmp/e3ffa2c3-6edd-4674-a637-6354f17e676d
[10:50:37.495] Renamed VS Code server to /tmp/vscode_server_1735786237495/vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz
[10:50:37.496] Preparing to scp to host 2
[10:50:37.497] PATH: /home/mcwindy/.bun/bin:/home/mcwindy/.deno/bin:/home/mcwindy/.nvm/versions/node/v22.9.0/bin:/home/mcwindy/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
[10:50:37.497] Checking ssh with "ssh -V"
[10:50:37.507] > OpenSSH_9.7p1 Ubuntu-7ubuntu4, OpenSSL 3.3.1 4 Jun 2024

[10:50:37.507] Testing scp with "scp"
[10:50:37.515] scp exited with code: 1
[10:50:37.515] Got stderr from scp: usage: scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config]
           [-i identity_file] [-J destination] [-l limit] [-o ssh_option]
           [-P port] [-S program] [-X sftp_option] source ... target
[10:50:37.516] Copying file to remote with scp -o ConnectTimeout=15 'vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz' 'vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz.done' 2:'/root/.vscode-server'
[10:50:37.516] Using cwd: file:///tmp/vscode_server_1735786237495
[10:50:37.912] > [email protected]'s password: 
[10:50:37.912] Showing password prompt
[10:50:50.475] Got password response
[10:50:50.476] "Copy server to host" wrote data to terminal: "*********"
[10:50:50.490] > 
[10:50:50.543] > vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b3994   0%    0     0.0KB/s   --:-- ETA
[10:50:50.837] > vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b3994 100% 8834KB  29.3MB/s   00:00    
> vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b3994   0%    0     0.0KB/s   --:-- ETAvscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b3994 100%    9    44.1KB/s   00:00    
[10:50:51.081] "Copy server to host" terminal command done
[10:50:51.306] > Found flag and server on host
> 0fb7d2cabd79%%2%%
> tar
[10:50:51.316] > : unrecognized option: version
> BusyBox v1.36.1 (2023-11-19 17:02:49 UTC) multi-call binary.
> 
> Usage: tar c|x|t [-zahvokO] [-f TARFILE] [-C DIR] [-T FILE] [-X FILE] [FILE]...
> 
> Create, extract, or list files from a tar file
> 
> 	c	Create
> 	x	Extract
> 	t	List
> 	-f FILE	Name of TARFILE ('-' for stdin/out)
> 	-C DIR	Change to DIR before operation
> 	-v	Verbose
> 	-O	Extract to stdout
> 	-o	Don't restore user:group
> 	-k	Don't replace existing files
> 	-z	(De)compress using gzip
> 	-a	(De)compress based on extension
> 	-h	Follow symlinks
> 	-T FILE	File with names to include
> 	-X FILE	File with glob patterns to exclude
> tar --version: 
> tar: unrecognized option: no-same-owner
> BusyBox v1.36.1 (2023-11-19 17:02:49 UTC) multi-call binary.
> 
> Usage: tar c|x|t [-zahvokO] [-f TARFILE] [-C DIR] [-T FILE] [-X FILE] [FILE]...
> 
> Create, extract, or list files from a tar file
> 
> 	c	Create
> 	x	Extract
> 	t	List
> 	-f FILE	Name of TARFILE ('-' for stdin/out)
> 	-C DIR	Change to DIR before operation
> 	-v	Verbose
> 	-O	Extract to stdout
> 	-o	Don't restore user:group
> 	-k	Don't replace existing files
> 	-z	(De)compress using gzip
> 	-a	(De)compress based on extension
> 	-h	Follow symlinks
> 	-T FILE	File with names to include
> 	-X FILE	File with glob patterns to exclude
[10:50:51.321] > ERROR: tar exited with a non-zero exit code: 1
> Already attempted local download, failing
> 0fb7d2cabd79: start
> exitCode==205==
> listeningOn====
> osReleaseId==immortalwrt==
> arch==x86_64==
> vscodeArch==x64==
> bitness====
> tmpDir==/tmp==
> platform==linux==
> unpackResult==error==
> didLocalDownload==1==
> downloadTime====
> installTime==0==
> serverStartTime====
> execServerToken==a1aaaaa1-a111-1a1a-111a-111111111aaa==
> platformDownloadPath==cli-alpine-x64==
> SSH_AUTH_SOCK====
> DISPLAY====
> 0fb7d2cabd79: end
[10:50:51.321] Received install output: 
exitCode==205==
listeningOn====
osReleaseId==immortalwrt==
arch==x86_64==
vscodeArch==x64==
bitness====
tmpDir==/tmp==
platform==linux==
unpackResult==error==
didLocalDownload==1==
downloadTime====
installTime==0==
serverStartTime====
execServerToken==a1aaaaa1-a111-1a1a-111a-111111111aaa==
platformDownloadPath==cli-alpine-x64==
SSH_AUTH_SOCK====
DISPLAY====

[10:50:51.323] Resolver error: Error: Unable to install VS Code server
	at v.ServerInstallError (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:696442)
	at f (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:691374)
	at t.handleInstallOutput (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:692563)
	at t.tryInstall (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:812473)
	at async /home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:771431
	at async t.withShowDetailsEvent (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:774668)
	at async x (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:768087)
	at async t.resolve (/home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:772083)
	at async /home/mcwindy/.vscode/extensions/ms-vscode-remote.remote-ssh-0.116.1/out/extension.js:2:1055245
[10:50:51.325] ------

Expected Behavior

tar successfully unzip the code-cli-$COMMIT_ID.tar.gz

I tried the snippet below, and it allows me to successfully establish connection.

COMMIT_ID="fabdb6a30b49f79a7aba0f2ad9df9b399473380f"
wget https://update.code.visualstudio.com/commit:$COMMIT_ID/cli-alpine-x64/stable -O vscode-server.tar.gz
mkdir ~/.vscode-server/ && cd ~/.vscode-server/
tar -xzf vscode-server.tar.gz -o
mv code code-$COMMIT_ID
root@ImmortalWrt:~/.vscode-server# tar -xf vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz --no-same-owner
tar: unrecognized option: no-same-owner
BusyBox v1.36.1 (2023-11-19 17:02:49 UTC) multi-call binary.

Usage: tar c|x|t [-zahvokO] [-f TARFILE] [-C DIR] [-T FILE] [-X FILE] [FILE]...

Create, extract, or list files from a tar file

	c	Create
	x	Extract
	t	List
	-f FILE	Name of TARFILE ('-' for stdin/out)
	-C DIR	Change to DIR before operation
	-v	Verbose
	-O	Extract to stdout
	-o	Don't restore user:group
	-k	Don't replace existing files
	-z	(De)compress using gzip
	-a	(De)compress based on extension
	-h	Follow symlinks
	-T FILE	File with names to include
	-X FILE	File with glob patterns to exclude
root@ImmortalWrt:~/.vscode-server# tar -xf vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz -o
tar: invalid tar magic
root@ImmortalWrt:~/.vscode-server# tar -xzf vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz -o
root@ImmortalWrt:~/.vscode-server# l
-rwxrwxr-x    1 root     root      22070072 Dec 19 18:29 code*
-rw-r--r--    1 root     root       9046413 Jan  2 10:11 vscode-cli-fabdb6a30b49f79a7aba0f2ad9df9b399473380f.tar.gz

Actual Behavior

In the script tar -xf vscode-cli-$COMMIT_ID.tar.gz --no-same-owner is used to unzip the gz, which do not work in remote host like openwrt.

Steps To Reproduce

Create a machine with OS Immortalwrt and try to connect to that host.

Anything else?

No response

mcwindy avatar Jan 02 '25 03:01 mcwindy

Thank you for the detailed report. We already have some code to attempt to detect more minimal environments (reducing flags for busybox-flavors of common tools). I'm surprised we haven't hit this before.

joshspicer avatar Jan 06 '25 19:01 joshspicer

Is there any update on this?? Either fixes or a workaround that we can apply. Thanks in advance.

ferreteleco avatar Aug 27 '25 10:08 ferreteleco

I used zed instead which work pretty well.

mcwindy avatar Sep 23 '25 07:09 mcwindy

OpenWrt can use opkg install tar to install newer versions of tar

This is because Busybox tar does not support the version command

tar --version

busybox tar --version
tar: unrecognized option '--version'

tar: unrecognized option --version

ahaoboy avatar Nov 30 '25 10:11 ahaoboy

OpenWrt can use opkg install tar to install newer versions of tar

This is because Busybox tar does not support the version command

tar --version

busybox tar --version
tar: unrecognized option '--version'

tar: unrecognized option --version

You’re right. The tar included in OpenWrt’s BusyBox is a trimmed-down implementation, so missing features are expected. Interestingly, the BusyBox build reports a higher version number (1.36.1) than the standalone GNU tar package installed on my system (1.35).

This isn’t the only limitation — several GNU tar options are absent. For instance, when transferring archives to OpenWrt using scp, you may need to explicitly pass -O to stream output.

mcwindy avatar Dec 03 '25 15:12 mcwindy