rcp 是 Unix/Linux 系统间远程复制文件的命令,语法类似 cp,但需指定远程主机名和目标路径,它使用 rsh 协议,因安全性低(明文传输)已被更安全的 scp 和 rsync 命令取代。
rcp
(Remote Copy Protocol)是一个经典的 Unix/Linux 命令行工具,用于在本地主机与远程主机之间,或两台远程主机之间复制文件或目录,它基于 rsh
(Remote Shell)协议工作,是早期网络环境中常用的文件传输工具。
重要安全提示 (⚠️ 必读):rcp
和其依赖的 rsh
不加密传输的数据或登录凭证(用户名/密码),这意味着你的文件内容和密码在网络上以明文形式传输,极易被截获。在现代网络环境中(尤其是互联网或不受信任的网络),强烈建议使用更安全的替代方案:scp
(基于 SSH)或 sftp
。 仅在绝对安全、隔离的受控网络(如封闭的实验室网络)且了解风险的情况下才考虑使用 rcp
。
基本语法格式
rcp [选项] 源文件/目录 目标文件/目录
- 源文件/目录: 要复制的文件或目录路径。
- 目标文件/目录: 复制后文件或目录的目标路径。
路径中指定远程主机:
在路径前加上 远程用户名@远程主机名:
或 远程主机名:
(使用当前本地用户名登录远程主机)来指示远程位置。
常用选项
-p
:保留(Preserve)源文件的修改时间、访问时间和权限模式(尽可能)。-r
:递归(Recursive)复制整个目录及其内容(用于复制目录时必须使用)。-k
:请求 Kerberos 认证(如果系统配置支持 Kerberos,可提供比明文密码稍好的安全性,但仍不如 SSH)。-x
:启用传输数据的 DES 加密(非常过时且脆弱,不提供实质安全,不推荐依赖)。
核心使用场景与示例
-
从本地复制文件到远程主机:
rcp /path/to/local/file.txt username@remotehost:/path/to/remote/directory/
- 将本地文件
file.txt
复制到远程主机remotehost
上用户username
的家目录下的/path/to/remote/directory/
目录中。 - 如果省略
username@
,rcp
会尝试使用你当前的本地用户名登录远程主机。 - 目标路径末尾的 很重要,它表示目标是一个目录,如果省略且目录不存在,
rcp
可能会尝试创建一个同名文件,通常会导致错误。
- 将本地文件
-
从远程主机复制文件到本地:
rcp username@remotehost:/path/to/remote/file.txt /path/to/local/directory/
- 将远程主机
remotehost
上用户username
的/path/to/remote/file.txt
文件复制到本地的/path/to/local/directory/
目录下。
- 将远程主机
-
在两台远程主机之间复制文件:
rcp username1@sourcehost:/path/to/source/file.txt username2@destinationhost:/path/to/destination/
- 将源主机
sourcehost
上用户username1
的文件file.txt
复制到目标主机destinationhost
上用户username2
的/path/to/destination/
目录下。 - 执行此操作的主机(你运行命令的本地主机)需要能访问这两台远程主机,并且你在这两台远程主机上需要有相应的权限。
- 将源主机
-
复制整个目录(递归复制):
rcp -r /path/to/local/directory username@remotehost:/path/to/remote/parent/
- 使用
-r
选项,将本地目录/path/to/local/directory
(包含其所有子目录和文件)递归复制到远程主机remotehost
的/path/to/remote/parent/
目录下,复制后,远程目录路径将是/path/to/remote/parent/directory/
。
- 使用
-
保留文件属性:
rcp -p importantfile.conf username@remotehost:/etc/
- 使用
-p
选项,在复制文件importantfile.conf
到远程主机的/etc/
目录时,尽可能保留其原始修改时间、访问时间和权限位。
- 使用
关键前提条件与配置
rsh
/rlogin
服务必须启用: 远程主机必须运行rshd
或rlogind
守护进程(通常在inetd
或xinetd
中配置)。出于安全原因,现代系统默认通常禁用这些服务。- 主机信任关系: 需要在远程主机的用户家目录下配置信任关系文件:
~/.rhosts
: 列出允许访问的主机名 用户名
对(一行一个),在remotehost
上用户username
的~/.rhosts
文件中添加yourlocalmachine yourlocalusername
,允许用户yourlocalusername
从主机yourlocalmachine
无需密码登录remotehost
的username
账户。/etc/hosts.equiv
(系统级): 管理员配置,信任整个主机上的所有用户(或特定用户),风险更高。
- 网络连通性: 本地主机与远程主机之间网络必须畅通,且远程主机的
rsh
端口(默认 TCP 514)未被防火墙阻止。 - 命令可用性:
rcp
命令需要在本地主机和参与操作的远程主机上安装(通常是rsh
或openssh-client
包的一部分,但后者主要提供scp/ssh
)。
为什么强烈推荐 scp
或 sftp
替代 rcp
?
- 加密:
scp
(Secure Copy) 和sftp
(SSH File Transfer Protocol) 基于 SSH (Secure Shell) 协议,对所有传输的数据(包括文件内容和登录凭证)进行强加密,有效防止窃听和中间人攻击。 - 认证: 支持更安全的公钥认证和强密码认证。
- 完整性: 确保传输的数据在过程中未被篡改。
- 功能:
scp
语法与rcp
高度相似,学习成本低。sftp
提供交互式文件管理功能。 - 可用性: SSH 服务 (
sshd
) 是现代 Unix/Linux 系统的标准配置,安全性高且默认启用。
scp
基本语法示例 (强烈推荐使用):
scp -p /path/to/local/file.txt username@remotehost:/path/to/remote/directory/ # 复制到远程 scp -p -r username@remotehost:/path/to/remote/directory/ /path/to/local/ # 从远程复制目录 scp -p user1@host1:/file.txt user2@host2:/destination/ # 主机间复制
注意事项总结
- 首要安全警告:
rcp
不安全! 仅在绝对可信、隔离的网络中使用,否则,务必使用scp
或sftp
。 - 权限: 执行
rcp
的用户必须在源位置有读取权限,在目标位置有写入权限。 - 路径: 正确使用绝对路径或相对于用户家目录的路径( 在
rcp
命令中可能不会被远程 shell 正确解析,建议使用绝对路径)。 - 目录斜杠: 复制目录时,源目录名后不加斜杠复制的是目录本身;加斜杠复制的是目录内容,目标路径末尾加斜杠明确指定为目录。
- 配置复杂: 设置
.rhosts
或hosts.equiv
需要谨慎,配置错误可能导致安全漏洞。 - 过时性:
rcp
已被更安全、功能更丰富的工具(scp
,sftp
,rsync
over SSH)广泛取代。
虽然 rcp
在历史上用于简单的远程文件复制,但其固有的安全性缺陷(明文传输) 使其在现代计算环境中极不推荐使用,理解 rcp
的语法和工作原理有助于阅读遗留脚本或文档,但在进行任何实际的远程文件操作时,应始终优先选择基于 SSH 的安全替代品 scp
或 sftp
,它们提供了 rcp
的所有基本功能,并在此基础上增加了至关重要的加密和强认证机制,是保护系统和数据安全的必要实践。
引用与说明:
- 基于 Unix System V 和 BSD 派生的
rcp
命令标准实现文档。 - 安全警告依据 NIST (SP 800-123)、CIS 等机构关于安全 Shell 和淘汰不安全协议的建议。
scp
/sftp
推荐依据 OpenSSH 项目文档及广泛认可的最佳安全实践。- 具体命令选项和行为的描述参考了
man rcp
(手册页) 的核心内容。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/4936.html