Linux 之scp、rsync命令详解

本文详细介绍了SCP(Secure Copy)和RSYNC两种用于文件传输的工具。SCP用于服务器间的安全数据拷贝,而RSYNC则适用于备份和镜像,特别强调了其速度优势和智能更新特性。此外,还提供了实用的脚本示例,如xsync用于集群文件分发,xcall用于集群命令分发。

scp(secure copy)安全拷贝

1、scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)

2、基本语法

命令   递归       要拷贝的文件路径/名称    目的用户@主机:目的路径/名称
scp    -r          $pdir/$fname       $user@$host:$pdir/$fname

3、操作示例

# 将本地目录内容拷贝到远程机器上
sudo scp -r /opt/module/ root@192.168.56.60:/opt

# 将远程机器上目录内容拷贝到本地目录
sudo scp -r hadoop@192.168.56.63:/opt/software/1.txt /opt

# 将远程机器上目录内容拷贝到另一个远程机器上
scp -r hadoop@192.168.56.63:/opt/software/1.txt root@192.168.56.51:/opt

rsync 远程同步工具

rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别: 用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
1、基本语法

命令   递归       要拷贝的文件路径/名称    目的用户@主机:目的路径/名称
rsync -rvl       $pdir/$fname         $user@$host:$pdir/$fname
  • -r 递归
  • -v 显示复制过程
  • -l 拷贝符号连接
rsync -rvl /opt/software/ root@192.168.56.60:/opt/softwar

xsync集群分发文件脚本

需求:循环复制文件到所有节点的相同目录下。
将脚本存放到 /usr/local/bin 目录下,可以在系统任何地方直接执行。

cd /usr/local/bin
sudo touch xsync
# 修改脚本具有执行权限
sudo chmod 777 xsync 

脚本:(主机名需要视具体情况来设置)

#!/bin/bash
#xsync /home/user/bin
#获取输入参数的个数.没有参数直接退出
pcount=$#
if((pcount==0));then
	echo no args;
	exit;
fi

#获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#获取当前用户名称
user=`whoami`

#循环远程机器分发文件,这里要修改远程机器的数量
for((host=2;host<4;host++));do
	#echo $pdir/$fname $user@node$host:$pdir
	#node是主机名前缀
	echo ----------------testnote0$host------------------
	rsync -rvl $pdir/$fname $user@node$host:$pdir
done

执行脚本:
按照上面的脚本,会将目录文件分发到主机名为node2、node3机器上。
注意需要配置主机名对应IP的hosts

ubuntu@node1:~$ xsync etc

xcall集群分发命令脚本

需求:在所有主机上同时执行相同的命令。
将脚本存放到 /usr/local/bin 目录下,可以在系统任何地方直接执行。

cd /usr/local/bin
sudo touch xcall
# 修改脚本具有执行权限
sudo chmod 777 xcall 

脚本:(主机名需要视具体情况来设置)

#!/bin/bash
pcount=$#
if((pcount==0));then
    echo no args;
    exit;
fi 
#获取输入参数
cmd=$@
echo ${cmd}

#获取当前用户名称
user=`whoami`

#循环机器分发命令,从当前主机开始执行
for((host=1;host<=2;host++));do
	#node是主机名前缀
    echo ---------$user@cnode$host------
    ssh $user@cnode$host $cmd
done

执行脚本:
按照上面的脚本,会将命令分发到主机名为node1、node2机器上。
注意需要配置主机名对应IP的hosts

ubuntu@node1:~$ xcall ls

在这里插入图片描述
注意分发命令的时候默认从/bin/usr/bin目录下找命令,如果需要分发额外的命令,就需要指定命令的全路径名。
比如:xcall /opt/jdk1.8.0_191/bin/java -version

