scp

scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,
而且scp传输是加密的。可能会稍微影响一下速度。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,
rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
选项
-1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定ssh配置文件;
-l:指定宽带限制;
-o:指定使用的ssh选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。

scp在覆盖时不会提醒。
把当前目录下的authorized_keys 复制到远程主机192.168.4.101的root家目录下.ssh/
#scp authorized_keys [email protected]:~/.ssh/

把远程主机192.168.4.100 root家目录的.ssh/authorized_keys复制到当前目录
#scp [email protected]:~/.ssh/authorized_keys .

批量复制当前目录多个文件到远程主机
#scp -B anaconda-ks.cfg install.log [email protected]:/tmp

rsync

基于ssh和rsh服务实现高效率的远程系统之间复制文件。

比scp更快,只复制不同的文件

rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,
例如,定期地备份文件服务器数据到远端服务器,对本地磁盘定期进行数据镜像等。

rsync的缺点逐渐被暴露了出来。rsync做数据同步时,需要扫描所有文件后进行对比,然后进行差量传输。
如果文件很大,扫面文件是非常耗时的,而且发生变化的文件往往是很少一部分,因此rsync是非常低效的方式
Centos 6  version 3.0.6 .最小化安装自带
Centos 7  version 3.0.9 .最小化安装不提供
语法:

• rsync –av /etc server1:/tmp 复制目录和目录下文件
• rsync –av /etc/ server1:/tmp 只复制目录下文件

选项:
-e ssh|rsh 指定使用rsh、ssh方式进行数据同步
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件
--progress 显示传输过程
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
-aAX 最全的方式

默认只会复制变化的数据

使用DD来模拟几个大文件

#dd if=/dev/zero of=file3 bs=1M count=500
file1=100M file2=300M file3=500M

对比下速度与时间
#time scp file3 [email protected]:/tmp
file3                                                                                                                                                                          100%  500MB  18.5MB/s   00:27    

real    0m27.906s
user    0m1.418s
sys     0m10.906s

