Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try to detech SSH connection when SSH_CONNECTION is unset #393

Merged
merged 1 commit into from
Apr 29, 2018

Conversation

mafredri
Copy link
Collaborator

This change allows us to detect SSH connections even when the $SSH_CONNECTION environment variable is gone. This can happen when a user changes to another user (su, sudo) or the environment is otherwise reset.

By checking the output of who am i for a parenthesis at the end, we assume that said parenthesis must contain either an IPv4 or IPv6 address, indicating that this is a remote session.

The reliablity of this assumption has not been analyzed to a great degree, there could be false positives, or systems that do not format the output in this way.

Fixes #382.

This PR might introduce a start-up impact (via who am i | grep -q '(.*)$') but I'm not really worried that it would be noticeable.

This change allows us to detect SSH connections even when the
`$SSH_CONNECTION` environment variable is gone. This can happen when a
user changes to another user (`su`, `sudo`) or the environment is
otherwise reset.

By checking the output of `who am i` for a parenthesis at the end, we
assume that said parenthesis must contain either an IPv4 or IPv6
address, indicating that this is a remote session.

The reliablity of this assumption has not been analyzed to a great
degree, there could be false positives, or systems that do not format
the output in this way.

Fixes sindresorhus#382.

typeset -gA prompt_pure_state=(
username "$username"
)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm considering doing more checks at "startup" in the future, the result of those would also go into prompt_pure_state. We should be able to get rid of a bunch of other global (internal) pure variables this way.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like it 👍

Copy link
Owner

@sindresorhus sindresorhus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't tried whether it works or not, but the code itself looks good.

@mafredri mafredri merged commit 17e23ae into sindresorhus:master Apr 29, 2018
@mafredri
Copy link
Collaborator Author

