zoukankan      html  css  js  c++  java
  • 01 :ssh管理和批量推key

    SSH 常用命令 和 功能

    1:ssh 远程登陆

    ssh -p22 root@192.168.6.180

    ssh 端口 用户名@IP

    -p指定连接远程主机端口,默认22端口可省略,如果不指定用户名,默认是root

    2:scp远程拷贝 (推,拉两种模式)

    常用参数:

    -P 指定端口,默认22端口可不写 -r 表示递归拷贝目录 -p 表示在拷贝文件前后保持文件或目录属性不变 -l 限制传输使用带宽(默认kb)

    推: scp -P22 -rp /tmp/1.txt oldboy@10.0.0.61:/tmp
    
    拉: scp -P22 -rp root@192.168.6.180:/tmp/1.txt /tmp/
    
     
    

      

    3:sftp文件传输

    xshell或者CRT,默认可以通过sftp命令连接sftp服务

    sftp root@10.0.0.61  

    -oPort=可以指定端口(ssh)

    sftp -oPort=888 root@192.168.6.180 

    sftp使用get下载文件至于本地服务器

    sftp> get conf.txt /tmp/

    sftp使用put上传本地服务器文件至远程服务器

    sftp> put /root/t1.txt /root/

    4:ssh-copy-id秘钥分发

    1:需要先生成密钥。ssh-keygen -t rsa 一路回车

     

    id_rsa私钥,id_rsa.pub的是公钥

     

    2.将180服务器上的公钥推送至181服务器

    [root@mysql80 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@182.168.6.181

    3.使用ssh 180服务器连接181服务器是无需密码的,如果能直接连接无需密码则表示秘钥已配置成功

    [root@mysql80 ~]#ssh root@182.168.6.181 

    不登陆远程主机bash,但可在对端主机执行命令

    [root@mysql80 ~]# ssh root@182.168.6.181 "cat /etc/passwd"

    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    ........

    SSH 参数调优:/etc/ssh/sshd_config

    一般调整的参数:

    Port 6666 # 变更SSH服务远程连接端口 PermitRootLogin no # 禁止root用户直接远程登录 PasswordAuthentication no # 禁止使用密码直接远程登录 UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数 GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟

    -------------------------------------------------------------------------

    批量推key(公钥):

    假如公司有几百台服务器,想通过一台服务器ssh 连上去管理,我们就需要使用ssh-copy-id把公钥推到对方的服务器上面,但是每次都需要手动的输入"yes" 和 root 用户密码,会很繁琐。

    之前我们常用的方法是通过expect免交互写个脚本,一次性批量推送公钥。

    免交互expect

    [root@mysql80 ~]# yum install -y expect

    2.编写expect脚本

    #!/usr/bin/expect
    
    set ip 192.168.6.181
    
    set pass 123456
    
    set timeout 30
    
    spawn ssh root@$ip/可以替换成ssh-copy-id推key 
    
    expect {
    
               "(yes/no)" {send "yes
    "; exp_continue}
    
                "password:" {send "$pass
    "}
    
     }
    
    expect "root@*" {send "df -h
    "}
    
    expect "root@*" {send "exit
    "} expect eof
    

      

    我们会发现expect语法很难记住,也不方便。所以可以直接pass掉,下面使用sshpass命令来批量推key

     免交互sshpass

    1.安装sshpass

    [root@m01 ~]# yum install -y sshpass
    

      

    2.使用sshpass命令

    [root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51
    

      

    -p:指定密码 -f:从文件中取密码 -e:从环境变量中取密码 -P:设置密码提示

    -------------------------------------------------------------------------

    下面是我工作中写的两个版本的批量推key脚本:

    #!/bin/bash
    
    # date 2019-8-15
    
    # key add 
    
    #ansible - 主机清
    

      

    单获取ip

    #q=`ansible $1 --list-host |grep -v "host"` &>/dev/null
    
    #自定义ip文件
    
    q=`cat $1`
    
    root_name=root
    
    #passwd_root=(xx1 xx2 ... xx100)
    
    passwd_root=(12345 123213) #如果有多个root密码,写用空格隔开
    
     
    
    >/tmp/ipok.txt
    
    >/tmp/ipfalse.txt
    
     
    
    for ip in $q
    
    do
    
    for x in ${passwd_root[@]}
    
    do
    
    #echo "$passwd_root"
    
    sshpass -p "$x" ssh $root_name@$ip -o StrictHostKeyChecking=no "lsattr /root/.ssh/authorized_keys" 2>/dev/null |awk '{print $1}' |grep i &>/dev/null
    
    if [ $? -eq 0 ];then
    
    sudo sshpass -p "$x" sudo ssh $root_name@$ip chattr -i /root/.ssh/authorized_keys &>/dev/null
    
    [ $? -eq 0 ] && echo "$ip chattr ---ok"
    
    sudo sshpass -p "$x" sudo ssh-copy-id -i /root/.ssh/id_rsa.pub $root_name@$ip &>/dev/null
    
    if [ $? -eq 0 ];then
    
    echo "$ip ---1 ok"
    
    echo "$ip" >>/tmp/ipok.txt
    
    sed -i "/$ip/d" /tmp/ipfalse.txt
    
    break
    
    else
    
    echo "$ip ---1 false"
    
    echo "$ip" >>/tmp/ipfalse.txt
    
    fi
    
    else
    
    sudo sshpass -p "$x" sudo ssh-copy-id -i /root/.ssh/id_rsa.pub $root_name@$ip &>/dev/null
    
    if [ $? -eq 0 ];then
    
    echo "$ip ---2 ok"
    
    echo "$ip" >>/tmp/ipok.txt
    
    sed -i "/$ip/d" /tmp/ipfalse.txt
    
    break
    
    else
    
    echo "$ip ---2 false"
    
    echo "$ip" >>/tmp/ipfalse.txt
    
    fi
    
    fi
    
    done
    
    done
    
     
    
    -------------------------------------------------------------------------
    

      

    还有一种更简单暴力的:

    #!/bin/bash
    
    # date 2019-8-15
    
    # key add
    
     
    

      

    #ansible - 主机清单获取ip
    
    #q=`ansible $1 --list-host |grep -v "host"` &>/dev/null
    
    #自定义ip文件
    
    q=`cat $2`
    
    root_name=root
    
    #passwd_root=(xx1 xx2 ... xx100)
    
    passwd_root=(12345 123213) #如果有多个root密码,写用空格隔开
    
     
    
    root_rsa=`cat /root/.ssh/id_rsa.pub`
    
    >/tmp/ipok_"$1".txt
    
    >/tmp/ipfalse_"$1".txt
    
     
    
    for ip in $q
    
    do
    
    for x in ${passwd_root[@]}
    
    do
    
    #echo "$passwd_root"
    
    sshpass -p "$x" ssh $root_name@$ip -o StrictHostKeyChecking=no "mkdir -p /root/.ssh;chmod 700 /root/.ssh" &>/dev/null
    
    sshpass -p "$x" ssh $root_name@$ip -o StrictHostKeyChecking=no "chattr -i /root/.ssh/authorized_keys" &>/dev/null
    
    sshpass -p "$x" ssh $root_name@$ip -o StrictHostKeyChecking=no "echo ${root_rsa} >>/root/.ssh/authorized_keys;chmod 600 /root/.ssh/authorized_keys" &>/dev/null
    
    if [ $? -eq 0 ];then
    
    echo "$ip ---1 ok"
    
    echo "$ip" >>/tmp/ipok_"$1".txt
    
    sed -i "/$ip/d" /tmp/ipfalse_"$1".txt
    
    break
    
    else
    
    echo "$ip ---2 false"
    
    echo "$ip" >>/tmp/ipfalse_"$1".txt
    
    fi
    
    done
    
    done
    

      

    ##############################################################################

    运维
  • 相关阅读:
    嵌入式硬件设计时所需考虑的几个问题
    MySQL网络配置
    MySQL数据库操作技术大全
    关于硬件芯片未用引脚的处理方法
    与嵌入式软件开发相关的一些硬件知识
    C语言-联合(union)
    AtCoder Regular Contest 101 D
    AtCoder Regular Contest 101 C
    AtCoder Regular Contest 102 C
    线性基学习
  • 原文地址:https://www.cnblogs.com/jim-xu/p/11437524.html
Copyright © 2011-2022 走看看