SSH是一个安全协议,在数据传输时候会把数据包进行加密处理,确保数据安全。SSH服务可以提供远程连接服务器的服务,对传输的数据进行加密,除了ssh,Telnet也可以提供远程连接服务。但是Telnet是明文,监听端口是23,且不支持root用户登录。
本篇文章给大家介绍SSH服务相关内容,包括ssh常用命令、scp命令、ssh验证方式、秘钥认证流程、秘钥远程连接服务器、Windows生成秘钥实现连接Linux、ssh远程执行命令、免交互expect、免交互sshpass。
1、SSH相关命令
ssh有客户端与服务端,这种模式称为C/S架构,ssh客户端支持windows、linux、mac等平台。在ssh客户端中包含ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等程序。
SSH远程登录服务器
1. Linux连接Linux服务器 2. 3. ssh -p22 root@10.0.0.6 4. 5. # -p指定连接远程主机端口,默认22端口可以忽略 6. # @前面为用户名,如果用当前用户连接,可以不指定用户 7. # @后面可以为ip,也可以为用户名,用户名需要做hosts解析
SCP命令
1. # -P 指定端口,默认22端口可不写 scp -P2222 test.txt 172.16.1.31:/opt/ 2. # -r 递归拷贝目录 scp -r koten 172.16.1.31:/root 3. # -p 在拷贝文件前后保持文件或目录属性不变 4. # -l 限制传输使用宽带(默认kb) 5. 6. 推送:scp 本地文件 远端服务器的哪个位置 7. 8. scp test.txt 172.16.1.31:/root/ 9. 10. 拉取:scp 远端服务器的文件,拷贝到本地哪个位置 11. 12. scp 172.16.1.31:/etc/hosts /opt 13. 14. #限速 15. [root@Web01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp 16. root@172.16.1.31 password: 17. test 100% 656MB '83.9MB/s' 00:07 18. #限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB 19. [root@Web01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp 20. root@172.16.1.31s password: 21. test 7% 48MB '1.0MB/s' 09:45 22. 23. 24. 总结: 25. 1、scp通过ssh协议加密方式进行文件或目录的拷贝 26. 2、scp连接时的用户作为拷贝文件或目录的权限 27. 3、scp支持数据的推送和拉取,但是每次都是全量拷贝,效率较低
sftp远程数据传输命令
1. #默认可以通过sftp命令连接sftp服务 2. sftp root@10.0.0.8 3. sftp -oPort=52113 root@10.0.0.8 #sftp的特殊端口连接 4. 5. #sftp使用get下载文件至本地服务器 6. sftp > get conf.txt /tmp/ 7. 8. #sftp使用put上传本地服务器文件至远程服务器 9. sftp > put /root/1.txt /root/
2、SSH验证方式
1、基于验证密码远程登录(不安全,可能会被破解)
1. ssh -p22 root@10.0.0.8 2. root@10.0.0.8 password:
2、基于秘钥远程登录(一般使用这种)
秘钥认证流程
SSH秘钥认证过程相当于自己钥匙开自己锁,钥匙只有客户端有,锁只有服务端有,一般叫做这个为秘钥对。
客户端ssh-keygen生成秘钥对,公钥id_rsa.pub是锁,私钥id_rsa是钥匙
1、客户端发送公钥给服务端(服务端会存放客户端的公钥至如下路径~/.ssh/authorized_keys,默认没有.ssh目录,有的话可能是保存了个known_hosts,是保存了默认yes,有的话远程连接就不用输入yes了)
2、客户端通过ssh协议连接服务端
3、服务端返回公钥询问
4、客户端使用私钥解密
5、秘钥验证通过,即可连接
创建密钥
ssh-keygen -t rsa #生成秘钥对 默认rsa加密 或者ssh-keygen,后面所有参数可以省略,一直回车即可。-t指定秘钥类型,-C koten ,可以在你的秘钥后面加点东西。
查看密钥
1. ll .ssh/id_rsa .ssh/id_rsa.pub #.ssh/id_rsa是钥匙,权限是600, .ssh/id_rsa.pub是锁头 2. 3. 注意:如果可以正常通过秘钥方式远程连接 目录权限以及秘钥对的权限必须正确 4. 5. root权限必须是500,.ssh必须为700,秘钥必须为600,锁头是644,锁头需要看服务器的文件权限 6. 7. 在31服务器查看公钥文件,权限必须是600 8. 9. ll .ssh/ 10. 11. 注意:不适用ssh-copy-id,可以直接复制公钥到31服务器上手动创建authorized_keys,并授权为600权限。 12. 13. 拷贝过后就实现了秘钥方式登录,如果切换到普通用户就不可行了,需要再生成秘钥对 14. 15. 也可以一个客户端的公钥发给好多服务端
推送密钥
1. #分发秘钥,将A服务器的公钥写入B服务器 2. ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.8 3. ssh-copy-id #命令 4. -i #指定下发公钥的路径 5. root #以什么用户身份进行公钥分发,如果不输入,表示以当前系统用户身份分发公钥 6. 10.0.0.8 #下发公钥至那台服务器,填写远程主机IP地址
远程连接测试
1. #远程登录远端主机的方式 2. ssh root@172.16.1.31 #秘钥分发后直接切换主机 3. 4. #不登录远程主机,但可以对远程主机执行命令 5. ssh root@172.16.1.41 "hostname -i" 6. 172.16.1.41 7. 8. ssh 172.16.1.7 '可执行的命令' 里面有单引号,外面就弄成双引号,单引双引都有,就在目标主机上写脚本,远程执行脚本 9. 10. 也可以使用图形化脚本,命令写在底层
3、SSH场景实践
跳板机
用户可以通过Windows、MAC、Linux客户端连接跳板机,实现免密码登录;跳板机连接后端无外网的Linux主机实现远程登录,实现多用户(开发、运维、测试)可以登录单台服务器(跳板机)无密码,单用户(跳板机)登录多台服务器(web、nfs、mysql...)无密码的效果。
windows通过10.0.0.31连接web服务器
NFS(10.0.0.31、172.16.1.31)、web01(172.16.1.7)、web02(172.16.1.8)
1、在NFS生成秘钥对
2、将公钥拷贝到目标主机 7和8 中间需要7和8的服务器密码
3、拷贝好后测试连通性
4、windows通过31跳板机连接7和8,一个主机一个xshell会话,可以通过xshell登录脚本,自动ssh
Xshell生成秘钥对上传到31服务器
1、工具-->新建用户秘钥-->添加-->属性-->公钥-->复制到目标主机~/.ssh/authorized_keys中
禁止root登录,秘钥就会自动弹出来,就是没有输入用户名的界面
NFS先禁止root登录(38行),禁止使用密码(65行),创建koten用户,创建密码,Windows密钥拷贝到NFS的koten用户 su-root 再去连接172.16.1.7或172.16.1.8
SSH安全优化
SSH作为远程连接服务,我们需要考虑该服务的安全,所以需要对该服务进行安全方面的配置
1、更改远程连接登录的端口
2、禁止root管理员直接登录
3、密码认证方式改为秘钥认证
4、重要服务不使用公网IP地址
5、使用防火墙限制来源IP地址
1. [root@Web01 ~]# cat /etc/ssh/sshd_config 2. ###SSH### 3. #Port 6666 # 变更SSH服务远程连接端口 4. #PasswordAuthentication no # 禁止使用密码直接远程登录 5. #PermitRootLogin no # 禁止root用户直接远程登录 6. GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟 7. UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
免交互expect
1. 1、安装expect 2. yum install -y expect 3. 4. 2、编写expect脚本 5. 6. #!/usr/bin/expect 7. set ip 10.0.0.51 8. set pass 123456 9. set timeout 30 10. spawn ssh root@$ip 11. expect { 12. "(yes/no)" {send "yes\r"; exp_continue} 13. "password:" {send "$pass\r"} 14. } 15. expect "root@*" {send "df -h\r"} 16. expect "root@*" {send "exit\r"} 17. expect eof
免交互sshpass
1. 1、安装sshpass 2. yum install -y sshpass 3. 4. 2、sshpass命令 5. sshpass -p 123456 ssh root@10.0.0.51 6. 7. -p:指定密码 8. -f:从文件中取密码 9. -e:从环境变量中取密码 10. -P:设置密码提示
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!