SSHクライアントを介してファイルを転送するためのGoコードを読んでいます。
https://github.com/tmc/scp/blob/master/scp.go#L33
それがすることの1つは、scp -t /remote/path
その旗-t
の用途は何ですか? 1つ作成しましたman scp
が、文書化されていないようです。私はローカルでコマンドを実行しましたが、猫のように動作するようです。
リモートで実行すると、scp -t
コードは次のようにサーバーにバイトを送信します。
// Some special control header? What is this?
fmt.Fprintf(w, "C%#o %d %s\n", mode, size, fileName)
// Send file bytes.
io.Copy(w, contents)
// Send termination signal?
fmt.Fprint(w, "\x00")
この契約は何ですか?どこに文書化されていますか?
答え1
AFAIK、scp プロトコルは、ソースコード以外のどこにも文書化されていません。scp.c
scp
、どのように動作するかを簡単に説明します。
ソースまたはターゲットがリモートコンピュータの場合は、接続してそのコンピュータでプログラムを起動するためにscp
使用されます。コピー方向がリモートからローカルの場合は、次のように始まります(ssh
scp
scp -f src
ソース/ソース)、そうでなければscp -t dst
(流し)、先住民はscp
反対の姿勢をとります。
その後、2つのscpプロセスがscp接続の両側で実行され、それを標準入力/標準出力として使用し、それを介してファイルデータとメタデータを渡します。
両端は、次の応答を使用してメッセージを確認したり、特定のエラー状態を通知したりできます。
"\0"
:いいね"\1%s\n", err_msg
: 致命的でないエラー"\2%s\n", err_msg
: 致命的なエラー
転送は次から始まります。scpに/受信(OK)確認を送信します\0
。
それからソース/ソースcp次のメッセージが使用されます。
"C%04o %lld %s\n", mode, size, filename
:ファイル生成size
以下はファイルデータバイトとack(\0
= OK)です。"D%04o 0 %.1024s\n", mode, dirname
: ディレクトリの起動まで再帰的に
C
、D
またはメッセージをフォローしてください。T
"E\n"
: ディレクトリの終わり"T%llu 0 %llu 0\n", mtime, atime
: ファイル時間スイッチを使用している場合、このメッセージは
C
メッセージD
の前に送信されます。-p
C
これらのメッセージは、ファイルデータ転送前の確認、ファイルデータ転送後の確認など、追加処理の前に相手の確認を受けなければなりません。
上記とメッセージでは、ファイル/ディレクトリ名の改行文字とその他の制御文字(および除外)C
はエスケープされます。しかし、そうです。D
\t
\x7f
\^J
いいえ目的地に到着した後は脱出できません。テキスト\^J
または\^M
元の名前はそのまま残ります。
致命的エラーと致命的でないエラーの区別は一貫していません。どちらの\1
場合も(致命的ではない)エラーが発生しますが、その一部は致命的なエラーとして扱われ、エラーの送受信時に終了し、scp
他方の両方に保持されます。付属。\2
(致命的な)エラーや予期しない状況により、両方の側から退会する可能性があります。
httpとは異なり、ファイルデータをチャンクに送信する規制はありません。ソースがメッセージの後に転送を開始するいくつかの大きなファイルを読み取れなくなった場合は、scp
エラーメッセージ/ nakの前に最大NULバイトをC
送信します。size
\1