目录
ssh
配免密码
首先通过ssh-keygen生成ssh所用的公钥和私钥:
ssh-keygen
三次回车
然后通过ssh-copy-id来把本地主机的公钥复制到远程主机的authorized_keys里:
ssh-copy-id user@server
当然,也可以手动操作实现ssh-copy-id:
scp ~/.ssh/id_rsa.pub user@server:~/
ssh user@server
cat id_rsa.pub >> ~/.ssh/authorized_keys
rm -rf id_rsa.pub
隧道(端口转发)
规定A为ssh客户端的地址(本地),B为ssh服务端的地址(远端),C为应用程序服务端。
A必须能够ssh登录B(即在A上执行下列命令)。
动态端口转发
ssh -ND [bind_address:]A_port user@B
其效果相当于同时在A上开了SSlocal和B上开了SSserver,本地SOCKS5会监听指定的端口。所以如果内网里有不能联网的机器,在内网上能联网的机器上利用ssh开个socks5代理就可以轻松让不能上网的机器利用socks5代理轻松上网了。
本地端口转发
ssh -NL [bind_address:]A_port:C:C_port user@B
应用程序访问A上的A_port即能访问应用程序的服务端。要求B必须能连通C,或者B与C是同一主机。
如果不设置bind_address,A_port会根据GatewayPorts的设置把端口绑定到相应的地址上(一般是localhost)。如果其他主机上的应用程序想要访问A上的A_port,需要将[bind_address:]设置为*:或者0.0.0.0:或者就单独的:,此时A监听的就是0.0.0.0:A_port。
远程端口转发
ssh -NR [bind_address:]B_port:C:C_port user@B
应用程序访问B上的B_port即能访问应用程序的服务端。要求A必须能连通C,或者A与C是同一主机。
[bind_address:]在命令中的设置是无效的,bind_address只取决于/etc/ssh/sshd_config里的GatewayPorts选项。默认状态下,/etc/ssh/sshd_config里的GatewayPorts选项为no,开启远程端口转发后B只会监听127.0.0.1:B_port。将B主机上/etc/ssh/sshd_config里的GatewayPorts选项设置为yes并重启sshd服务sudo /etc/init.d/ssh restart,重新开启远程端口转发后,B则会监听0.0.0.0:B_port。
通过ssh执行另一个需要交互的命令
例如通过跳板机A登录B:
ssh -t A "ssh B"
scp
通过跳板机传输
假设要从本地通过跳板机A传文件至B机(要求A能免密登录B,即要把A的公钥放到B的authorized_keys中去):
scp -o ProxyCommand='ssh -A A -W %h:%p' ~/test.txt B:~/test.txt
假设要从本地通过跳板机A、B传文件至C机(要求A能免密登录B,B能免密登录C):
scp -o ProxyCommand='ssh -A A ssh -A B -W %h:%p' ~/test.txt C:~/test.txt
在两个远程主机之间传输
假设在本地想要将A主机的文件传输到B主机,可以:
scp A:~/test.txt B:~/
但这种方式要求A能免密登录B。它的实质是ssh A scp ~/test.txt B:~/。所以通过这种方式,流量不会经过本地。
除此之外,还可以使用:
scp -3 A:~/test.txt B:~/
-3选项本地成为AB之间的中转站,所有的文件传输流量都会经过本地。这也就意味着使用这种方式并不需要AB之间能通信。但这种方式要求本地必须至少能免密登录AB中的一个主机,因为同时输入两个密码很有可能会发生冲突,导致认证失败。
只要在两个远程主机之间scp,-P指定端口便会被SCP忽略,因为它存在二义性,SCP无法得知是指定哪台主机的端口,于是一律使用默认的22端口。所以如果要配置-P等选项,必须在本地的~/.ssh/config或者/etc/ssh/ssh_config中配置。
有些时候,即使不配置免密登录,而是输入两次密码,scp也有一定概率会成功,这个与openssh版本等因素也有关系,有点玄学,但配免密登录则一定会成功。
rsync
带端口号传输
如果远端的ssh端口不是22而是22222:
rsync -a -e 'ssh -p 22222' source/ destination/
目录最后加不加斜杠的区别
加不加斜杠只对源目录有影响。
加了的话,就是将源目录下的子文件和子目录和目标目录下的子文件和子目录进行同步。
不加的话,就是将源目录和目标目录下的对应目录进行同步(没有的话就会创建),这个操作往往是不满足你预期的。
所以一般情况下源目录和目标目录都加斜杠就行了。
rsync同步文件机制
rsync默认情况下使用的是quick check算法,即最后修改时间不同或大小不同的同名文件都会被重新传输。如果文件的其他属性发生了更改,则根据使用rsync的选项的要求直接在目标文件属性上做修改,而不会重新传输文件。默认情况下不会删除本地没有而远端有的文件。
以下一些选项可以修改这种机制:
- -I, --ignore-times可以强制重新传输所有文件
- --size-only可以只传输那些文件大小不同的文件
- -c, --checksum是 --size-only的加强版,除了传输那些文件大小不同的文件,还会为每个大小相同的文件计算128位的校验和,如果校验和不一致也会重新传输
- –update:仅当源文件的修改时间比目标文件新时传输文件
dry run
-n命令可以让rsync执行dry run,即只输出模拟执行命令后的结果,并不实际执行rsync。
利用这个特性也可以使用rsync来比较两个目录中不同的文件。
rsync -avn --size-only --existing source/ destination/
–existing表示只比较两个目录中的共有文件和目录,如果需要列出所有的差异就删去–existing增加–delete,–delete表示在目标目录中删去源目录没有的文件和目录。
--size-only可以换成-c做严格对比。
如果rsync不会进行任何同步,则应该看到输出的sending incremental file list后是空的,如果看到输出了很多文件和目录,如果你确定文件内容相同的话,大概率就是因为源目录和目标目录中的对应同名文件修改时间不同导致的。增加--no-times参数可以让时间戳不同的目录不再被打印,但修改时间不同的文件仍然会被打印(即使在该情况下去掉-n参数执行rsync命令时不会被同步)。
如果想忽略时间戳的差异,只比较源目录和目标目录下的文件内容是否有差异,可以执行
rsync -avn -c --no-times source/ destination/
断点续传
rsync会默认删除掉没传输完成的文件,加上–partial参数则可保留未传输完成的单个文件,以便断点续传
通过跳板机传输
假设要从本地通过跳板机A传文件至B机(要求A能免密登录B):
rsync -a -e 'ssh -A A ssh' ~/test.txt B:~/
假设要从本地通过跳板机A、B传文件至C机(要求A能免密登录B,B能免密登录C):
rsync -a -e 'ssh -A A ssh -A B' ~/test.txt C:~/
本文详细介绍SSH免密配置流程,包括公钥和私钥生成、公钥复制及免密验证。涵盖SSH隧道建立,如动态、本地和远程端口转发。此外,深入解析scp与rsync命令的高级用法,包括通过跳板机传输文件、断点续传、同步机制及目录匹配技巧。
712

被折叠的 条评论
为什么被折叠?



