ssh远程管理

ssh远程管理

1.远程连接

Linux:
	ssh 端口:22   加密传输数据
	telnet 端口 23 明文传输数据
Windows:
	rdp(remote desktop protocol) 端口 3389 

2.抓包演示

Telnet数据明文传输

ssh密文传输

3.企业面试题

# 服务对应的端口号
	ftp     21
	ssh     22
	telnet  23
	dns     53
	mysql   3306
	http    80
	https   443
	rsync   873

4.ssh相关命令及选项

1.ssh:远程连接Linux服务器
	选项
		-p(port):指定端口

不连接服务器,直接执行命令:
	语法:
		ssh 用户@主机地址 '命令'
# 不加用户@,默认使用当前登录的用户

scp:远程拷贝命令
	选项
		-r:递归传输文件
		-p:拷贝时保持文件的属性
		-P:大写P指定端口
	语法:
		推:scp 源文件 用户@主机ip:目标路径
		拉:scp 用户@主机ip:源文件 目标路径

# 结论
	1.scp通过ssh协议加密方法进行文件拷贝
	2.scp连接时的用户会作为拷贝文件的属主和属组(可以使用-p保存文件属性)
	3.scp支持数据的推和拉,每次都是全量拷贝,效率低

5.ssh免密连接

  • ssh密钥对认证流程
1.使用ssh-keygen命令生成密钥对:
	[root@m01 ~]# ssh-keygen 
    Generating public/private rsa key pair.
    ## 密钥保存到文件的路径
    Enter file in which to save the key (/root/.ssh/id_rsa):
    ## 给密钥设置密码
    Enter passphrase (empty for no passphrase): 
    ## 重复输入设置的密码
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
## 这三行都可以不用设置,直接回车
[root@m01 ~]# ll /root/.ssh/
total 8
-rw-------. 1 root root 1675 May 24 16:10 id_rsa
-rw-r--r--. 1 root root  390 May 24 16:10 id_rsa.pub
2.将公钥发送给其他主机:ssh-copy-id
	选项
		-i:指定公钥位置

3.传输完成后,会多出一个文件,这个文件里面记录着连接过的服务器,如果是第一次连接,则需要输入yes,如果有在里面记录,则直接连接

6.免密的过程

1.生成密钥对:ssh-keygen
	1.在当前用户的家目录下创建了一个隐藏文件 .ssh   (mkdir /.ssh)
	2.将密钥对存放的目录授权为700   (chmod 700 ~/.ssh)
	3.将公钥的内容写入到 ~/.ssh/id_rsa.pub文件里
	4.将私钥的内容写入到~/.ssh/id_rsa文件里
	5.将私钥文件授权为600      (chmod 600 ~/.ssh/id_rsa)
2.发送公钥:ssh-copy-id
	1.在远端指定用户的家目录下创建了一个隐藏目录 ( ssh 用户@主机IP 'mkdir ~/.ssh')
	2.将密钥对的存放目录授权为700 ( ssh 用户@主机IP 'chmod 700 ~/.ssh')
	3.在远端.ssh目录下创建一个存放公钥的文件  ( ssh 用户@主机IP 'touch ~/.ssh/authorized_keys')
	4.将该文件授权为600  ( ssh 用户@主机IP 'chmod 600 ~/.ssh/authorized_keys')
	5.将公钥内容,保存到该文件中  (ssh 用户@主机IP 'ehco 公钥内容' >> ~/.ssh/authorized_keys)

6.免密使用场景

1.批量查看服务器的信息
	编写脚本
	[root@m01 ~]# vim a.sh

    #!/bin/bash[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1  
    for i in  7 31 41
    do 
            echo "#########172.16.1.$i########" 
            ssh root@172.16.1.$i "$1" 
    done

2.可以用做跳板机
	编写脚本
	[root@m01 ~]# cat jump.sh 
    lb01=172.16.1.5
    lb02=172.16.1.6
    web01=172.16.1.7
    web02=172.16.1.8
    web03=172.16.1.9
    nfs=172.16.1.31
    backup=172.16.1.41
    db01=172.16.1.51
    m01=172.16.1.61
    zabbix=172.16.1.71

    menu(){
            cat <<-EOF
            +-------------------------+
            |     1) lb01             |
            |     2) lb02             |
            |     3) web01            |
            |     4) web02            |
            |     5) web03            |
            |     6) nfs              |
            |     7) backup           |
            |     8) db01             |
            |     9) m01              |
            |     10) zabbix          |
            |     h) help             |
            +-------------------------+
    EOF
    }
    #菜单函数
    menu

    #连接函数
    connect(){
      ping -c 1 -w 1 $1 &>/dev/null
      if [ $? -eq 0 ];then
        ssh root@$1
      else
        echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
      fi
    }

    #控制不让输入ctrl+c,z
    trap "" HUP INT TSTP
    while true
    do
        read -p "请输入要连接的主机编号:" num
        case $num in
                1|lb01)
                  connect $lb01 lb01
                        ;;
                2|lb02)
                  connect $lb02 lb02
                        ;;
                3|web01)
                  connect $web01 web01
                        ;;
                4|web02)
                  connect $web02 web02
                        ;;
                5|web03)
                      connect $web03 web03
                        ;;
                6|nfs)
                  connect $nfs nfs
                        ;;
                7|backup)
                      connect $backup backup
                        ;;
                8|db01)
                       connect $db01 db01
                        ;;
                9|m01)
                        connect $m01 m01
                        ;;
                10|zabbix)
                        connect $zabbix zabbix
                        ;;
                h|help)
                        clear
                        menu
                        ;;
                close)
                        break
                        ;;
        esac
    done