Thanks for reviewing! I'm fairly confident it will work based on my tests. There might be some odd implementations of who out there where it might not work, and I'm not sure if there can be false positives (e.g. are there circumstances where who includes parens at the end but it's not over an SSH connection).

As I was writing this, I decided to take a look at coreutils. Seems parenthesis might be added in X sessions as well: coreutils/src/who.c#L374-L432. Going to test in a VM.

@mafredri mafredri deleted the better-detect-ssh branch April 29, 2018 12:42
mafredri added a commit to mafredri/pure that referenced this pull request Apr 29, 2018
This change prevents the hostname from showing up when a terminal is
opened inside a local X session (displayed as (:1)).

Fixes a regression introduced in sindresorhus#393.
@mafredri
Copy link
Collaborator Author

Turned out my hunch was right, #398 fixes it.

mafredri added a commit to mafredri/pure that referenced this pull request Apr 29, 2018
This change prevents the hostname from showing up when a terminal is
opened inside a local X session (displayed as (:1)).

Fixes a regression introduced in sindresorhus#393.
kgrz added a commit to kgrz/pure that referenced this pull request May 1, 2018
* upstream/master: (21 commits)
  Fix wrong placement of localoptions during prompt init
  Fix line erasure when terminal output does not end in newline (sindresorhus#391)
  Try to detech SSH connection when SSH_CONNECTION is unset (sindresorhus#393)
  Always force BatchMode for the Git SSH command (sindresorhus#392)
  1.7.0
  Avoid setting title over serial console (sindresorhus#388)
  Hide virtualenv when explicitly disabled by the user (sindresorhus#381)
  Add install guide for Zplugin (sindresorhus#386)
  Update URL to Droid Sans Mono font (sindresorhus#387)
  Prevent multiple prompt resets in one execution cycle (sindresorhus#368)
  More thorough handling (hiding) of match results
  Avoid implicit creation of global var prompt_pure_git_arrows
  1.6.0
  Link to pure.zsh and async.zsh for better clarity (sindresorhus#358)
  Readme tweaks
  Link to a Pure-inspired prompt done in Rust
  Avoid implicit global var creation and cleanup (sindresorhus#347)
  Fix grammar in readme (sindresorhus#344)
  Update oh-my-zsh instructions in readme
  Remove extra $fpath from npm postinstall fail instructions
  ...
mafredri added a commit to mafredri/pure that referenced this pull request May 6, 2018
This change prevents the hostname from showing up when a terminal is
opened inside a local X session (displayed as (:1)).

Fixes a regression introduced in sindresorhus#393.
mafredri added a commit that referenced this pull request May 13, 2018
* Prevent hostname from showing up in local X sessions

This change prevents the hostname from showing up when a terminal is
opened inside a local X session (displayed as (:1)).

Fixes a regression introduced in #393.

* Implement a more robust remote connection detection (who)

First, we switch from `who am i` to `who -m` because this is the POSIX
way and macOS supports it as well.

Second, if the above fails, we fall back to using just `who` and grep
the line that represents our TTY. This works e.g. with busybox systems.

Finally, we use (extremely) simplified regular expressions for detecting
IPv4, IPv6 and hostname. This is a best-effort attempt at detecting the
remote connections when SSH_CONNECTION is not set.

* Inherit SSH connection detection inside tmux or other subshells

* Store match and use upper case export for consistency

This will also help with debugging if a user ever runs into a problem
where the user/host is shown when it should not be:

	# typeset -p PROMPT_PURE_SSH_CONNECTION
	export PROMPT_PURE_SSH_CONNECTION='(::1)'
filipekiss added a commit to filipekiss/pure that referenced this pull request Apr 26, 2019
* upstream/master:
  Add pure-pwsh to the ports section of the readme (sindresorhus#467)
  Skip grep fork, use native zsh matching (sindresorhus#459)
  Add pure-now to Ports section in the readme (sindresorhus#458)
  1.9.0
  Update to zsh-async 1.7.1 and recover from unexpected worker death (sindresorhus#454)
  Add conda environment name to precmd (sindresorhus#440)
  Add Mímir to Ports section in the readme (sindresorhus#438)
  Avoid calling zle reset-prompt in precmd (sindresorhus#431)
  Simplify async tasks by not passing $PWD (sindresorhus#430)
  Abort git check if pwd has changed after invocation (sindresorhus#428)
  Update zsh-async to 1.7.0 (sindresorhus#429)
  1.8.0
  Advice against enabling incompatible Oh-My-Zsh plugins
  Show warning when Oh My Zsh themes are enabled (sindresorhus#426)
  Add support for VI-mode indicator (sindresorhus#405)
  Remove unused function for computing string length (sindresorhus#418)
  Update fpath-reference link (sindresorhus#417)
  Prevent IPv6 regexp from capturing the time (sindresorhus#413)
  Prevent hostname from showing up in local X sessions (sindresorhus#398)
  Make sure local HUP trap is unset during git fetch
  Improve the debug prompt (PS4) (sindresorhus#396)
  Show options as a table in readme (sindresorhus#407)
  Remove unfrequent FAQs from readme (sindresorhus#406)
  Prevent interactive prompts during git fetch (sindresorhus#397)
  Set title via atomic print statement (sindresorhus#399)
  Revert local prompt_opts, breaks promptinit
  Fix for setopt not taking effect when sourcing pure
  Fix prompt_pure_state on older versions of zsh
  Fix wrong placement of localoptions during prompt init
  Fix line erasure when terminal output does not end in newline (sindresorhus#391)
  Try to detech SSH connection when SSH_CONNECTION is unset (sindresorhus#393)
  Always force BatchMode for the Git SSH command (sindresorhus#392)
  1.7.0
  Avoid setting title over serial console (sindresorhus#388)
  Hide virtualenv when explicitly disabled by the user (sindresorhus#381)
  Add install guide for Zplugin (sindresorhus#386)
  Update URL to Droid Sans Mono font (sindresorhus#387)
  Prevent multiple prompt resets in one execution cycle (sindresorhus#368)
  More thorough handling (hiding) of match results
  Avoid implicit creation of global var prompt_pure_git_arrows
  1.6.0
  Link to pure.zsh and async.zsh for better clarity (sindresorhus#358)
  Readme tweaks
  Link to a Pure-inspired prompt done in Rust
  Avoid implicit global var creation and cleanup (sindresorhus#347)
kutsan pushed a commit to kutsan/pure that referenced this pull request Jun 19, 2023
…us#393)

This change allows us to detect SSH connections even when the
`$SSH_CONNECTION` environment variable is gone. This can happen when a
user changes to another user (`su`, `sudo`) or the environment is
otherwise reset.

By checking the output of `who am i` for a parenthesis at the end, we
assume that said parenthesis must contain either an IPv4 or IPv6
address, indicating that this is a remote session.

The reliablity of this assumption has not been analyzed to a great
degree, there could be false positives, or systems that do not format
the output in this way.

Fixes sindresorhus#382.
kutsan pushed a commit to kutsan/pure that referenced this pull request Jun 19, 2023
* Prevent hostname from showing up in local X sessions

This change prevents the hostname from showing up when a terminal is
opened inside a local X session (displayed as (:1)).

Fixes a regression introduced in sindresorhus#393.

* Implement a more robust remote connection detection (who)

First, we switch from `who am i` to `who -m` because this is the POSIX
way and macOS supports it as well.

Second, if the above fails, we fall back to using just `who` and grep
the line that represents our TTY. This works e.g. with busybox systems.

Finally, we use (extremely) simplified regular expressions for detecting
IPv4, IPv6 and hostname. This is a best-effort attempt at detecting the
remote connections when SSH_CONNECTION is not set.

* Inherit SSH connection detection inside tmux or other subshells

* Store match and use upper case export for consistency

This will also help with debugging if a user ever runs into a problem
where the user/host is shown when it should not be:

	# typeset -p PROMPT_PURE_SSH_CONNECTION
	export PROMPT_PURE_SSH_CONNECTION='(::1)'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants