SSH 为 Secure Shell 的缩写;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。
2.Window下的SSH-
Win10自带
开始 → 设置 → 应用 →可选功能,在“添加功能”里搜索OpenSSH,并安装。
-
下载OpenSSH(这篇文章有详细步骤)
http://fred151.net/site/2018/09/23/how-to-install-openssh-on-windows-7-10/
进行下载后,将其解压到C:Program Files路径下(其他路径也可以),然后用CMD运行下面两条命令。
3.关闭防火墙(或白名单处理)cd “C:Program FilesOpenSSH”
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
不关闭目标的防火墙,ping不通。
- 关闭防火墙Dos命令
netsh firewall set opmode disable
- 打开防火墙Dos命令
4.SSH相关命令netsh firewall set opmode enable
- 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 test1.txt Xing@192.168.1.2:CUsersXingDesktop
注意:
srcpath指客户端的文件所处的路径(待上传文件夹的路径),要使用相对路径(相对于当前dos窗口的地址),不能出现C:之类的盘符。
despath指服务器端的地址,这里可用绝对地址,能出现C:盘符。也可用相对地址,相对于用户路径:C:UsersXing
despath路径中的文件夹必须存在。
下载文件(夹)(服务器端➡本地端)
scp username@ip:srcpath despath
例如:
scp Xing@192.168.1.2:test.txt .
注意:
srcpath指的是服务器端的文件路径,指的是用户路径下(C:UsersXing),不能出现C:之类盘符。
despath指的是本地端开启DOS的路径(默认C:UsersXing),也不能出现C:之类盘符。
这里我本地端和服务器端的用户名都是Xing。
本地端使用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是没有后缀的。
4. 产生新的问题- 权限问题
- 解决方法(这篇有详细说明)
对本地端的公钥文件做权限修改:右键点击rsa.pub(位置:C:UsersXing.ss)➡点击属性➡点击高级➡点击编辑➡只保留一个用户(Xing),其他用户都删去➡访问设置为完全控制,效果如下。
三、自动化脚本 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指令)
这里已经将各个服务器的ip及对应的映射,加入了hosts文件中。
hosts文件路径:
C:WindowsSystem32driversetc
映射表:
功能:
遍历每台服务器,并发送相同的文件夹,发送前判断该文件夹是否存在,存在的话,就删除。
代码解释:
@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>nul3.多服务器执行功能
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程序。这样的话,相当于串行执行,而没有使服务器并行运行。



