openssh
就是SSHD服务
实现加密的远程连接/传输数据.
openssh-server 服务端 (sshd,/etc/ssh/sshd_config)
openssh-clients客户端命令 scp,ssh
=======================================================================
ssh,常用来远程连接,数据是加密的;
同时还有telnet也可以远程,但数据未加密,在升级openssh服务的时候,启动telnet服务备用即可;
----------------------------------------------------------------------
安装服务
yum install -y telnet-server
# 启动
# systemctl disable telnet.socket
systemctl start telnet.socket
# 本地shell中连接
telnet 10.0.0.61
=======================================================================
Openssh-server配置文件:/etc/ssh/sshd_config
连接加速选项:
UseDNS no:是否开启反向解析:ip-->域名或主机名;
GSSAPIAuthentication no:GSS认证功能关闭;
安全优化选项:
Port 默认是Port 22 端口范围1-65535 推荐1w以上的端口
PermitRootLogin 禁用root用户 远程 登录权限. 默认是yes(可以让root远程登录) (ubt系统中默认是no) 使用建议:先添加普通用户配置sudo权限,然后再禁用.
ListenAddress 监听的地址(后面需要指定本地网卡的ip地址) 可以控制用户只能通过内网访问,应用建议:一般配合着堡垒机,vpn。
----------------------------------------------------------------------
ListenAddress 0.0.0.0:52113 #表示ssh都可以使用52113 无论局域网还是公网
ListenAddress 172.16.1.61:22 #表示ssh只有在172.16.1.61 局域网可以使用22端口
----------------------------------------------------------------------
ssh root@172.16.1.61
ssh -p 52113 root@10.0.0.61
=======================================================================
Openssh-Clients客户端命令
scp 远程传输文件
ssh 远程连接
sftp 远程传输文件(一般开发通过图形化界面使用ftp工具)
----------------------------------------------------------------------
scp 文件/目录 用户名@ip:路径
-r 递归传输,传输目录
-p 保持属性信息不变
-P(大写) 指定端口号
scp -rp -P 22 /etc/hostname root@10.0.0.41:/tmp/
----------------------------------------------------------------------
ssh
功能:
1. 远程连接.
2. 远程连接并执行命令或脚本.(不要执行交互式命令)
案例一:
ssh -p 22 root@10.0.0.41
案例02: 使用root用户远程连接到10.0.0.41的22端口并执行whoami命令或ip a 命令
ssh -p 22 root@10.0.0.41 whoami
案例03: 远程连接10.0.0.31节点并执行多条命令:whoami , pwd, hostname命令
ssh -p22 nfs01 "whoami ՎҐ pwd ՎҐ hostname -I "
ssh -p22 nfs01 "whoami ; pwd ; hostname -I "
注:&& 并且,命令行中表示前一个命令执行成功再执行后面的命令.
; 分号,分隔命令.相当于是1行的结束.
----------------------------------------------------------------------
sftp
ftp文件传输协议,服务和客户端,服务端端口是21和20.
openssh (sshd)也提供了,ftp功能,sftp,端口是22.
ftp客户端:常用sftp命令,软件xftp,winscp....
注:如果上传大文件建议使用ftp或scp
=======================================================================
SSH的免密登录:
理论基础:
在一些使用场景,比如,用脚本向不同主机发送文件等,需要ssh功能,但ssh登录默认是一种交互式的使用,这就给批量任务带来了阻碍;
使用免密登录,就能解决这种需求场景,这种方式是基于密钥的认证登录,双机互信,具体介绍如下:
首先,假定一个server,是被管理对象,一个管理者,这二者需要密免通信;
在管理端,能过命令生成密钥对,其中一个是私钥,一个是公钥,要通过网络将公钥传输给server(被管理者);
传输过程可以简单理解为:管理端发送指令到server,server将回应消息通过公钥加密,回传给管理端,管理端通过私钥处理后的消息再回传给server,server认证通过这些消息,双方便基于这次公私钥的传输而互信了,可以免密登录并传输数据了。
私钥:private key ,没有特殊结尾;
公钥:public key,一般以.pub结尾;
------------------------------------------
实验:
此次通过4台虚拟机实验,分别是管理机:m01,和被管理机:nfs01/web01/backup
前提准备:各虚机环境为CentOS7.9,且可以远程22端口;
m01 ~]# ping nfs01 //测试连通的方法一,前台是本机/etc/hosts文件有对nfs01的解析
m01 ~]# nmap -p22 172.16.1.31 172.16.1.7 //测试方法二,用nmap方法扫描端口
------------------------------------------
接下来,在m01机器上创建密钥对
m01 ~]# ssh-keygen -t rsa //这里解释一下,这是通过rsa方式加密,其中选项-t也可以不加的
//这个命令输入后,是一个交互式的生成密钥的方法,第一个需要处理的是让你确认保存目录,默认回车即可,第二个是输入加密的字符,默认回车也可以,
[root@m01 ~]# ll -a /root/.ssh/
//检查一下生成的文件,其中一个私钥,自用,一个公钥,控制哪个server,就给哪个server分发
-rw------- 1 root root 1675 Feb 3 14:49 id_rsa
-rw-r--r-- 1 root root 397 Feb 3 14:49 id_rsa.pub
------------------------------------------
//下面是分发公钥的命令
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.41
//输入命令后,如果第一次分发,也是进入交互模式,第一次输入yes同意,第二次输入172.16.1.41主机的密码,成功后会自动到对端生成/root/.ssh/authorized_keys文件
------------------------------------------
至此,免密钥登录完成,可以连接测试
[root@m01 ~]# ssh root@172.16.1.41 w //ssh连接后跟命令,直接执行一次再退出登录
------------------------------------------
小结,免密登录,一生生成密钥对命令,一条分发命令,搞定,涉及四个文件:
本端:
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
对端:
/root/.ssh/authorized_keys
这三个文件没了,就不能免密登录了;
注:管理端只用生成一次就可以了,想免密登谁,就给谁发公钥,每给一个server发送一次免密登录,/root/.ssh/known_hosts就会记录一台主机的信息,公钥一次生成多次有效;
====================================================================
实验进阶:
在实验中,有两处交互式的命令,这里也可以改进,用无交互式的方式操作:
无交互式生成密钥对:
[root@m01 ~]# ssh-keygen -f ~/.ssh/id_rsa -P ''
[root@m01 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
//注,参数-f,是file,指定生成文件位置,-P,密码短语,设置为空
------------------------------------------
无交互式自动分发:需借助工具sshpass
[root@m01 ~]# yum -y install sshpass
#sshpass命令的基本使用:-p指定密码,例
[root@m01 ~]# ssh 172.16.1.6 w #检查是否需要输入密码,然后用下面的方式
[root@m01 ~]# sshpass -p1 ssh 172.16.1.6 w
#使用sshpass 与ssh-copy-id分发公钥
第1次连接的时候提示yes/no
解决思路: 临时取消即可,连接的时候不检查主机信息.
-o StrictHostKeyChecking=no 临时不检查主机信息.
[root@m01 ~]# sshpass -p1 ssh-copy-id -i ~/.ssh/id_rsa.pub -oStrictHostKeyChecking=no 172.16.1.31
------------------------------------------
至此,本机可以无交互的生成密钥对并分发管理主机了,下面写一下脚本自动运行:
[root@m01 ~]# cat /server/script/fenfaSSH.sh
#!/bin/bash
# author: mclind
# desc: this sh will fen fa rsa dao ge ge zhu ji
#1、变量
pass=1
ips="172.16.1.31 172.16.1.41"
. /etc/init.d/functions
#2、判断是否联网以及是否安装sshpass
echo "正在检查是否联网..."
ping -c10 www.qq.com >>/var/log/fenfa.log 2>&1
if [ $? -eq 1 ];then
echo "联网失败"
else
echo "联网成功"
echo "正在检查是否安装sshpass..."
which sshpass >>/var/log/fenfa.log 2>&1
if [ $? -eq 0 ];then
echo "sshpass已安装"
else
echo "正在安装sshpass..."
yum install -y sshpass >>/var/log/fenfa.log 2>&1
which sshpass >>/var/log/fenfa.log 2>&1
if [ $? -eq 0 ];then
echo "sshpass安装成功"
else
echo "sshpass安装失败"
fi
fi
fi
#3、创建密钥对
echo "正在检查是否存在密钥对..."
if [ -f ~/.ssh/id_rsa ];then
echo "密钥对已存在"
else
echo "正在创建秘钥对...."
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' >>/var/log/fenfa.log 2>&1
if [ $? -eq 0 ];then
action "密钥创建成功" /bin/true
else
action "密钥创建失败" /bin/false
fi
fi
#3.通过循环发送公钥
echo "分发原始公钥中..."
for ip in $ips
do
sshpass -p${pass} ssh-copy-id -i ~/.ssh/id_rsa.pub -oStrictHostKeyChecking=no $ip >>/var/log/fenfa.log 2>&1
if [ $? -eq 0 ];then
action "$ip 公钥分发 成功" /bin/true
else
action "$ip 公钥分发 失败" /bin/false
fi
done
至此,脚本完。本次实验完。
===============================================================================================