Ethan Pailes
2023-Mar-02 01:46 UTC
Uniquely Identifying the Local TTY of an SSH Connection
Packing the data in TERM is a great idea! I?ll see what I can do with that.>> Finally, some administrative notes: I wasn't able to sign up for this >> mailing list at >> https://lists.mindrot.org/mailman/subscribe/openssh-unix-dev because >> attempts to do so were met by a "Bug in Mailman version 2.1.39" page. > > I just tried that and didn't get that error, although I also haven't > got the confirmation email yet. Could you please try again and if it > happens again. mail me the error message off-list?yeah I got that worked out and forgot to delete that part of my message when I resent it. Sorry about that.>
Ethan Pailes
2023-Mar-03 21:11 UTC
Uniquely Identifying the Local TTY of an SSH Connection
I've managed to figure out a scheme using SendEnv. The way it works is that I add the following to my local .bashrc ``` export LC__LOCAL_TTY_NAME="ssh-$(basename $(tty))" ``` then on the same local machine add an entry to my .ssh/config ``` Host = remote Hostname = my.remote.host SendEnv LC__LOCAL_TTY_NAME ControlPath ~/.ssh/cm-%r@%h:%p ControlMaster auto ControlPersist 10m ``` and finally in my .bashrc on my remote host I have an entry ``` if [[ $- =~ i ]] && [[ -n "$LC__LOCAL_TTY_NAME" ]]; then exec shpool attach "$LC__LOCAL_TTY_NAME" fi ``` I did try packing the tty name in TERM, but using that with SendEnv would have required mutating my local TERM in a way that could have messed up programs running locally. This approach works great, but I would also like to be able to set things up so that I can explicitly name the session I want to connect to and do `ssh main` or `ssh edit` to go directly to my remote host and attach to a session named `main` or `edit`. The SetEnv ssh config option seems to be just what the doctor ordered in order to do this, so I've added a few blocks to my local .ssh/config ``` Host = main Hostname = my.remote.host SetEnv LC__LOCAL_TTY_NAME=main ControlPath ~/.ssh/cm-%r@%h:%p ControlMaster auto ControlPersist 10m Host = edit Hostname = my.remote.host SetEnv LC__LOCAL_TTY_NAME=edit ControlPath ~/.ssh/cm-%r@%h:%p ControlMaster auto ControlPersist 10m ``` this sorta works, but there seems to be a strange interaction between the Control{Path,Master,Persist} options and SetEnv. If I try to immediately ssh to my remote host from two different terminals using `ssh main` then `ssh edit`, LC__LOCAL_TTY_NAME will get set to `main` in both, presumably because of some sticky state on the shared connection. Oddly, if I first do `ssh remote` in a separate terminal to use the SendEnv mechanism, then do `ssh main` and `ssh edit` in terminals two and three, this approach works as I was hoping and terminal two has LC__LOCAL_TTY_NAME set to `main` while terminal three has it set to `edit`. This feels like a bug in ssh to me, but maybe it is actually working as intended and I'm just holding it wrong. On the assumption that this is a bug, I've been trying to repro locally by cloning and building https://github.com/openssh/openssh-portable.git, then running the sshd it builds locally and logging in with the ssh binary it builds. Would those two components contain everything that could be in play here, or do I need to worry about using the ssh-agent from HEAD as well? (I know my setup is using my system ssh-agent because I configured an authorized_keys file with my id_rsa.pub in it, then was able to log in to the locally running sshd with no password after running ssh-add).