所以我正在玩SCP,并有几个问题。首先,作为参考,这是我的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.
有没有办法通过stderr(SSH_MSG_CHANNEL_EXTENDED_DATA)而不是stdout(SSH_MSG_CHANNEL_DATA)发送scp错误?
为什么文件名指定了两次?一旦进入初始scp调用并进入“C0644 5文件名”部分?似乎只有一个应该是必要的? (在我的测试中,为第二个执行基本名称会使错误消失但仍然显得多余)
为什么SCP发送那些空字节SSH_MSG_CHANNEL_DATA数据包?我看过的所有SCP客户都没有通过SSH_MSG_CHANNEL_REQUEST创建任何类型的pty,那么为什么SCP看起来好像有一个,为什么SSH服务器会让它出现呢?
在初始的“C0644 5文件名”部分中,运行scp -t
命令后,为什么需要“C”?这是为了权限,但为什么不省略C并让它成为模式的八进制值的字符串表示?
(我包括rcp标签顺便说一句,因为我认为rcp和scp应该非常相似)
答案 0 :(得分:1)
在Linux上,至少scp(1)确实在发起方向stderr发送错误,正如通过在末尾运行带有“&gt; / dev / null”的各种失败命令以将正常stdout重定向到/ dev / null,从而只显示stderr。
第一个文件名出现在“scp -t”中,这是告诉远程SSH要做什么的一部分。后一种情况是SCP协议通过SSH链接进行通信。有关详细信息,请参阅下面提到的网址。
这个我不确定 - 它需要更多的挖掘。
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