7.ssh安全优化

1.创建普通用户
	[root@m01 ~]# id jl
	uid=1000(jl) gid=10(wheel) groups=10(wheel)
2.在windows生成密钥对
	使用windiws的命令行执行
	使用xshell
3.使用xshell生成密钥对

4.生成密钥对后,在用户的家目录下创建.shh目录
	mkdir ~/.ssh
5.将该目录授权为700
	[jl@m01 ~]# chmod 700 .ssh/
    [jl@m01 ~]# ll .ssh -d
    drwx------. 2 root root 6 May 24 17:13 .ssh
6.将生成的公钥写入到~/.ssh/authorized.keys中
	[jl@m01 ~]# vim ~/.ssh/authorized_keys

      1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1tRIZp+5MeD5My5RqYj5jTv5qF36y+tvNvfDjpf9sGGwF3I86j/dirKY7d    YCnzbaom4SK2X3k3wxAYyujVVWOzAhU5cwlPknU5549KiKQkK65bmnvXIloFAD9JjI/UowORI/XdqjHqG19F4D9iEhff/1    lJB/4O8PWsPLVU7+3maaKMQ39LDoxqxhcR5OdJ0J8pvpkBFo4xZA80FqJKfSq62XL7XzjsW+n/3hvQ7L0djbf4jfw77vIU    fBOyqt6oGMdIn4Kd/FAwFALT9hE4v2Jn1zbId5G7lrJGW7ST1AmTveNlhvsi8/0dhMb1YrR4OX9N/h3Udf1ixlwjgsZHBy    aw==
6.将该文件授权为600
    [jl@m01 ~]# chmod 600 ~/.ssh/authorized_keys 
    [jl@m01 ~]# ll ~/.ssh/authorized_keys 
    -rw-------. 1 root root 381 May 24 17:17 /root/.ssh/authorized_keys
7.优化ssh的配置文件
	17 Port 29   ## 修改默认端口
	38 PermitRootLogin no ## 禁止root用户直接远程登录
	65 PasswordAuthentication no  ## 禁止使用密码直接远程登录
	79 GSSAPIAuthentication no  ## 关闭GSSAPI认证
	115 UseDNS no  ## 关闭反向解析
	或将以下内容直接复制到文件的最后一行
		Port 29 # 变更SSH服务远程连接端口
		PermitRootLogin no # 禁止root用户直接远程登录 
		PasswordAuthentication no # 禁止使用密码直接远程登录 
		UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数 
		GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟
8.重启服务
	systemctl restart sshd
9.修改这台主机的属性

8.免交互生成密钥对

编写脚本
	1.使用expect解决
		安装expect:yum install -y expect
		[root@m01 ~]# cat expe.sh 
    #!/usr/bin/expect 
    set ip 172.16.1.31 
    set pass 1 
    set timeout 30 
    spawn ssh-keygen 
    expect {
        "id_rsa):" {send "\r"; exp_continue} 
        "passphrase):" {send "\r"; exp_continue} 
        "again:" {send "\r"} 
    }
    expect eof 
    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip 
    expect {
        "(yes/no)" {send "yes\r"; exp_continue} 
        "password:" {send "$pass\r"}
    }
    #expect "root@*" {send "df -h\r"} 
    #expect "root@*" {send "exit\r"} 
    expect eof
	2.使用sshpass解决
		安装 install -y sshpass
		   [root@m01 ~]# cat send_pub_key.sh 
            # !/bin/bash
            . /etc/init.d/functions
            ls -l ~/.ssh/id_sra &>/dev/null|| ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
            for ip in 7 31 41;do
                sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@172.16.1.$ip &>/dev/null
                if [ $? -eq 0 ];then
                    action "172.16.1.$ip send public key " /bin/true
                else
                    action "172.16.1.$ip send public key " /bin/false
                fi
            done
## ssh-keygen的选项
	-t:指定加密类型
	-P:设置为空密码
	-f:密钥生成的位置

posted on 2022-05-24 18:57  jilei  阅读(155)  评论(0)    收藏  举报