2017-08-29 134 views
-1

我很好奇scp如何處理二進制文件包含轉義序列的情況 - 尤其是從字符串Ctrl+C(「\ 0x03」)字符程序員的一面。scp如何設法在sink模式下處理Ctrl + C

我已經嘗試在水槽模式啓動它,併發送一個「\ 0×03」字樣,但它清楚地退出在收到它:

$ perl -e 'print "\x03"'|xsel 
$ scp -t /tmp/somefile.txt 
^C 
$ 

然而,包含相同字符的二進制文件讓渡的不失敗,但我相信它應該。

我也嘗試讀取scp.c:source函數的源代碼來查看它是否嘗試執行任何字符轉義,但令我驚訝的是它並不出現如此。

回答

0

簡而言之,源scp實例通過乾淨的數據通道與接收器實例進行通信。任何字節值都可以通過管道發送,並且沒有字節接收任何特殊處理。這是沒有PTY的ssh「shell」或「exec」通道的預期行爲。

對於較長的答案,我將限制在unix系統上運行的OpenSSH scp。我認爲那是你正在談論的場景。

TTY接口提供了諸如Ctrl-C(中斷進程)或Ctrl-D(文件結束)等擊鍵的特殊行爲。像ssh服務器這樣的程序使用稱爲PTYs(pseudo-ttys)的unix功能爲網絡客戶端提供TTY接口。當您在交互式會話中運行類似scp -t ...的命令時,您將在TTY(或PTY)的上下文中運行該命令,並且它是將鍵入的Ctrl-C轉換爲中斷信號的TTY。進程可以禁用此行爲,但scp程序不會這樣做,因爲它不需要。

以普通方式運行scp時,如scp /some/local/file [email protected]:/some/remote/dir,啓動的scp進程運行ssh的副本以建立到遠程系統的連接。它運行將是這樣的實際命令(簡化):

ssh [email protected] "scp -t /some/remote/dir" 

換句話說,它開始的ssh的副本,其連接到遠程系統並運行的scp另一個副本。

當ssh以這種方式運行時,指定要在遠程系統上運行的命令,默認情況下它不會爲通道請求PTY。因此,兩個scp實例將通過乾淨的數據管道相互通信,而不涉及PTY。

+0

你能指點一下我怎麼能測試運行遠程命令SSH的方式,它不反應Ctrl + C的輸入?我沒有運氣,你指定的例子。 – vdudouyt

+0

如果你運行'ssh user @ localhost「scp -t/some/remote/dir」',然後按下Ctrl-C,Ctrl-C將由你的本地tty處理並中斷ssh進程。遠程scp實例將退出,因爲它在ssh會話終止時在其輸入上看到EOF條件。遠程scp實例不會收到Ctrl-C字符或任何信號。 – Kenster

相關問題