https://bugzilla.mindrot.org/show_bug.cgi?id=3550 Bug ID: 3550 Summary: Key Conflict Product: Portable OpenSSH Version: 9.3p1 Hardware: Other OS: Linux Status: NEW Severity: enhancement Priority: P5 Component: ssh Assignee: unassigned-bugs at mindrot.org Reporter: maggiezhuooo at 163.com When using ssh -t xxx at xxx command, ssh will exit after typing ctrl+c. What can I do to avoid this? -- You are receiving this mail because: You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 Damien Miller <djm at mindrot.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |djm at mindrot.org Resolution|--- |WORKSFORME --- Comment #1 from Damien Miller <djm at mindrot.org> --- You can use stty(1) to control the terminal's interpretation of ^C E.g. [djm at djm ~]$ ssh -t test "stty -isig; echo go; sleep 5; echo ok" go ^C^C^C^C^C^C^C^C^Cok Connection to test closed. Without -isig, the ^C results in a SIGINT: [djm at djm ~]$ ssh -t test "echo go; sleep 5; echo ok"go ^CConnection to test.mindrot.org closed. -- You are receiving this mail because: You are watching someone on the CC list of the bug. You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 Darren Tucker <dtucker at dtucker.net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dtucker at dtucker.net --- Comment #2 from Darren Tucker <dtucker at dtucker.net> --- The remote program is getting a SIGINT because you told ssh to allocate a controlling terminal and then sent it an interrupt. You need to tell the remote shell or program to ignore the SIGINT. The exact details will vary depending on the program and shell, but assuming a Bourne-type shell one way to do this is to trap the SIGINT in the shell to prevent it from being passed through to the program, eg: $ ssh -t localhost "trap '' INT; sleep 60" -- You are receiving this mail because: You are watching someone on the CC list of the bug. You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 --- Comment #3 from maggiezhuooo at 163.com --- (In reply to Damien Miller from comment #1)> You can use stty(1) to control the terminal's interpretation of ^C > > E.g. > > [djm at djm ~]$ ssh -t test "stty -isig; echo go; sleep 5; echo ok" > go > ^C^C^C^C^C^C^C^C^Cok > Connection to test closed. > > Without -isig, the ^C results in a SIGINT: > > [djm at djm ~]$ ssh -t test "echo go; sleep 5; echo ok"go > ^CConnection to test.mindrot.org closed.Thanks for the reply, but sorry maybe I didn't describe my question clearly. It is known that the default value of ^C in stty -intr , serves to interrupt the current command. Now this ^C will make ssh exit under ssh -t command. I have tried changing the default value to ^N in the terminal, but ^N only interrupts the command, ssh does not send SIGINT. I wonder if there is a way to make ^C still act as a key to send SIGINT, but ssh does not exit? Is there a way to replace the default ^C that causes ssh to exit? -- You are receiving this mail because: You are watching someone on the CC list of the bug. You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 --- Comment #4 from Darren Tucker <dtucker at dtucker.net> --- (In reply to maggiezhuooo from comment #3)> Now this ^C will make ssh exit under ssh -t command.That's probably not what's happening. What's probably happening is that the ssh is forwarding the SIGINT to the server which is delivering it to the remote program, which then exits. When it exits, the ssh reads its exit status then exits itself. You can see this if you turn on ssh debugging: $ ssh -v -t localhost sleep 60 [...] debug1: Sending command: sleep 60 ^C debug1: client_input_channel_req: channel 0 rtype exit-signal reply 0 debug1: client_input_channel_req: channel 0 rtype eow at openssh.com reply 0 debug1: channel 0: free: client-session, nchannels 1 Connection to localhost closed. Could you elaborate on what you're trying to do? -- You are receiving this mail because: You are watching someone on the CC list of the bug. You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 --- Comment #5 from maggiezhuooo at 163.com --- (In reply to Darren Tucker from comment #4)> (In reply to maggiezhuooo from comment #3) > > Now this ^C will make ssh exit under ssh -t command. > > That's probably not what's happening. What's probably happening is > that the ssh is forwarding the SIGINT to the server which is > delivering it to the remote program, which then exits. When it > exits, the ssh reads its exit status then exits itself. You can see > this if you turn on ssh debugging: > > $ ssh -v -t localhost sleep 60 > [...] > debug1: Sending command: sleep 60 > ^C > debug1: client_input_channel_req: channel 0 rtype exit-signal reply 0 > debug1: client_input_channel_req: channel 0 rtype eow at openssh.com > reply 0 > debug1: channel 0: free: client-session, nchannels 1 > Connection to localhost closed. > > > Could you elaborate on what you're trying to do?Thanks for your reply! Sorry to bother you again, but when I run an app on a remote server using ssh -t command, when I type ^c, the app stops running and SSH shuts down with it. I want SSH to not shut down with the app stopping, i.e. when the app returns to a stopped state, is there a way to make SSH ignore this state and continue running? Because I want to continue to use ssh to interact with the remote server. -- You are receiving this mail because: You are watching the assignee of the bug. You are watching someone on the CC list of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 --- Comment #6 from Darren Tucker <dtucker at dtucker.net> --- (In reply to maggiezhuooo from comment #5)> Sorry to bother you again, but when I run an app on a remote server > using ssh -t command, when I type ^c, the app stops running and SSH > shuts down with it. I want SSH to not shut down with the app > stopping, i.e. when the app returns to a stopped state, is there a > way to make SSH ignore this state and continue running? Because I > want to continue to use ssh to interact with the remote server.Depends on what exactly you want it to do. If you want the app to do something other than exit on receipt of SIGINT, you need to somehow tell the app to do something different. If you want the app to exit but ssh to keep the shell up it's possible although a bit convoluted: you need the remote login shell to kill its child on receipt of SIGINT but not die itself, then invoke an interactive shell for you to interact with, something like: $ ssh -v -t localhost "trap 'kill -INT -$$' INT; sleep 60; PS1='remoteshell$ ' sh -i" [...] ^Cremoteshell$ exit [...] debug1: Exit status 0 The trap sends a SIGINT to the process group of the login shell which includes the "app", which exits, causing the login shell to start another (interactive) shell. -- You are receiving this mail because: You are watching someone on the CC list of the bug. You are watching the assignee of the bug.
https://bugzilla.mindrot.org/show_bug.cgi?id=3550 --- Comment #7 from Darren Tucker <dtucker at dtucker.net> --- (In reply to Darren Tucker from comment #6) [...]> $ ssh -v -t localhost "trap 'kill -INT -$$' INT; sleep 60; > PS1='remoteshell$ ' sh -i"BTW I got the quoting on that wrong, but it happened to work because I used localhost so the pid from the expanded $$ matched. For a remote host, you would need to single-quote or escape the $$: $ ssh -v -t somehost 'trap "kill -INT -$$; echo sig" INT; sleep 60; PS1="remoteshell$ " sh -i' -- You are receiving this mail because: You are watching the assignee of the bug. You are watching someone on the CC list of the bug.