Help with ssh -A, screen, ssh -a, detach, logout
raf
ssh at raf.org
Wed Jun 3 15:55:17 AEST 2020
Hi,
I've noticed some ssh behaviour that I wish didn't
happen. I was wondering if someone can explain how I
can stop it from happening, or explain why it's
unavoidable.
If I ssh-with-agent-forwarding from one host to a
second host, and on the second host use something like
nohup/screen/tmux/daemon, and from within that new
process session, start a long-running command via
ssh-without-agent-forwarding on a third host, I would
expect to be able to (e.g.) detach from the screen
session and log out of the second host, but my shell
prompt on the first host doesn't come back and even
Ctrl-C won't break the connection between ssh on the
first host and sshd on the second host. I have to close
the xterm window that the shell and ssh are running in.
If I don't do that, the shell prompt doesn't come back
until the long-running command on the third host has
completed.
To see what I mean:
- on host1: Have ssh-agent running with an identity loaded
- on host1: "xterm &" (start an xterm on similar)
- on host1 in xterm: "ssh -A host2" (ssh-with-agent-forwarding to host2)
- on host2: "screen" (start a screen session)
- on host2 in screen: "ssh -a host3 sleep 60" (long-running cmd on host3)
- on host2 in screen: Ctrl-a d (detach from the screen session)
- on host2: Ctrl-d (log out of host2)
- on host1: wait a long time for the shell prompt to appear or close xterm
host1 ssh: OpenSSH_8.1p1, OpenSSL 1.1.1g 21 Apr 2020
host2 ssh: OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2u 20 Dec 2019
host3 ssh: OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2u 20 Dec 2019
In other words, I want the agent to be forwarded to
host2, so that I can then ssh from there to host3, but
I don't want the agent to be forwarded to host3 because
it's not needed there. Note that my real command was
rsync so both host2 and host3 were involved.
My hypothesis is that agent forwarding has something to
do with why the connection between host1 and host2
isn't cleanly closed. Using lsof to compare sshd before
and after starting the long-running command on host3,
the only difference was this:
--- lsof.20786.sshd.before 2020-03-12 09:17:04.000000000 +1100
+++ lsof.20786.sshd.after 2020-03-12 09:18:32.000000000 +1100
@@ -71,5 +71,6 @@ sshd 20786 raf 7w FIFO
sshd 20786 raf 8w FIFO 0,10 0t0 14325237 pipe
sshd 20786 raf 9u unix 0xffff99a3a8d96000 0t0 14325238 /tmp/ssh-KBbJCuYltB/agent.20786 type=STREAM
sshd 20786 raf 10u CHR 5,2 0t0 1119 /dev/ptmx
+sshd 20786 raf 11u unix 0xffff99a3e8d2cc00 0t0 14328304 /tmp/ssh-KBbJCuYltB/agent.20786 type=STREAM
sshd 20786 raf 12u CHR 5,2 0t0 1119 /dev/ptmx
sshd 20786 raf 13u CHR 5,2 0t0 1119 /dev/ptmx
i.e. a new connection to the agent socket, even though
agent forwarding to host3 was disabled with -a.
When I first saw that, I added the -a option to the ssh
command to host3 (I have agent forwarding on by
config). To my surprise, it didn't change this
behaviour, the second connection to the agent socket
was still created, and I still had to close the xterm
window to break the connection between host1 and host2.
Any suggestions?
cheers,
raf
More information about the openssh-unix-dev
mailing list