[Bug]: Cannot invoke `code-server` from integrated terminal
Is there an existing issue for this?
- [X] I have searched the existing issues
OS/Web Information
- Web Browser: Firefox 102
- Local OS: Win10
- Remote OS: Ubuntu
- Remote Architecture: 86
-
code-server --version: 4.5.0 (4.4.0)
Steps to Reproduce
- docker run codeserver:latest
- try to install extensions via code-server
code-server --install-extension ms-python - asd
Expected
Installation of Extension
Actual
Console throws error
/usr/lib/code-server/lib/vscode/bin/remote-cli/code-server: 12: /usr/lib/code-server/lib/vscode/node: not found
Logs
No response
Screenshot/Video
No response
Does this issue happen in VS Code or GitHub Codespaces?
- [X] I cannot reproduce this in VS Code.
- [X] I cannot reproduce this in GitHub Codespaces.
Are you accessing code-server over HTTPS?
- [X] I am using HTTPS.
Notes
No response
"Workaround" is a downgrade to 4.4.0 There it seems to work.
#5334 also has a bug appearently solved by downgrading.
I have the same issue but need 4.5.0 as it's required to run Github Copilot. Any other ideas for a workaround?
I think what's going on is upstream vscode is injecting an update to the PATH environment variable to an undesirable location.
Here is my invocation that generates the error (note: specifically running /opt/code-server/bin/code-server (where I installed code-server in my container) bypasses the issue):
user 6619ab0c7518 ~
$ code-server --help
/opt/code-server/lib/vscode/bin/remote-cli/code-server: 12: /opt/code-server/lib/vscode/node: not found
And here is my $PATH:
user 6619ab0c7518 ~
$ env | grep PATH
PATH=/home/user/bin:/home/user/.local/bin:/opt/code-server/lib/vscode/bin/remote-cli:/home/user/.local/bin:/home/user/bin:/home/user/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/sonar-scanner/bin:/opt/sonar-scanner/bin
I certainly did not put /opt/code-server/lib/vscode/bin/remote-cli into my PATH myself.
cc @code-asher any ideas on this one?
I think what's going on is upstream
vscodeis injecting an update to thePATHenvironment variable to an undesirable location.
@jsjoeio I can confirm this.
JupyterLab Terminal:
$ echo $PATH
/opt/code-server/bin:/opt/julia/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
code-server Terminal:
$ echo $PATH
/opt/code-server/lib/vscode/bin/remote-cli:/opt/code-server/bin:/opt/julia/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
👉 Compare /opt/code-server/bin/code-server with /opt/code-server/lib/vscode/bin/remote-cli/code-server.
(/opt/code-server being the root directory of my code-server installation)
This should have been fixed prior to the release of code-server v4.5.1.
I am sticking with v4.4.0 for now.
The way code-server is released(/run?), it behaves like a remote installation. This ~might be~ is the reason, why /opt/code-server/lib/vscode/bin/remote-cli is prepended to PATH.
@jsjoeio Please add this issue to the July 2022 milestone.
The way code-server is released(/run?), it behaves like a remote installation. This might be the reason, why /opt/code-server/lib/vscode/bin/remote-cli is prepended to PATH.
Interesting 🤔 I'll chat with @code-asher and see how we can fix this. Thanks for bringing it up everyone!
@code-asher Compare /opt/code-server/bin/code-server with /opt/code-server/lib/vscode/bin/remote-cli/code-server.
(/opt/code-server being the root directory of my code-server installation)
So I might be wrong but the only location where upstream vs code prepends the PATH variable with the remote-cli folder is here:
https://github.com/microsoft/vscode/blob/619ab6d1ba7eef9ad418456a5fe5c7805f01a7ab/src/vs/server/node/extensionHostConnection.ts#L53-L59
This is also used to spawn the console (https://github.com/microsoft/vscode/blob/619ab6d1ba7eef9ad418456a5fe5c7805f01a7ab/src/vs/server/node/remoteTerminalChannel.ts#L191) so thats prop. the locaiton where the env variable and thus the PATH gets broken
My pretty simple idea would be to check inside the code-server script it's location.
So in case of being inside the remote-cli folder instead of the bin it maybe would be a solution to change the way the node location is detected.
Uhh yeah /opt/code-server/lib/vscode/bin/remote-cli/code-server is a VS Code thing, not our script. Maybe we should remove it during the packaging step since I have no idea if it would even work if it could find Node (but maybe we look into whether we can make it work first). /opt/code-server/bin/code-server is the right one.
Or maybe we patch to prevent it from getting added to the PATH? Or patch to add our own script to the path instead.
Maybe we should remove it during the packaging step since I have no idea if it would even work if it could find Node (but maybe we look into whether we can make it work first).
Applying
diff --git a/opt/code-server/lib/vscode/bin/remote-cli/code-server b/opt/code-server/lib/vscode/bin/remote-cli/code-server
index bd8c43b..94bbf1e 100755
--- a/opt/code-server/lib/vscode/bin/remote-cli/code-server
+++ b/opt/code-server/lib/vscode/bin/remote-cli/code-server
@@ -9,4 +9,4 @@ VERSION="1.68.1"
COMMIT="30d9c6cd9483b2cc586687151bcbcd635f373630"
EXEC_NAME="code-server"
CLI_SCRIPT="$ROOT/out/server-cli.js"
-"$ROOT/node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "$@"
+"$ROOT/../node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "$@"
results in
$ code-server --version
1.68.1
30d9c6cd9483b2cc586687151bcbcd635f373630
x64
when executed in code-server Terminal. Compared to
$ code-server --version
4.5.1 97d170331b51ee75c8e4bbdab23c755e3eeaaa8c with Code 1.68.1
when executed in JupyterLab Terminal.
$ /opt/code-server/bin/code-server --help
code-server 4.5.1 97d170331b51ee75c8e4bbdab23c755e3eeaaa8c with Code 1.68.1
Usage: code-server [options] [path]
- Opening a directory: code-server ./path/to/your/project
- Opening a saved workspace: code-server ./path/to/your/project.code-workspace
Options
--auth The type of authentication to use. [password, none]
--password The password for password authentication (can only be passed in via $PASSWORD or the config file).
--hashed-password The password hashed with argon2 for password authentication (can only be passed in via $HASHED_PASSWORD or the config file).
Takes precedence over 'password'.
--cert Path to certificate. A self signed certificate is generated if none is provided.
--cert-host Hostname to use when generating a self signed certificate.
--cert-key Path to certificate key when using non-generated cert.
--disable-telemetry Disable telemetry.
--disable-update-check Disable update check. Without this flag, code-server checks every 6 hours against the latest github release and
then notifies you once every week that a new release is available.
--disable-file-downloads Disable file downloads from Code. This can also be set with CS_DISABLE_FILE_DOWNLOADS set to 'true' or '1'.
-h --help Show this output.
--open Open in browser on startup. Does not work remotely.
--bind-addr Address to bind to in host:port. You can also use $PORT to override the port.
--config Path to yaml config file. Every flag maps directly to a key in the config file.
--socket Path to a socket (bind-addr will be ignored).
--socket-mode File mode of the socket.
-v --version Display version information.
--user-data-dir Path to the user data directory.
--extensions-dir Path to the extensions directory.
--list-extensions List installed VS Code extensions.
--force Avoid prompts when installing VS Code extensions.
--install-extension Install or update a VS Code extension by id or vsix. The identifier of an extension is `${publisher}.${name}`.
To install a specific version provide `@${version}`. For example: '[email protected]'.
--enable-proposed-api Enable proposed API features for extensions. Can receive one or more extension IDs to enable individually.
--uninstall-extension Uninstall a VS Code extension by id.
--show-versions Show VS Code extension versions.
--github-auth GitHub authentication token (can only be passed in via $GITHUB_TOKEN or the config file).
--proxy-domain Domain used for proxying ports.
-e --ignore-last-opened Ignore the last opened directory or workspace in favor of an empty window.
-n --new-window Force to open a new window.
-r --reuse-window Force to open a file or folder in an already opened window.
-vvv --verbose Enable verbose logging.
--link (deprecated) Securely bind code-server via our cloud service with the passed name. You'll get a URL like
https://hostname-username.coder.co at which you can easily access your code-server instance.
Authorization is done via GitHub.
vs
$ /opt/code-server/lib/vscode/bin/remote-cli/code-server --help
code-server 1.68.1
Usage: code-server [options][paths...]
To read from stdin, append '-' (e.g. 'ps aux | grep code | code-server -')
Options
-d --diff <file> <file> Compare two files with each other.
-a --add <folder> Add folder(s) to the last active window.
-g --goto <file:line[:character]> Open a file at the path on the specified line and character position.
-n --new-window Force to open a new window.
-r --reuse-window Force to open a file or folder in an already opened window.
-w --wait Wait for the files to be closed before returning.
-h --help Print usage.
Extensions Management
--list-extensions List the installed extensions.
--show-versions Show versions of installed extensions, when using --list-extensions.
--category <category> Filters installed extensions by provided category, when using --list-extensions.
--install-extension <ext-id | path> Installs or updates an extension. The argument is either an extension id or a path to a
VSIX. The identifier of an extension is '${publisher}.${name}'. Use '--force' argument to
update to latest version. To install a specific version provide '@${version}'. For
example: '[email protected]'.
--uninstall-extension <ext-id> Uninstalls an extension.
Troubleshooting
-v --version Print version.
--verbose Print verbose output (implies --wait).
-s --status Print process usage and diagnostics information.
If
/opt/code-server/bin/code-serveris the right one.
you should
patch to prevent it [
/opt/code-server/lib/vscode/bin/remote-cli] from getting added to the PATH?
I'm currently trying what happens if I simply remove the code-server script located in remote-cli folder.
So removing the code-server script inside the remote-cli folder at least works in my case fine... Not sure if there are some negative side-effects I did not see in my first tests?
@code-asher In code-server v4.4.0/v4.3.0 there is /opt/code-server/lib/vscode/bin/remote-cli/code-oss.
👉 /opt/code-server/lib/vscode/bin/remote-cli is prepended to PATH, too; but there is code-oss instead of code-server at the said path.
My workaround is renaming /opt/code-server/lib/vscode/bin/remote-cli/code-server to /opt/code-server/lib/vscode/bin/remote-cli/code-oss and replacing all occurrences of code-server with code-oss in
-
/opt/code-server/lib/vscode/bin/remote-cli/code-oss -
/opt/code-server/lib/vscode/bin/helpers/browser.sh
code-server v4.4.0:
$ tree /opt/code-server/lib/vscode/bin
/opt/code-server/lib/vscode/bin
├── code-server-oss
├── helpers
│ └── browser.sh
└── remote-cli
└── code-oss
2 directories, 3 files
$ cat /opt/code-server/lib/vscode/bin/code-server-oss
#!/usr/bin/env sh
#
# Copyright (c) Microsoft Corporation. All rights reserved.
#
case "$1" in
--inspect*) INSPECT="$1"; shift;;
esac
ROOT="$(dirname "$(dirname "$(readlink -f "$0")")")"
"$ROOT/node" ${INSPECT:-} "$ROOT/out/server-main.js" "$@"
$ cat /opt/code-server/lib/vscode/bin/helpers/browser.sh
#!/usr/bin/env sh
#
# Copyright (c) Microsoft Corporation. All rights reserved.
#
ROOT=$(dirname "$(dirname "$(dirname "$0")")")
APP_NAME="code-oss"
VERSION="1.66.2"
COMMIT=","
EXEC_NAME="code-oss"
CLI_SCRIPT="$ROOT/out/server-cli.js"
"$ROOT/node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "--openExternal" "$@"
$ cat /opt/code-server/lib/vscode/bin/remote-cli/code-oss
#!/usr/bin/env sh
#
# Copyright (c) Microsoft Corporation. All rights reserved.
#
ROOT=$(dirname "$(dirname "$(dirname "$0")")")
APP_NAME="code-oss"
VERSION="1.66.2"
COMMIT=","
EXEC_NAME="code-oss"
CLI_SCRIPT="$ROOT/out/server-cli.js"
"$ROOT/node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "$@"
In code-server v4.1.0 /opt/code-server/vendor/modules/code-oss-dev/bin is prepended to PATH; the said path only containing helpers/{browser.cmd,browser.sh}.
Will be resolved by #5360