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 root@192.168.4.101
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