SSH多服务器自动分发处理脚本(window版)

一、SSH协议

1.SSH介绍

SSH 为 Secure Shell 的缩写;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。

微软官网对sshd的使用教程:https://learn.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_keymanagement

2.Window下的SSH

注意:下面所讲都是基于这个

http://fred151.net/site/2018/09/23/how-to-install-openssh-on-windows-7-10/
https://github.com/PowerShell/Win32-OpenSSH/releases

进行下载后,将其解压到C:\Program Files\路径下(其他路径也可以),然后用CMD(管理员)或powershell(管理员)运行下面两条命令。

cd “C:\Program Files\OpenSSH”
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

在cmd中使用下面命令:
一般用第一条命令就行;
当自动获取的路径不对时,用第二条命令,path一般:c:\Users\Xing.ssh(.ssh文件夹一定要事先建立)。-t:指定要创建的密钥类型。

ssh-keygen

ssh-keygen -t ras

ssh-keygen -t ras -f path

启动sshd服务

net start sshd

3.关闭防火墙(或白名单处理)

不关闭目标的防火墙,ping不通。

  • 关闭防火墙Dos命令

netsh firewall set opmode disable

  • 打开防火墙Dos命令

netsh firewall set opmode enable

4.SSH相关命令

  • ssh用法
    端口号(默认端口号为22)、用户名、命令都可缺省。此处的命令是指执行服务器端的DOS命令。也可以使用"ipconfig && dir",从而执行两条命令。

ssh [-p port] [Username]@IP [command]
例如:
ssh Xing@192.168.1.2
ssh -p 22 Xing@192.168.1.2
ssh 192.168.1.2
ssh 192.168.1.2@192.168.1.2 “ipconfig”

注意:待输入密码时,直接输入即可。微软鉴于安全问题,不会出现*****,以及光标也不会移动。

  • scp用法

上传文件(夹)(本地端➡服务器端)

scp srcpath username@ip:despath
例如:
scp test\1.txt Xing@192.168.1.2:C\Users\Xing\Desktop\

注意:
srcpath指客户端的文件所处的路径(待上传文件\夹的路径),要使用相对路径(相对于当前dos窗口的地址),不能出现C:\之类的盘符。
despath指服务器端的地址,这里可用绝对地址,能出现C:\盘符。也可用相对地址,相对于用户路径:C:\Users\Xing
despath路径中的文件夹必须存在。

下载文件(夹)(服务器端➡本地端)

scp username@ip:srcpath despath
例如:
scp Xing@192.168.1.2:test.txt .\

注意:
srcpath指的是服务器端的文件路径,指的是用户路径下(C:\Users\Xing),不能出现C:\之类盘符。
despath指的是本地端开启DOS的路径(默认C:\Users\Xing),也不能出现C:\之类盘符。
这里我本地端和服务器端的用户名都是Xing。

二、无密传输(主机、服务器都window版)

1.思路(这篇文章有详细介绍)🔍

本地端使用Dos命令:ssh-keygen,生成一对密钥(公钥和私钥),将公钥rsa.pub的内容发送给服务器.ssh文件下面的authorized_keys文件。

2. 现存问题

Linux下有ssh-copy-id这个指令,但是window下不支持这个指令。

3. 方法

可以用其它方式代替:先用scp命令将本地端的公钥rsa.pub发送到服务器端的.ssh文件下,然后rsa.pub文件重命名(dos指令ren)为authorized_keys。注意上述rsa.pub的后缀为.pub,而文件authorized_keys是没有后缀的。

本地机上运行

scp .\.ssh\id_rsa.pub 192.168.10.130:.\.ssh\

服务器(IP:192.168.10.130)上运行(再改名)

ren .\.ssh\id_rsa.pub authorized_keys

注意:刚开始服务器上没有.ssh文件,可以登录自己(127.0.0.1)

ssh 127.0.0.1

4. 产生新的问题

  1. 情况一:已经发送给服务器公钥了,但仍然需要密码登录,而且还不报错

原因:
配置文件(OpenSSH文件夹下的sshd_config_default文件)的问题(把一些配置注释和取消注释)
同时也要修改C:\ProgramData\ssh\sshd_config。若没有ProgramData,可从上面选项中勾选上隐藏的项目。

应该这样⬇:

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile	.ssh/authorized_keys

#AuthorizedPrincipalsFile none

# For this to work you will also need host keys in %programData%/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
PermitEmptyPasswords yes

# GSSAPI options
#GSSAPIAuthentication no

AllowAgentForwarding yes
AllowTcpForwarding yes
#GatewayPorts no
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem	sftp	sftp-server.exe

# Example of overriding settings on a per-user basis
#Match User anoncvs
#	AllowTcpForwarding no
#	PermitTTY no
#	ForceCommand cvs server

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

参考来源🔍

https://blog.csdn.net/qq_37960007/article/details/119104121

该文档的各个参数解释:http://www.jinbuguo.com/openssh/sshd_config.html
该文档的各个参数解释:https://blog.csdn.net/qq_40907977/article/details/110871536

  1. 情况二:权限问题