<think> 我们正在回答用户关于Linux系统scp命令的详细解释及使用示例的问题。 根据用户要求,我们需要: 1. 使用中文回答 2. 回答中引用的段落末尾自然地添加引用标识 3. 生成相关问题 4. 注意格式:行内数学表达式用$...$,独立公式用$$...$$(但本问题可能不涉及数学公式,所以可以忽略) 5. 代码块使用正确的语法高亮 根据引用内容: 引用[1]:介绍了SCP命令Linux文件传输的常用工具,基于SSH协议,提供加密传输。 引用[2]:说明如果scp命令没有成功,可能是因为路径问题,需要确认目标机器的当前目录。 引用[3]:详细列出了scp命令的语法可选参数,并提到常用示例。 引用[4]:给出了一个从远程主机复制文件到本地的示例。 我们之前的回答已经涵盖了scprsync,但用户这次明确要求详细解释scp命令及使用示例。 因此,我们组织回答如下: 1. 开头介绍scp命令是什么,有什么特点(基于SSH,安全加密传输)。 2. 详细解释命令语法格式。 3. 参数说明(选取常用参数,不用全部,但关键参数如-r, -P, -p, -C等要说明)。 4. 使用示例(包括本地到远程,远程到本地,复制目录,指定端口等)。 5. 注意事项(如路径问题,权限问题等)。 6. 生成相关问题。 注意:在回答中适当添加引用标记(如[^1]),引用来源主要是引用[1][2][3][4]。 </think> ### Linux SCP命令详解及使用示例 SCP(Secure Copy Protocol)是基于SSH协议的安全文件传输工具,提供加密传输能力,是Linux系统间文件传输的首选方案[^1]。以下为详细解析: --- #### 一、命令语法 基本格式: ```bash scp [参数] 源文件 目标路径 ``` - **源文件**:本地路径(如`/home/user/file.txt`)或远程路径(如`user@remote_ip:/path/file.txt`) - **目标路径**:格式同源文件,支持本地/远程路径[^1] --- #### 二、核心参数说明 | 参数 | 作用 | 应用场景 | |------|------|----------| | `-P` | 指定SSH端口(默认22) | `scp -P 2222 file.txt user@host:~` | | `-p` | 保留文件权限时间戳 | 备份重要配置文件时使用 | | `-r` | 递归复制目录 | 传输整个项目文件夹:`scp -r project/ user@host:~/backup/` | | `-C` | 启用压缩传输 | 加速大文件传输:`scp -C large.iso user@host:/data` | | `-v` | 显示详细传输过程 | 调试连接问题:`scp -v file.txt user@host:` | | `-l` | 限制带宽(单位Kbit/s) | 避免影响业务:`scp -l 800 file.txt user@host:` [^3] | > **注意**:`-P`(端口)区分大小写,而`-p`(保留属性)为小写[^3] --- #### 三、典型使用场景示例 1. **本地→远程传输** ```bash # 传输文件到远程主机的/home目录 scp report.pdf user@10.0.0.5:/home/ # 传输目录到远程自定义路径(保留属性) scp -rp /var/log/ admin@server:/backup/logs/ ``` 2. **远程→本地传输** ```bash # 下载远程文件到当前目录 scp user@10.0.0.5:/opt/config.yaml . # 下载整个数据库备份目录 scp -r dba@dbserver:/backup/mysql/ /local/backup/ ``` 3. **跨服务器直接传输** ```bash # 从server1直接传输到server2(不经过本地) scp user@server1:/data/file.zip user@server2:/archive/ ``` 4. **指定非标准端口** ```bash # 通过2222端口传输 scp -P 2222 ~/secret.key user@host:/vault/ ``` --- #### 四、常见问题解决 1. **路径错误** ❌ 报错:`scp: /home/root: No such file or directory` ✅ 方案:用`pwd`确认远程路径,如实际为`/root`则应写`user@host:~/file`[^2] 2. **权限拒绝** ❌ 报错:`Permission denied (publickey)` ✅ 方案: ```bash # 1. 部署SSH密钥 ssh-keygen # 本地生成密钥 ssh-copy-id user@host # 部署公钥 # 2. 检查远程目录权限 ssh user@host "ls -ld /target/path" ``` 3. **大文件传输中断** ✅ 改用支持断点续传的rsync: ```bash rsync -avzP --partial /bigfile.iso user@host:/data/ ``` --- ### 相关问题 1. 如何通过SCP实现免密码自动传输? 2. SCPSFTP在文件传输中有哪些本质区别? 3. 传输过程中如何实时监控SCP的进度速度? 4. 当遇到`Connection timed out`错误时应如何排查? > 引用来源: > SCP协议原理说明参考[^1] > 路径错误解决方案参考[^2] > 带宽限制参数说明参考[^3] > 跨服务器传输示例参考[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值