scp如何设法在接收器模式下处理Ctrl + C.

时间:2017-08-29 08:20:23

标签: ssh scp

我很好奇CoUninitialize()如何处理二进制文件包含转义序列时的情况 - 尤其是scp(" \ 0x03")从程序员的角度来看这个角色。

我已经尝试在接收模式下启动它并发送一个" \ 0x03"性格,但它收到它后显然退出:

Ctrl+C

但是,传输包含相同字符的二进制文件并不会失败,不过我认为应该这样做。

我还尝试阅读scp.c:source函数的源代码,看它是否尝试执行任何字符转义,但令我惊讶的是它并没有出现。

1 个答案:

答案 0 :(得分:0)

简短的回答是源scp实例通过干净的数据管道与接收器实例进行通信。任何字节值都可以通过管道发送,没有字节接收任何特殊处理。这是没有PTY的ssh“shell”或“exec”通道的预期行为。

对于更长的答案,我将把它限制为在unix系统上运行的OpenSSH scp。我认为这就是你所说的情景。

TTY界面提供了Ctrl-C(中断进程)或Ctrl-D(文件结束)等击键的特殊行为。像ssh服务器这样的程序使用名为PTYs(pseudo-ttys)的unix功能为网络客户端提供TTY接口。当您在交互式会话中运行scp -t ...之类的命令时,您将在TTY(或PTY)的上下文中运行它,而TTY会将键入的Ctrl-C转换为中断信号。进程可以禁用此行为,但scp程序不会这样做,因为它不需要。

当您以正常方式运行scp时,例如scp /some/local/file user@host:/some/remote/dir,您启动的scp进程会运行ssh的副本以建立与远程系统的连接。它运行的实际命令将是这样的(简化):

ssh user@localhost "scp -t /some/remote/dir"

换句话说,它会启动ssh的副本,该副本连接到远程系统并运行scp的另一个副本。

当以这种方式运行ssh时,指定要在远程系统上运行的命令,默认情况下它不会为该通道请求PTY。因此,两个scp实例将通过干净的数据管道相互通信,而不涉及到PTY。