1.SSH服务介绍
1.1 基本介绍
SSH服务是一种古老的基础服务,是一个远程连接Linux和管理Linux的服务。
Secure Shell Protocol 简写SSH,是一个安全的Shell协议,属于TCP/IP协议族。
SSH服务使用的默认端口为22(一台机器的不同功能就用端口区分)。
1.2网络服务对应的端口介绍:
21==>ftp
22==>ssh
23==>telnet
25==>smtp(邮件发送服务)
80==>web(网页服务)
111==>rpcbind
110==>pop3(邮件接收服务)
873==>rsync
3389==>windows远程桌面
2.远程连接服务:
telnet:数据传输是明文的,数据传输依靠交换机和路由器(需要事先配置交换机和路由器)。
telnet ip port命令可以检测端口以及服务是否是畅通的。
ssh协议:是一个安全的Shell协议,在传输过程中数据是加密的。
服务端和客户端称之为c/s架构==>client/server。例如:
超市收银就是用的c/s架构,这个客户端很强大,页面展示都可以在客户端。
游览器/服务器称之为b/s架构==>browser/server(未来互联网发展的大趋势)。例如:
网页服务就是用的b/s架构,内容显示都是服务端控制的。
3.ssh服务端软件介绍:
3.1 软件安装
#rpm查看如果没有的话yum install openssh openssl -y安装
[root@m01 ~]# rpm -qa openssh openssl
openssh-7.4p1-16.el7.x86_64
openssl-1.0.2k-16.el7.x86_64
[root@m01 ~]# ll /etc/ssh/sshd_config #<==ssh服务配置文件
-rw-------. 1 root root 3907 4月 11 2018 /etc/ssh/sshd_config
[root@m01~]# systemctl start sshd
[root@m01~]# systemctl enable sshd
3.2 ssh客户端里含有的命令
[root@m01 ~]# rpm -ql openssh-clients
/usr/bin/scp #<==远程拷贝文件(加密)。
/usr/bin/sftp #<==ftp服务,加密的传输文件。
/usr/bin/ssh #<==远程连接。
/usr/bin/ssh-copy-id #<==拷贝密钥中的公钥文件的。
3.3 ssh客户端命令介绍与实践
ssh -p 22 root@10.0.0.31
命令 -p 端口 用户@IP
上述命令相当于ssh 10.0.0.31
[root@m01 ~]# ssh 10.0.0.7
The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:qZSBkrmOv7xO/63qOU1uLXkPyNVHdkqvrNAcAmXqNEk.
ECDSA key fingerprint is MD5:23:d0:cb:a9:f4:7c:0b:eb:2d:07:00:e1:a3:12:d8:33.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.7' (ECDSA) to the list of known hosts.
root@10.0.0.7's password: #连接需要输入密码
Last login: Thu Apr 18 11:50:33 2019 from 10.0.0.1
[root@m01 ~]# ssh -p 22 [root@10.0.0.7](mailto:root@10.0.0.7)
root@10.0.0.7's password: #<==第二次连接就不需要输入yes了
Last login: Fri Apr 19 21:01:09 2019 from 10.0.0.61
3.4 scp命令:远程拷贝(secure copy),加密的拷贝
q -P 端口
q -r 递归
q -p 保持属性
q -l 限制速度
q 推:scp -P 22 -rp /data root@172.16.1.7:/tmp/
类似rsync远程shell的推送模式:
rsync -avz /data root@172.16.1.7:/opt
rsync -avz /data -e "ssh -p 22" root@172.16.1.7:/opt
q 拉:scp -P 22 -rp root@172.16.1.7:/tmp/data /tmp/
类似rsync远程shell的拉取模式:
rsync -avz root@172.16.1.7:/opt/data /data
3.5 ssh服务配置优化
[root@web01 /]# cat >>/etc/ssh/sshd_config<<EOF
####Start by oldboy#2018-04-26###
PermitEmptyPasswords no #<==禁止空密码登录,C7默认就是
UseDNS no #不使用dns解析,yes改为no
GSSAPIAuthentication no #禁止连接慢的解决配置
#ListenAddress 172.16.1.7:22
####End by oldboy#2018-04-26###
EOF
4.项目实战:
一、借助秘钥文件,实现登录的时候不用密码,可以批量分发文件、批量管理服务方案。
方案一:手动生成
1.服务端生成秘钥对:
[root@m01 ~]# ssh-keygen #<==连续按回车就可以
[root@m01 ~]# ls /root/.ssh -l
总用量 12
-rw------- 1 root root 1679 4月 22 12:12 id_rsa #<==私钥,钥匙。
-rw-r--r-- 1 root root 390 4月 22 12:12 id_rsa.pub #<==公钥,锁。
-rw-r--r-- 1 root root 513 4月 22 11:45 known_hosts
2.将公钥放到需要管理的服务器中
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.7
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.7's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.1.7'"
and check to make sure that only the key(s) you wanted were added.
[root@m01 ~]# ssh 172.16.1.7 "ifconfig eth1"
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.7 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe57:5d16 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:57:5d:16 txqueuelen 1000 (Ethernet)
RX packets 6245 bytes 2873978 (2.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6527 bytes 2306624 (2.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
方案二:脚本执行自动生成秘钥对并发送到需要管理的服务器
[root@m01 /server/scripts]# cat miyao.sh
#!/bin/bash
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
for ip in 7 8 31 41
do
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
[root@m01 /server/scripts]# sh miyao.sh
拓展知识:开发脚本实现批量管理服务器
[root@m01 /server/scripts]# cat viem.sh #<==批量管理脚本
for n in 7 8
do
echo -------172.16.1.$n----------
ssh 172.16.1.$n $1
done
#sh view.sh "cat /etc/redhat-release" 执行脚本并在后面添加需要执行的动作
[root@m01 /server/scripts]# cat fenfa.sh #<==简单批量分发文件脚本
for n in 7 8
do
echo ----------172.16.1.$n--------
scp -P 22 -rp $1 root@172.16.1.$n:$2
done
[root@m01 /server/scripts]# cat fenfa1.sh #<==复杂批量分发文件脚本
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 2 ]
then
echo "usage:$0 localfile remotedir"
exit 1
fi
for n in 31 41 51
do
scp -P 22 -rp $1 root@172.16.1.$n:$2 &>/dev/null
if [ $? -eq 0 ]
then
action "172.16.1.$n successful" /bin/true
else
action "172.16.1.$n failure" /bin/false
fi
done