2013-04-27 113 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