Linux的scp、rsync、以及集群分发脚本、ssh配置免密登录
- scp 命令
scp 命令用于拷贝多个文件,尤其是可以跨服务器传输。
scp -r source destination
scp -r ./a/* admin@192.168.7.121:/opt/
注意:如果是想把某个目录下所有的文件都拷贝过去,要加一个*
如果想把a目录下的所有内容,拷贝到b目录下,则要
scp -r ./a/* /b/
否则如果不加*,则会在b下先生成一个a目录。
- rsync 同步命令,主要也是增量同步两台服务器之前的文件变化(主要是根据文件的大小以及最后修改日期决定的。这个命令可以将文件的元数据信息一并同步)。
rsync -av source destination
还是以a和b这两个目录来说明,执行
rsync -av ./a ./b
以上的结果是b目录先多了a目录,a目录下面才是真正的文件,如果想要达到a目录下的文件直接复制到b目录下,不带有a这层目录的话需要在后面加 /或者/*。
rsync -av ./a/ ./b
rsync -av ./a/* ./b
加上这个/或者/*就达到以上的效果了,这里还是和scp有一点区别的。
注意destination,如果目标路径是以文件夹结尾,则会拷贝到这个文件夹下,如果不是以文件夹结尾,则会默认当成要拷贝的新文件名。这点和cp与mv命令比较像。
rsync -av /opt/a/ root@192.168.137.128:/opt/b/
- 集群脚本分发
编写一个脚本,实现所有集群主机的文件同步
#!/bin/bash
#验证参数
if [ $# -lt 1 ]
then
echo "必须指定一个分发文件"
exit
fi
for server in hadoop121 hadoop122 hadoop123
do
echo "=================$server==================="
#内层循环继续遍历参数
for file in $@
do
if [ -e file ]
then
#获取父目录
pdir=$(cd -P dirname $file;pwd)
#获取当前文件名称
fname=$(basename $file)
#这里ssh没有指定用户,则就是当前的终端登录用户
ssh $server "mkdir -p $pdir"
#使用rcync命令进行分发,
rsync -av $pdir/$file $server:$pdir
else
#文件不存在
echo "$file 文件不存在"
fi
done
done
- ssh免密登录
ssh免密登录的实现
A服务器要想与B服务器实现免密登录,两台服务器必须都要保存A服务器的公钥,当A服务器使用私钥进行加密后向B服务器,B服务器去授权Key中查找是否有A服务器的公钥如果有,则直接解密,那么当B服务器向A服务器发送消息时,需要使用A服务器的公钥,A服务器接收到消息以后,再使用私钥解密即可。
配置ssh步骤:
-
进入到A服务的用户家目录,执行 ls -al,可以看到有个隐藏的.ssh文件
-
执行 ssh-keygen -t rsa
执行完这条命令以后会生成 id_rsa以及id_rsa.pub
- 将公钥发送给需要免密登录的服务器
ssh-copy-id 192.168.137.128
实现完这一步以后,当前配置的这个用户,就可以向目标服务器实现免密登录了,注意,如果是免密登录自己服务器,也需要执行以后 ssh-copy-id。