在这里插入图片描述

解决方法🔍(这篇有详细说明)

对本地端的公钥文件做权限修改:右键点击rsa.pub(位置:C:\Users\Xing.ss\)➡点击属性➡点击高级➡点击编辑➡只保留一个用户(Xing),其他用户都删去➡访问设置为完全控制,效果如下。

在这里插入图片描述

  1. 情况三:known_hosts文件
    在这里插入图片描述

解决方法🔍

删除对应ip的在known_hosts相关信息

三、自动化脚本

1.前期工作

已配置好多台服务器的ip,各个服务器的ip是连续的且静态的(这里我先用的是虚拟机实现)。
Linux下可使用shell脚本,已有不少博主做过,可搜索到。鉴于服务器是window下的,所以使用Dos命令来编写.bat(批处理)脚本文件。

  • 所涉及命令

for循环
/L指明该for循环是数字等间距;%%i指名字为i的变量;first指数字的初始值;step指数字的步进值;end指数字的结束值。

for /L %%i in (first,step,end) do (
*********内容************
)

Dos变量
%num(%1、%2):指以指令运行.bat文件时,后面跟的第num个变量值。
%vname%:指以set指令定义的常规变量(例如:set vname=hello ,后面使用时:echo %vname% )。
%%i:指for循环中的变量,使用时(echo %%i)。
%~dp0:指Dos的扩充变量,它们是已规定好的,表示某种含义。
if判断
if %i%==5 (Dos指令)else (Dos指令)

2.多服务器分发文件功能

这里已经将各个服务器的ip及对应的映射,加入了hosts文件中。
hosts文件路径:

C:\Windows\System32\drivers\etc

映射表:
在这里插入图片描述
功能:
遍历每台服务器,并发送相同的文件\夹,发送前判断该文件\夹是否存在,存在的话,就删除。

代码解释:
@echo off指不显示回显;
set定义ipfirstname、dpath、filename变量,filename变量接收执行该.bat文件时,所执行命令的后跟的第一个参数。
&& 指前后指令都执行,以达到执行两条命令。
exist 指判断后面路径下文件\夹是否存在,若存在,执行(RD /S /Q %filename%)。
%1 指执行该.bat文件时,所执行命令的后跟的第一个参数。
Pause>nul 中的>,表示重定向为空,以不显示(请按任意键继续)
Pause ,使得dos窗口暂停,而保持出现。

@echo off
set ipfirstname=hadoop
set dpath=C:\
set filename=%1
for /L %%i in (102,1,102) do (
ssh %username%@%ipfirstname%%%i "cd c:\ && if exist %dpath%%filename% (RD /S /Q %filename%)"
scp -r %1 %username%@%ipfirstname%%%i:%dpath%
)
Pause

3.多服务器执行功能

rem,表示注释。
功能:
遍历每台服务器,并执行jar包,待程序执行完后,将程序产生的数据,返回给本地端。

@echo off
set ipfirstname=hadoop
set filename=%1
set outputdatafilename=t_test
for /L %%i in (102,1,102) do (
rem echo %ipfirstname%%%i
ssh %username%@%ipfirstname%%%i "cd C:\%filename%\ && java -jar HLO.jar"
rem 等待程序运行结束后,下面执行从服务器下载到本机数据的命令
cd c:\Users\%username% && scp -r %ipfirstname%%%i:t_test .\Desktop\
)
Pause>nul

存有问题:
只有执行完一台服务器上的java程序后,才执行下一台服务器上的Java程序。这样的话,相当于串行执行,而没有使服务器并行运行。
解决办法1:
java -jar HLO.jar改为javaw -jar HLO.jar,并且再ssh前加入start /b ,最终为:

@echo off
set ipfirstname=hadoop
set filename=%1
set outputdatafilename=t_test
for /L %%i in (102,1,102) do (
rem echo %ipfirstname%%%i
start /b ssh %username%@%ipfirstname%%%i "cd C:\%filename%\ && javaw -jar HLO.jar"
rem 等待程序运行结束后,下面执行从服务器下载到本机数据的命令
cd c:\Users\%username% && scp -r %ipfirstname%%%i:t_test .\Desktop\
)
Pause>nul

解决办法2:
可以使用ssh命令先在服务器上创建个bat文件,将java -jar HLO.jar命令写入到bat文件中,再用ssh命令执行该bat文件。
这样也可以执行多个java -jar XX.jar命令。
位于服务器上的ParaStudy.bat,

@echo off
start /b javaw -jar HLO.jar"
start /b javaw -jar HLO1.jar"
start /b javaw -jar HLO2.jar"
)
Pause>nul

客户机上的分发脚本

@echo off
set filename=kx
set ipfirstname=192.168.10.
for %%i in (62,70,76,81,88,94) do (
rem echo %ipfirstname%%%i
start /b ssh %ipfirstname%%%i "cd C:\%filename%\mul_para\ && ParaStudy "
)
Pause

注意:必须在ssh前加入start /b。否则只能一条一条地执行。
见这篇文章

https://blog.csdn.net/weixin_43868148/article/details/125481836

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值