2013-04-27 104 views
0

所以我正在和SCP玩耍,並且有幾個問題。首先,以供參考,這是我的SCP會話的日誌文件:通過SSH內部的SCP

-> NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0.0021, network: 0.0001s) 
00000000 62:00:00:00:00:00:00:00:04:65:78:65:63:01:00:00 b........exec... 
00000010 00:1d:73:63:70:20:2d:74:20:2f:68:6f:6d:65:2f:xx ..scp -t /home/u 
00000020 xx:xx:xx:xx:xx:xx:2f:7a:7a:7a:2f:61:62:63:64  sernam/zzz/abcd 

... 

<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.2607, network: 0.2576s) 
00000000 5e:00:00:00:00:00:00:00:01:00     ^......... 

-> NET_SSH2_MSG_CHANNEL_DATA (since last: 0.0014, network: 0.0002s) 
00000000 5e:00:00:00:00:00:00:00:1f:43:30:36:34:34:20:35 ^........C0644 5 
00000010 20:2f:68:6f:6d:65:2f:xx:xx:xx:xx:xx:xx:xx:2f:7a /home/usernam/z 
00000020 7a:7a:2f:61:62:63:64:0a       zz/abcd. 

<- NET_SSH2_MSG_CHANNEL_DATA (since last: 0.0509, network: 0.0483s) 
00000000 5e:00:00:00:00:00:00:00:39:01:73:63:70:3a:20:65 ^.......9.scp: e 
00000010 72:72:6f:72:3a:20:75:6e:65:78:70:65:63:74:65:64 rror: unexpected 
00000020 20:66:69:6c:65:6e:61:6d:65:3a:20:2f:68:6f:6d:65 filename: /home 
00000030 2f:xx:xx:xx:xx:xx:xx:xx:2f:7a:7a:7a:2f:61:62:63 /usernam/zzz/abc 
00000040 64:0a           d. 
  1. 有沒有一種方法,使通過stderr(SSH_MSG_CHANNEL_EXTENDED_DATA)發送SCP的錯誤,而不是標準輸出(SSH_MSG_CHANNEL_DATA)?

  2. 爲什麼文件名指定了兩次?一旦進入最初的scp調用並且一次進入「C0644 5文件名」部分?似乎只有一個應該是必要的? (在我的測試中,爲第二個基準名做錯誤使得錯誤消失,但它似乎仍然是多餘的)

  3. 爲什麼SCP發送那些空字節的SSH_MSG_CHANNEL_DATA數據包?我看過的SCP客戶端都沒有通過SSH_MSG_CHANNEL_REQUEST創建任何類型的pty,那麼爲什麼SCP看起來好像有一個,爲什麼SSH服務器要這麼做呢?

  4. 在該初始「C0644 5文件名」部分中,在運行scp -t命令之後,爲什麼需要「C」?這是爲了權限,但爲什麼不只是省略C,並讓它成爲模式的八進制值的字符串表示形式?

(我包括RCP標籤順便說一句,因爲我想,RCP和SCP應該是非常相似)

回答

1
  1. 在Linux上,至少,SCP(1)不將錯誤發送到stderr在啓動端,如通過運行各種失敗命令並在末尾使用「>/dev/null」來確認將正常stdout重定向到/ dev/null,從而僅顯示stderr所確認的。

  2. 第一個文件名出現在「scp -t」中,這是告訴遠程SSH做什麼的一部分。後一種情況是SCP協議通過SSH鏈接進行通信。有關更多信息,請參閱下面提到的網址。

  3. 這一個我不確定 - 它會採取更多的挖掘。

  4. strace(1)輸出證實了「C」,我在這裏看到write(7, "C0664 16245 xdrvlib.c\n", 22) = 22。 「C」表示文件副本,其他可能性是「D」和「E」表示目錄副本,「T」表示時間。欲瞭解更多信息,請參閱漂亮的網頁:https://blogs.oracle.com/janp/entry/how_the_scp_protocol_works