关于scp -t命令规范及stdin交互用法的技术咨询
Great question—this dives into the underdocumented internals of the SCP protocol, which explains why you’re not finding this info in standard man pages or basic searches. Let’s unpack this:
What’s the -t parameter, and why isn’t it in the man page?
The -t flag stands for "target" mode, and it’s an internal, machine-facing parameter used by scp itself during transfers. When you run a regular scp localfile user@host:remote/path command, the local scp client connects via SSH and launches a remote scp -t remote/path process to receive the data. Since it’s not intended for direct use by end users, the man page only covers user-facing flags (like -r, -P, etc.) and skips these internal protocol details.
Where to find the protocol specification?
The SCP protocol evolved from the old BSD rcp command, wrapped in SSH for security. The definitive source for its behavior is the OpenSSH source code (specifically the scp.c file), which explicitly defines all command sequences for file transfers, directory creation, and other operations.
While there’s no formal RFC for SCP, some historical documentation (like early BSD man pages for rcp) outline the core command structure, and OpenSSH’s implementation has become the de facto standard.
What other operations can you perform?
Beyond the directory and file creation you’ve discovered, the SCP protocol supports several other commands via stdin:
- Create a symbolic link:
stdin -> L<link_target> <filemode> <filename> stdin -> \x00 - Delete a file or directory:
stdin -> R<filename> stdin -> \x00 - Set file timestamps:
stdin -> T<mtime_epoch> <atime_epoch> stdin -> \x00 - Server-side acknowledgments: After sending each command, the remote
scp -tprocess will respond with\x00if the operation succeeded, or\x01<error_message>\x00if it failed.
Confirming your existing findings
For clarity, here’s your original examples formatted properly:
Directory Creation
scp -tr . stdin -> D0755 0 <directory_name> stdin -> \x00
File Write
scp -tr . stdin -> C<filemode, eg. 0744> <file_size_in_bytes> <filename> stdin -> actual file bytes stdin -> \x00
The D command tells the target scp process to create a directory with the given mode (0755) and size (0, which is ignored for directories). The C command initiates a file transfer with the specified mode, size, and filename, followed by the file content itself.
内容的提问来源于stack exchange,提问作者James

