目录
一, SSH 命令
二, 端口转发
三, scp 命令
四, rsync 命令
五, sz 和 rz 命令
六, SSH-agent
参考文章
一, SSH 命令
登录类型
密码登录: 服务器发送公钥给客户端, 客户端使用公钥加密后回传给服务器, 服务器解密验证密码.
公钥登录: 服务器发送一个随机字符串给客户端, 客户端用私钥加密, 服务器用公钥解密 (rsa 作为签名使用)
SSH 命令相关参数
-A 密钥转发 这个参数在使用跳板机等场景非常有用, 如果发现始终连不上需要检查下这个
-i 指定密钥文件
-p 端口号
-C: 请求压缩所有数据;
-f 后台运行
-N 参数: 不要求分配 shell, 有些场景下 SSH 禁止账号请求 shell 终端, 比如这个账号只是作为转发
-g 默认这个 LocalPort 端口只允许本机连接, 可以通过这个参数允许别的机器连接这个端口
-T : 不要求分配终端
-o ServerAliveInterval=60 隔段时间发送保活消息
-q 抑制一些调试性的额外输出
相关的命令
SSH-keygen 用于生成密钥对
SSH-copy-id 用于复制公钥到服务器
复制公钥也可以使用: SSH user@host 'mkdir -p .ssh && cat>> .ssh/authorized_keys' <~/.SSH/id_rsa.pub
相关的文件
~/.SSH/authorized_keys 用于保存用户的公钥文件
~/.SSH/known_hosts 文件 保存的服务器用于辨别服务器的唯一散列码
~/.SSH/id_dsa 用户的私钥文件
~/.SSH/id_rsa.pub 默认生成的用户的公钥文件, 用于将该公钥追加到需要登录的服务器 authorized_keys 文件
/etc/SSH/ssh_config 客户端 SSH 配置
/etc/SSH/sshd_config 服务端 SSH 配置
使用模式
这里推荐一种使用的模式, 在利用脚本做自动化的时候, 可以利用 SSH 操作远程主机, 这种方式可以灵活的运用管道, 如上面修改 authorized_keys. 例:
将远程主机 $HOME/src / 目录下面的所有文件, 复制到用户的当前目录: SSH user@host 'tar cz src' | tar xzv
将 $HOME/src / 目录下面的所有文件, 复制到远程主机的 $HOME/src / 目录: cd && tar czv src | SSH user@host 'tar xz'
二, 端口转发
动态转发: SSH -D 1080 user@host -Nfg
最广泛的用途是作为 sock5 代理, 另外还有加密连接的附加好处, 广泛使用的 ss 软件就是用的这个.
另外还可以作为跳板机实现, 公网的服务器有些没有外网 ip, 通过有外网的服务器作为代理去访问那些只有内网 ip 的服务器.
本地转发: SSH -L LocalPort:remoteHost:remotePort sshHost
注意这里 remoteHost:remotePort 是相对于 sshHost 的地址, 比如 remoteHost 设置为 localhost, 实际就是 sshHost 本地
一般用于无法直连的场景, 比如防火墙, 没有开发公网端口等, 本地不能直接连接 remoteHost, 需要用 sshHost 来做中转.
当时我们公司的一个场景, 我们的服务器一些后台没有开通外网端口, 在公司内部我们需要访问后台, 利用内网的一台服务器 SSH 本地转发到公网服务器, 我们在内网直接访问内网服务器.
远程转发: SSH -R LocalPort:remoteHost:remotePort sshHost
注意这里 remoteHost:remotePort 是相对于 SSH 命令执行的机器的和本地转发不同.
另外注意这个命令执行和机器和本地转发不同. 比如我们有这么个需求, 将服务器 serverA 的 21 端口映射到 client 的 2021.
本地转发: 这时我们在客户机上执行本地转发命令, SSH -L 2021:localhost:21 serverA
远程转发: 则是在服务器上运行, SSH -R 2021:localhsot:21 client,client 指的是我们的客户机, 也就是说 client 需要有 sshServer
上面的本地转发和远程转发很像, 同样的功能命令差在一个参数, 但两者有时候不可相互取代. 本地和远程从数据的出口来记:
本地: 客户端连接 sshServer 将本地的数据转发到本地端口转发出去
远程: 客户端连接 sshServer, 在 sshServer 建立端口, 数据从 sshServer 到本地来
一般用于公网访问局域网的场景. 在局域网的机器建立远程转发让公网的服务器可以访问局域网
xsell 中 菜单 -> 查看 -> 隧道窗格中可以快速创建这三种类型.
ProxyCommand 参数
很多时候线上服务器的权限管理是通过跳板机来控制的, 比如服务器 a,b,c 你不能直接连接, 而是通过先登录跳板机再去连接. 如果你现在想在本地连接服务器, 有如下方案:
在本地使用动态转发, 如
SSH -D 1080 user@host
主机和用户使用的是跳板机, 在 xshell 中新建连接时使用 1080 作为代理, 此时你可以将这个连接认为是跳板机在连, 比如你在连接中填写 localhost, 这个 localhost 到时就是跳板机
在本地使用本地转发, 如
SSH -L 2222:hosta:22 tiaobanHost
, 这时候我们就可以使用 localhost 和 2222 端口在连接服务器 a, 不需要配置代理
远程转发一般不用, 因为服务器不能访问公司的局域网
上面的方法虽然可以实现登录后端服务器, 但是两部操作还是有些不便, 可以使用更方便的 ProxyCommand.
该方法也有两种形式:
- SSH -o ProxyCommand="ssh user@jumpHost -W %h:%p" serverHost
- SSH -o ProxyCommand="nc -x jumpHost:jumpPort %h:%p" serverHost
这个命令如果经常使用可以将 ProxyCommand 写入到 SSH 的配置文件中
现在有三个机器
客户机: 192.168.199.3
跳板机: 192.168.199.6
目标机: 192.168.199.5
第一种执行: SSH -o ProxyCommand="ssh 192.168.199.6 -W %h:%p" 192.168.199.5
客户机进程:
- chen 50607 50529 0 17:52 pts/0 00:00:00 SSH -o ProxyCommand=SSH 192.168.199.6 -W %h:%p 192.168.199.5
- chen 50608 50607 0 17:52 pts/0 00:00:00 SSH 192.168.199.6 -W 192.168.199.5:22
客户机显示的连接:
tcp 0 0 192.168.199.3:34306 192.168.199.6:22 ESTABLISHED 50608/SSH
跳板机显示的连接:
- tcp 0 0 192.168.199.6:36932 192.168.199.5:22 ESTABLISHED -
- tcp 0 0 192.168.199.6:22 192.168.199.3:34306 ESTABLISHED -
目标机显示的连接:
tcp 0 0 192.168.199.5:22 192.168.199.6:36932 ESTABLISHED -
从上面的结果可以看到, 跳板机和两头各建立了一个连接, 另外客户机是 50608 进程占用了这个连接
第二种执行: SSH -o ProxyCommand="nc -x 192.168.199.6:4000 %h %p" 192.168.199.5
注意这种方式需要有个 sock5 代理, 所以跳板机先开启代理: SSH -D 4000 192.168.199.5 -Nfg
nc 支持多种代理, 包活 scok4,sock5 和 http
客户机进程
- chen 51157 50529 0 18:09 pts/0 00:00:00 SSH -o ProxyCommand=nc -x 192.168.199.6:4000 %h %p 192.168.199.5
- chen 51158 51157 0 18:09 pts/0 00:00:00 nc -x 192.168.199.6:4000 192.168.199.5 22
客户机显示的连接
tcp 0 0 192.168.199.3:38866 192.168.199.5:22 ESTABLISHED 51158/nc
目标机显示的连接:
tcp 0 0 192.168.199.5:22 192.168.199.3:38866 ESTABLISHED -
从上面的结果可以看到, nc 方式和 SSH 方式不一样, 并没有跳板机的连接, 这一点让我很不解, 而且在实验过程中发现跳板机没有开启代理也没有报错.
等以后有答案了再补充吧.
三, scp 命令
例子: scp test.txt chen@CentOS:/home/chen/data/
-P 指明端口
-r 递归复制
-i 指明密钥文件
四, rsync 命令
例子: rsync -avuz ~test/ chen@CentOS:/home/chen/data/
rsync 命令和 scp 类似, 主要是采用'rsync'算法只同步不同的文件, 支持压缩传输和断点续传, 一般情况下速度更快. 参数如下:
-t 不更新 modify time
-z 压缩
-P 断点续传功能, 大文件用到
-r 递归传递
-I 强制同步
-a 归档模式并保持所有文件属性, 等价于 - rlptgoD (no -H,-A,-X)
-v 输出传输详情
-u 如果接受者上的文件比传输者的新旧不同步
另外 rsync 还有一种服务器模式, 采用 rsync 服务端和客户端的模型, 需要长期同步文件, 推荐使用这种模式, 这种模式的账号和 Linux 系统账号是分开的, 更加安全.
五, sz 和 rz 命令
这两个命令十分方便, 在 Windows 下使用 xshell 客户端, 如果遇到跳板机这种场景, 需要频繁的穿来穿去, 这两个命令可以自动穿隧道, 十分方便, 命令本省十分简单.
-e 采用二进制传输, 这个非常重要, 有时候在传输可执行文件时
-y 如果存在则覆盖原文件, 默认是生成一个
-o "StrictHostKeyChecking no"
六, SSH-agent
最后说的这个东西是非常有用的, 如果经常使用的 SSH 的肯定会遇到需要用多个私钥的场景和私钥被加密的场景. 如果私钥被加密, 每次连接还是需要输入密码,
当在各个服务器之间穿可能需要多次 id_rsa 密码, 很是繁琐, 另外多个多个主机采用不同的私钥的时候需要指定私钥, SSH-agent 就是用来解决这个问题的.
这个功能需要在 sshd 配置文件中配置 AllowAgentForwarding,SSH 配置文件中配置 ForwardAgent
eval `ssh-agent -s` : 开启 agent, 这里必须使用 eval
SSH-add id_rsa_file: 用来添加密钥, 这里如果不指定文件则添加的是~/.SSH/id_rsa 文件
参考文章
SSH 原理与运用 (一): 远程登录
SSH 原理与运用 (二): 远程操作与端口转发
Linux SSH 命令详解
来源: https://www.cnblogs.com/chenfangzhi/p/10926641.html