0

それで私は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.
  1. stdout (SSH_MSG_CHANNEL_DATA) の代わりに stderr (SSH_MSG_CHANNEL_EXTENDED_DATA) 経由で scp エラーを送信する方法はありますか?

  2. ファイル名が 2 回指定されているのはなぜですか? 最初のscp呼び出しで1回、「C0644 5ファイル名」の部分で1回?1つだけ必要なようですか?(私のテストでは、2番目のベース名を実行するとエラーが解消されますが、それでも冗長に見えます)

  3. SCP がヌル バイトの SSH_MSG_CHANNEL_DATA パケットを送信するのはなぜですか? 私が調べた SCP クライアントはどれも、SSH_MSG_CHANNEL_REQUEST を介して何らかの種類の pty を作成していません。

  4. その最初の「C0644 5 ファイル名」の部分で、scp -tコマンドが実行された後、なぜ「C」が必要なのですか? これはアクセス許可のためですが、C を省略して、モードの 8 進数値の文字列表現にしないのはなぜですか?

(rcpとscpはかなり似ているはずなので、rcpタグを含めています)

4

1 に答える 1

1
  1. Linux では、少なくとも、scp(1) は開始側の stderr にエラーを送信します。これは、通常の stdout を /dev/null にリダイレクトするために最後に ">/dev/null" を指定してさまざまな失敗したコマンドを実行することで確認できます。 stderr のみを表示します。

  2. 最初のファイル名の出現は、「scp -t」にあるように見えます。これは、リモート SSH に何をすべきかを伝える部分です。後者の発生は、SSH リンクを介して通信される SCP プロトコルにあります。詳細については、下記の URL を参照してください。

  3. これについてはよくわかりません。もっと掘り下げる必要があります。

  4. strace(1) の出力は、「C」を確認します。ここに表示されてwrite(7, "C0664 16245 xdrvlib.c\n", 22) = 22います。「C」はファイルのコピーを意味し、その他の可能性としては「D」と「E」はディレクトリのコピー、「T」は回数を表します。詳細については、次の素敵な Web ページを参照してください。https://blogs.oracle.com/janp/entry/how_the_scp_protocol_works

于 2013-05-17T05:05:16.863 に答える