#time rsync --progress -e ssh file3 [email protected]:/tmp
file3
   524288000 100%   50.51MB/s    0:00:09 (xfer#1, to-check=0/1)

real    0m10.293s
user    0m3.106s
sys     0m12.211s
-----------------------------------------------------------------------

使用压缩选项后
#time scp -C file3 [email protected]:/tmp
file3                                                                                                                                                                          100%  500MB  50.0MB/s   00:10    

real    0m10.907s
user    0m3.420s
sys     0m9.929s

#time rsync --progress -ze ssh file3 [email protected]:/tmp
file3
   524288000 100%   62.24MB/s    0:00:08 (xfer#1, to-check=0/1)

real    0m8.579s
user    0m5.503s
sys     0m2.043s

特别注意的地方

#rsync -av /tmp [email protected]:/tmp       注意源/tmp  会连同/tmp这个目录和/tmp目录下的文件一起复制

#tree
.
└── tmp
    ├── gconfd-gdm
    ├── gconfd-root
    ├── sshd

#rsync -av /tmp/ [email protected]:/tmp        注意源/tmp/  只复制/tmp目录下的文件,相当于/tmp/*
#tree
.
├── gconfd-gdm
├── gconfd-root
├── sshd

sftp

sftp命令是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还支持公钥认证和压缩等功能。

sftp [user@]host
常用选项
-B:指定传输文件时缓冲区的大小;
-l:使用ssh协议版本1;
-b:指定批处理文件;
-C:使用压缩;
-o:指定ssh选项;
-F:指定ssh配置文件;
-R:指定一次可以容忍多少请求数;
-v:升高日志等级。
在命令前加上!,表示查看本地目录指令,如!pwd ,!ls
#sftp [email protected]

pssh

项目网址:https://code.google.com/p/parallel-ssh/

pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快。它支持文件并行复制,远程命令执行,杀掉远程主机上的进程等等。

在使用pssh之前,必须要保证管理主机和本地主机基于密钥的认证。如果不是基于密钥认证,必须保证被管理的多台主机的密码相同。

安装源在EPEL

此组件包含了以下几个工具
pnuke   在远程多台主机上并行killall某一进程
prsync  使用rsync协议本地文件同步到远程多台主机上
pscp.pssh  把文件并行复制到多台远程主机上
pslurp  把文件从远程多台主机上复制到本地主机上
pssh    在远程多台主机上并行运行命令

pssh语法:
pssh [OPTIONS] command [...]
--version:查看版本
-h:主机文件列表,内容格式” [user@]host[:port]”
-H:主机字符串,内容格式” [user@]host[:port]”
-l:登录使用的用户名
-p:并发的线程数【 可选】
-o:输出的文件目录【 可选】
-e:错误输入文件【 可选】
-t:TIMEOUT 超时时间设置,0无限制【 可选】
-O:SSH的选项
-v:详细模式
-A:手动输入密码模式。当不支持ssh的key认证时
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息输出.就是指令执行在本机输出效果是一样的
-P:打印出服务器返回信息

pscp.pssh语法
-v 显示复制过程
-a 复制过程中保留常规属性
-r 递归复制目录

pslurp语法
pslurp [OPTIONS] remote local
-r 递归复制目录
-L 后接本机目录
会在指琮-L目录生成对应主机的汇夹,最好不要有同名的文件占用文件夹的创建,会报错

pnuke语法
pnuke [OPTIONS] pattern

搭配实例演示

#cat ip.txt 
192.168.4.101   #这一台是Centos 7
192.168.4.113   #这一台是Centos 6

返回某条指令的结果

#pssh -h ip.txt -i getenforce
[1] 11:05:06 [SUCCESS] 192.168.4.101
Disabled
[2] 11:05:07 [SUCCESS] 192.168.4.113
Enforcing

#pssh -h ip.txt -P getenforce
192.168.4.101: Disabled
[1] 11:05:11 [SUCCESS] 192.168.4.101
192.168.4.113: Enforcing
[2] 11:05:11 [SUCCESS] 192.168.4.113

支持命令中使用通配符等特殊符号,但是注意使用单引号
#pssh -h ip.txt -P 'lscpu|grep "Model name:"'
192.168.4.101: Model name:            Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
[1] 11:20:58 [SUCCESS] 192.168.4.101
192.168.4.113: Model name:            Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
[2] 11:20:58 [SUCCESS] 192.168.4.113

#pssh -h ip.txt -P 'echo $HOSTNAME'

把信息输出到文件

#pssh -h ip.txt -o /app 'df -h|grep /dev/sd'
[1] 11:31:28 [SUCCESS] 192.168.4.101
[2] 11:31:29 [SUCCESS] 192.168.4.113
#ls
192.168.4.101  192.168.4.113
#cat 192*
/dev/sda3       8.6G  1.6G  7.0G  19% /
/dev/sda1       497M  113M  385M  23% /boot
/dev/sda3       8.3G  1.8G  6.1G  23% /
/dev/sda1       477M   35M  417M   8% /boot

从本机同步单个文件或多个文件到远程主机

#pscp.pssh -h ip.txt /etc/selinux/config /etc/selinux/
[1] 11:45:05 [SUCCESS] 192.168.4.101
[2] 11:45:05 [SUCCESS] 192.168.4.113

ESS] 192.168.4.113
#pssh -h ip.txt -P 'setenforce 0;grep ^SELINUX= /etc/selinux/config'
192.168.4.101: SELINUX=disabled
[1] 11:47:36 [SUCCESS] 192.168.4.101
192.168.4.113: SELINUX=disabled
[2] 11:47:37 [SUCCESS] 192.168.4.113

从远程主机同步单个文件或多个文件到本机

复制目录时才指定-r 。最拍一个local参数是必须指定的。复制文件时,指的是文件名,复制目录时,指的是相对于-L XXX 下的子目录
#pslurp -h ip.txt -r -L /app /var/log/ log
#tree -L 3
.
├── 192.168.4.101
│ └── log
│     ├── audit
│     ├── boot.log
│    
├── 192.168.4.113
│ └── log
│     ├── anaconda.log
│     ├── audit
│     ├── boot.log

结束远程主机指定进程

查看远程主机确实打开了ssh-agent进程
#pssh -h ip.txt -i 'pidof ssh-agent'
[1] 15:30:08 [SUCCESS] 192.168.4.101
4093 4083 4073
[2] 15:30:08 [SUCCESS] 192.168.4.113
6487 6474 6461

#pnuke -h ip.txt ssh-agent
[1] 15:28:54 [SUCCESS] 192.168.4.101
[2] 15:28:55 [SUCCESS] 192.168.4.113