Joh*_*uda 5 ssh unix terminal bash
我的计划是编写一个脚本来调试远程 Web 服务器。
由于调试端口被防火墙阻止,我需要通过 ssh 将远程端口转发到本地计算机。这部分工作正常。
在调试模式下运行服务器的命令会阻塞终端。因此,当我按 CTRL C 时,服务器应该停止。但是,当我完成调试后,我希望服务器以正常模式再次启动。所以我添加了一个 trap 命令。
这是我目前的方法:
ssh -tt my.server -L 8001:localhost:8000 <<'ENDSSH'
trap 'start server as service in normal mode' 2
stop server
start server in debug mode
ENDSSH
Run Code Online (Sandbox Code Playgroud)
但是,当我按 CTRL C 时,ssh 连接将终止,并且陷阱内的命令不会执行。
在这里完成脚本新手。需要帮忙。
当发生以下情况时,通常ssh能够“中继” Ctrl+c并在远程端引发 SIGINT:
ssh请求并获取远程端的 tty,ssh配置本地 tty,因此Ctrl+c并不特殊,并从中读取。在这种情况下Ctrl+c不会使本地终端驱动程序发送 SIGINT 到前台进程组(即发送到ssh)。ssh将读取^C 字符并将其像任何其他字符一样传递到服务器。远程终端驱动程序将获取该字符并在服务器上引发 SIGINT (或不引发,取决于其自身的设置)。请参阅+或+如何通过 SSH 发送?CtrlcCtrlz
在这里您重定向 的 stdin ssh。该工具从此处读取文档,而不是从 tty 读取。即使本地 tty 配置为不发送 SIGINT,您键入^C的Ctrl+也c永远无法到达远程端,因为ssh根本不从 tty 读取。如果^C确实在此处文档中,那么它可以在远程端触发 SIGINT。(注意,我的意思不是^后面跟着,它必须是我们表示的C单字节字符,ASCII ETX, 0x03。)比较此答案中的技巧,其中我通过打印相应的字符来发送+和+ 。 ^CCtrlcCtrld
由于您的本地设备ssh不从 tty 读取数据,因此没有理由首先重新配置它。您的Ctrl+在本地c引发 SIGINT并终止。一般来说,远程进程(如)可能能够幸存下来。sshstart server in debug mode
如果您想要Ctrl+c您键入以访问服务器,您绝对希望ssh从终端读取。这意味着您不能使用此处的文档。
至少有两种方法:
将 shell 代码存储在远程端的脚本中,直接通过 ssh 进入交互式 shell(其中Ctrl+ c“简单”按预期工作),然后运行脚本。
或者将 shell 代码作为参数(或多个参数)传递给ssh,而不是通过其标准输入。此方法不会自动在远程端分配 tty,但您需要它,因此使用-t(-tt也可以工作)。
例子:
ssh -t my.server -L 8001:localhost:8000 '
trap "start server as service in normal mode" INT
stop server
start server in debug mode
'
Run Code Online (Sandbox Code Playgroud)
请注意,示例中的整个 shell 代码都是单引号的,看起来很简单,但如果您需要在远程端实际使用单引号,那么它就会变得复杂;请参阅如何在 Bash 中方便地使用单引号或转义整个命令行?
在任何这些情况下,您的本地终端都会以+到达远程端并在那里ssh引发 SIGINT 的方式使用本地终端。Ctrlc
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |