SSH 经常使用命令 和 功能 java
1:ssh 远程登录mysql
ssh -p22 root@192.168.6.180sql
ssh 端口 用户名@IPshell
-p指定链接远程主机端口,默认22端口可省略,若是不指定用户名,默认是rootbash
2:scp远程拷贝 (推,拉两种模式)服务器
经常使用参数:ssh
-P 指定端口,默认22端口可不写 -r 表示递归拷贝目录 -p 表示在拷贝文件先后保持文件或目录属性不变 -l 限制传输使用带宽(默认kb)spa
推: 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文件传输blog
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\r"; exp_continue} "password:" {send "$pass\r"} } expect "root@*" {send "df -h\r"} expect "root@*" {send "exit\r"} 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
##############################################################################