`scp`(Secure Copy)是一个用于在不同计算机之间安全地复制文件和目录的命令行工具。它使用 SSH 协议进行连接和文件传输,提供了加密和身份验证机制,确保数据传输的安全性。
scp [options] source destination
其中,`source` 是要复制的源文件或目录的路径,`destination` 是目标文件或目录的路径。
`scp` 命令的常用选项包括:
- `-r`:递归复制目录及其内容。
- `-p`:保留源文件的权限。
- `-v`:显示详细的输出,可以查看复制过程中的进度和详细信息。
- `-i`:指定用于身份验证的私钥文件。
- `-P`:指定远程 SSH 服务器的端口号。
① 将本地文件复制到远程服务器:
scp /path/to/local/file user@remote-server:/path/to/destination
上述命令将本地的 `/path/to/local/file` 文件复制到远程服务器的 `/path/to/destination` 目录中。
② 将远程文件复制到本地:
scp user@remote-server:/path/to/remote/file /path/to/destination
上述命令将远程服务器上的 `/path/to/remote/file` 文件复制到本地的 `/path/to/destination` 目录中。
③ 递归复制目录及其内容:
scp -r /path/to/local/directory user@remote-server:/path/to/destination
上述命令将本地的 `/path/to/local/directory` 目录及其内容递归地复制到远程服务器的 `/path/to/destination` 目录中。
④ 从远程服务器复制文件到本地,并指定端口号:
scp -P 2222 user@remote-server:/path/to/remote/file /path/to/destination
上述命令将远程服务器上的 `/path/to/remote/file` 文件复制到本地的 `/path/to/destination` 目录中,并指定远程服务器的端口号为 2222。
注:`scp` 命令需要在本地计算机和远程服务器之间建立 SSH 连接,并且需要提供适当的身份验证凭据(如用户名和密码或私钥文件)。
`rsync` 是一个功能强大的文件复制和同步工具,可以在本地和远程之间进行文件同步。与 `scp` 不同,`rsync` 可以根据文件的差异进行增量复制,只传输发生变化的部分,从而提高效率和节省带宽。
rsync [options] source destination
其中,`source` 是要复制的源文件或目录的路径,`destination` 是目标文件或目录的路径。`source` 和 `destination` 可以是本地路径,也可以是远程路径(使用 `rsync` 的远程协议)。
`rsync` 命令的常用选项包括:
- `-a`:以归档模式进行复制,保留文件的所有属性(权限、所有者等)。
- `-r`:递归复制目录及其内容。
- `-v`:显示详细的输出,可以查看复制过程中的进度和详细信息。
- `-z`:在传输过程中启用压缩,减少数据传输量。
- `-P`:显示进度信息,同时保留部分复制的文件。
- `-e`:指定远程 shell 的命令。
- `--delete`:在目标上删除源中不存在的文件。
① 本地文件复制:
rsync /path/to/local/file /path/to/destination
上述命令将本地的 `/path/to/local/file` 文件复制到本地的 `/path/to/destination` 目录中。
② 本地目录复制:
rsync -a /path/to/local/directory /path/to/destination
上述命令将本地的 `/path/to/local/directory` 目录及其内容复制到本地的 `/path/to/destination` 目录中。
③ 从远程服务器复制文件到本地:
rsync -avz user@remote-server:/path/to/remote/file /path/to/destination
上述命令将远程服务器上的 `/path/to/remote/file` 文件复制到本地的 `/path/to/destination` 目录中,并使用压缩进行传输。
④ 从本地复制文件到远程服务器:
rsync -avz /path/to/local/file user@remote-server:/path/to/destination
上述命令将本地的 `/path/to/local/file` 文件复制到远程服务器的 `/path/to/destination` 目录中,并使用压缩进行传输。
⑤ 远程同步两个目录:
rsync -avz user@remote-server:/path/to/source /path/to/destination
上述命令将远程服务器上的 `/path/to/source` 目录及其内容与本地的 `/path/to/destination` 目录进行同步,并使用压缩进行传输。
注:`rsync` 命令需要在本地计算机和远程服务器之间建立连接,并且需要提供适当的身份验证凭据(如用户名和密码或私钥文件)。另外,确保在使用 `rsync` 命令时,您具有足够的权限来访问源文件和目标位置。
循环复制文件到所有节点的相同目录下
(a)rsync命令原始拷贝:
rsync -rvl /opt/module root@hadoop01:/opt/
(b)期望脚本:
xsync要同步的文件名称
(c)说明:在/home/hadoop/bin这个目录下存放的脚本,hadoop用户可以在系统任何地方直接执行。
在/home/Hadoop这个目录下创建bin目录,并在bin目录下xsync创建文件。
要找到您当前登录用户的目录,可以使用以下命令:
echo $HOME
该命令会打印出您当前登录用户的主目录路径。在Linux系统中,每个用户都有一个主目录,通常位于 `/home` 目录下,以用户名命名。
另外,您还可以使用以下命令来查看当前所在的目录:
pwd
该命令会显示当前工作目录的路径,即您当前所在的目录。
命令如下:
[hadoop@Hadoop01 ~]$ mkdir bin
[hadoop@Hadoop01 ~]$ cd bin
[hadoop@Hadoop01 bin]$ touch xsync
在文件中编写如下代码:
- #!/bin/bash
- #1 获取输入参数个数,如果没有参数,直接退出
- pcount=$#
- if ((pcount==0)); then
- echo no args;
- exit;
- fi
-
- #2 获取文件名称
- p1=$1
- fname=`basename $p1`
- echo fname=$fname
-
- #3 获取上级目录到绝对路径
- pdir=`cd -P $(dirname $p1); pwd`
- echo pdir=$pdir
-
- #4 获取当前用户名称
- user=`whoami`
-
- #5 循环
- for((host=02; host<04; host++)); do
- echo ------------------- hadoop$host --------------
- rsync -av $pdir/$fname $user@hadoop$host:$pdir
- done
注:如果你的主机名和我一样是01,02,03,把代码文件路径中的adoop改成Hadoop0(由于脚本中的循环计数变量
host
在输出时被解释为整数而不是字符串,所以会被解析为hadoo2和hadoop3)。
接着修改脚本 xsync 具有执行权限:
chmod 777 xsync
调用脚本形式:
xsync 文件夹名称
如图所示,可正确运行!