ssh客户端
ssh,配置文件:/etc/ssh/ssh_config
在配置文件/etc/ssh/ssh_config中Strict HostKey Checking no 首次登录不显示检查提示。
格式:ssh [user@]host IP地址 [command]
ssh [-l user]host IP地址 [command]
(如果不指定用户,你是哪个用户就连接哪个用户上,后面还可跟命令)
Ssh客户端允许实现对远程系统经验证地加密安全访问
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
下面来看一下ssh的一些选项:
-p port端口号:远程服务器监听的端口
例如:ssh 192.168.10.178 -p 2222 如果将服务器的端口改为2222,再用ssh连接不指定端口(默认是22端口),此时就无法连接,连接时指定端口号就可以连接了。
改端口号:semanage port -a -t ssh_port_t -p tcp 端口号 (如果启用了SELinux策略,改的端口号为非标准端口号,违反了SELinux策略,直接修改配置文件是不可以的,要用这种方法去修改,记得改完之后重启一下sshd服务)
-b 指定源IP来连接服务器
-v:调试模式(连接的时候发现一些错误,可以用-v来排错)
-C:压缩方式
-X: 支持x11转发
xclock命令在centos6上面可以打开小钟表,在centos7上面打不开,现在我用centso7去连接centos6,直接连接上去,执行xclock命令是打不开小钟表的,需要价格-X选项,才能打开
-Y:支持信任x11转发
ForwardX11Trusted yes
-t: 强制伪tty分配
小实验:
如图:假如企业内部有两台机器B,C,其中C是ssh service ,企业内部连接互联网是通过防火墙来连接的,只有B才能连接到C,A不能直接连接C,假如A出差了,在企业外部,现在A想要连接C,怎样连接呢?A可以连接到B,通过B这个跳板再来连接到C ssh -t B(ip地址) ssh C(ip地址)
实验环境:有3台机器A,B,C,这3台机器都在一个网段中。
1)先在C机器上制定防火墙策略,拒绝A机器连接iptables -A INPUT -s 192.168.10.136 -j REJECT
这样A就不能直接连接C了,,B可以连接C,A可以连接B,所以B可以做跳板,让A借助B来连接C
2)ssh -t 192.168.10.135 ssh 192.168.10.178 这样就能连接了,需要输入两次密码
常见的ssh连接问题
在用ssh连接的时候我们会遇到一些问题,接下来介绍一下这些问题和解决这些问题的方案
(1)解决ssh连接较慢的方案
我们在用ssh连接的时候可能会非常慢,可以调整服务器端的配置文件,修改以下两项,重启服务,就能生效,再重启sshd服务,之后再用ssh连接就非常快了
vim /etc/ssh/sshd_config 编辑服务器端的配置文件
然后systemctl restart sshd.service(centos7)或service sshd restart(centos6),重启一下sshd服务,就可以了
(2)去掉ssh第一次连接服务器提示的yes or no?
当某台机器第一次去连接某服务器时,会问你是否要继续连接,yes or no?,敲了yes就会在家目录下的.ssh目录下生成了一个known_hosts文件,这个文件就记录了你所连接的每一台服务器的公钥key(如下图我目前只连接了一个服务器,所以只有一个服务器的公钥key)
下面就来修改配置文件来解决这个问题
vim /etc/ssh/sshd_config
将该项改为no,第一次连接不用提示yes或者no
(3)/etc/ssh中的key不能被破坏
ssh中的key不能被破坏,如果这些key都被删了,ssh服务不能被启动
先关闭了sshd服务,再开启sshd服务,然后就发现启动失败
再把/app/下的key移回来就可以启动成功了。
ssh服务登录验证方式
1.用户/口令
2.基于密钥
1.基于用户名口令登录验证
基于用户和口令登录验证(客户端用服务器的公钥加密密码,再发给服务器,服务器再拿私钥解开密码,验证密码是否正确)
1)客户端发起ssh请求,服务器会把自己的公钥发送给用户
2)用户会根据服务器发来的公钥对密码进行加密
3)加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
2.基于密钥的登录方式
1)首先在客户端生成一对密钥(ssh-keygen)
2)并将客户端的公钥ssh-copy-id 拷贝到服务端
3)当客户端再次发送一个连接请求,包括ip、用户名
4)服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
5)服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6)得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7)服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
基于密钥的认证:
1)在客户端生成密钥对 ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
-t 指定算法 (默认是rsa算法) -P指定私钥的口令,什么都不写就是生成的私钥没有口令 -f 指定私钥文件路径(默认是/root/.ssh/id_rsa)
2)把公钥文件传输至远程服务器对应用户的家目录 ssh-copy-id -i /root/.ssh/id_rsa 192.168.10.107
ssh-copy -i /root/.ssh/id_rsa 192.168.10.107 该命令看似传输的是私钥,其实传输的是公钥,我们来看一下公私钥是什么样的
如下图:我们看到公私钥的内容
在服务器上的家目录下查看一下authorized_keys这个文件是否生成
再来查看一下这个文件authorized_keys
对比一下上面的公私钥的内容,可以发现传输的确实是公钥
3)测试
好了,现在我们开始连接服务器了,如下图,发现直接就能连接上去了,不用输密码
4)在SecureCRT或Xshell实现基于key验证
在SecureCRT工具—>创建公钥—>生成Identity.pub文件
转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:
ssh-keygen-i-f Identity.pub >> .ssh/authorized_keys
5)重设私钥口令:ssh-keygen –p
如果你觉得你的口令不安全,就可以重设私钥口令,我们上面就没有对私钥设口令,这是很不安全的,下面我就给私钥重设口令,如下图,我们可以发现重设私钥密码后,再去连接服务器,就不会那么容易了,需要你输入设定的私钥密码
6)验证代理(authentication agent)保密解密后的密钥
•这样口令就只需要输入一次
•在GNOME中,代理被自动提供给root用户
•否则运行ssh-agent bash
7)钥匙通过命令添加给代理
ssh-add
第六步和第七步合在一起用,我们在管理多台服务器时,你要一个一个的连接,一个一个的输密码,连接上去,这样十分麻烦的,而且效率低下,我们可以基于秘钥登陆的方式,来连接多台服务器,这样你在连接多台服务器时,就不用一个一个的输入每一台服务器的密码了,你只需记住一个私钥密码,连接的时候输入私钥密码,就可以连接多台服务器了,如果你连私钥密码都懒得输入,就可以将第六步和第七步结合在一起使用,如下图,先验证代理,再把私钥密码托管给代理,这样你再去连接其他服务器就不用输入私钥密码了
scp命令–走ssh端口的远程复制命令
scp[options] SRC... DEST/ 源可以有多个
两种方式:可以将远程主机的文件拷到本机上,也可以将本机的文件拷到远程主机
scp[options] [user@]host:/sourcefile /destpath
scp 192.168.10.178:/app/testdir/ /app/linshi
scp[options] /sourcefile [user@]host:/destpath
scp /app/linshi 192.168.10.178:/app/testdir
常用选项:
-C:压缩数据流
-r:递归复制
-p:保持原文件的属性信息
-q:静默模式
-P port:指明remote host 的监听的端口
rsync命令–更聪明的复制
基于ssh和rsh服务实现高效率的远程系统之间复制文件
使用安全的shell连接做为传输方式
•rsync –av/etc server1:/tmp复制目录和目录下文件
•rsync –av/etc/ server1:/tmp只复制目录下文件
如下图:testdir后面不加/,复制testdir目录和目录下文件,加/,只复制testdir目录下的文件,testdir目录文身不复制
比scp更快,只复制不同的文件,若只是想更新变化了的文件,就用rsync
选项:
-n 模拟复制过程(并不真实去复制,只是演示一下复制过程)
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
好了就,今天的内容就到这里,希望对大家能有所帮助