Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssh scp如何处理Ctrl+;C处于接收器模式_Ssh_Scp - Fatal编程技术网

Ssh scp如何处理Ctrl+;C处于接收器模式

Ssh scp如何处理Ctrl+;C处于接收器模式,ssh,scp,Ssh,Scp,我很好奇当一个二进制文件包含转义序列时,scp如何处理这种情况,特别是程序员眼中的Ctrl+C(“\0x03”)字符 我已经尝试在接收模式下启动它,并向它发送“\0x03”字符,但它在收到后明显退出: $ perl -e 'print "\x03"'|xsel $ scp -t /tmp/somefile.txt ^C $ 但是,传输包含相同字符的二进制文件不会失败,尽管我认为应该失败 我还试图阅读scp.c:source函数的源代码,看看它是否尝试执行任何字符转义,但令我惊讶的是,它似乎没有

我很好奇当一个二进制文件包含转义序列时,
scp
如何处理这种情况,特别是程序员眼中的
Ctrl+C
(“\0x03”)字符

我已经尝试在接收模式下启动它,并向它发送“\0x03”字符,但它在收到后明显退出:

$ perl -e 'print "\x03"'|xsel
$ scp -t /tmp/somefile.txt
^C
$
但是,传输包含相同字符的二进制文件不会失败,尽管我认为应该失败


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

简单的回答是,源
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/fileuser@host:/some/remote/dir
,您启动的scp进程运行一个
ssh
副本,以建立到远程系统的连接。它运行的实际命令如下(简化):

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


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

您能告诉我一种方法,我如何使用SSH测试运行远程命令,使其不会对输入中的Ctrl+C做出反应?对于您指定的示例,我没有运气。如果您运行
sshuser@localhost“scp-t/some/remote/dir”
然后按Ctrl-C,本地tty将处理Ctrl-C并中断ssh进程。远程scp实例将退出,因为当ssh会话终止时,它在其输入上看到EOF条件。远程scp实例不接收Ctrl-C字符或任何信号。
ssh user@localhost "scp -t /some/remote/dir"