能完成这个功能,要感谢chinaunix的Shell_HAT哥们。。。

若无他指点,死活我都完成不了。。。

感谢好人一个。。



背景:写一个bat文件,双击后就可以关闭所有的服务器包括linux服务器和windows服务器
        因为公司有这需求,在下班后要关闭所有的服务器。


公司的服务器包括了windows和linux,若是linux或者全身windows就好办了,可以分别写一个shell脚本和bat脚本就可以执行。但现在要做到一个非专业人员可以进行双击bat文件后进行关机。所以最合理的方法就是一键关闭全部器。


so~~就开始琢磨把这两个脚本打通。


百度之,若要打通bat和shell脚本是要借助第三方工具,网上的工具有cygwin和putty两种,其他的我就不清楚了,我选择了putty来做bat和shell脚本的桥梁。


工具已备好,接下来就是造桥工程。


第一步:规划

在连通bat和shell之前要先把windows和windows之间的关系,linux和linux之间的关系打通。

           windows之间用net use 进行连接,linux之间使用ssh进行连接


第二步:打地基

PS:以下所有运行环境都是在超级管理员下运行,省的跳出一些乱七八糟的东西阻碍造桥大计。

windows间可用net use进行测试,查看是否能相连的。

例:net use \\192.168.1.124\ipc$ "123456" /user:"administrator"

    net use  \\ip地址\ipc$ "密码"/user:"用户名"

    这个密码和用户名都是要连接过去那台机子的密码和用户名的

若出现以下提示就证明连接成功

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机


当然万事都是没有这么顺利的。。。

例如。。。

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_02

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_03


像这么些乱七八糟的错误基本就是网络不通啊,ip地址有误,用户名密码有误之类造成的。。。

所以得多多利用度娘、谷姐之类的神器进行解决。

或许有时候可能还会用到以下一些命令

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_04


net use 来查看哪些是存在的

net use \\192.168.1.210\ipc$ /del 用来删除连接


windows的连接方式就是如此。

在你的客户机上用同样的方法去测试需要加入批量关机大军的windows服务器。


linux间通信使用ssh方式来进行。

先进行配置linux间ssh双机互信机制,这样就可以使两机之间通信不需要输入密码进行访问,将密码全部隐藏起来,这样也起到了安全作用。

关于ssh双机信任机制可以我之前的博客上查看

http://alwaysyunwei.blog.51cto.com/3224143/1222601


第三部:架桥

现在linux机器上写一个shell脚本进行批量关机

其中ip.txt存放要批量关机的linux机器ip

当然shutdown_boot.sh应该像下面这样写,而不是图片中的那样,图片中的内容只是我做测试用的。

#!/bin/sh

for ip in `cat ip.txt`

do

ssh $ip <<EOF

echo "{$ip} shutdown now..."

ifconfig

init 0

EOF

done


ssh 192.168.1.216 -p10088<<EOF

echo "shutdown 192.168.1.216 now...."

ifconfig

init 0

EOF

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_05

因为在我的正式环境中216这台机子SSH端口比较特殊,所以单独剥离出来。


桥的一端已搭好,现在搭建另一端,windows下bat脚本来进行windows批量关机

建立一个shutdown.bat文件

写入以下内容


#批量关闭windows机器


net use \\192.168.1.249\ipc$ "12345" /user:"administrator"

shutdown -s -f -t 20 -m \\192.168.1.249


net use \\192.168.1.254\ipc$ "123456" /user:"administrator"

shutdown -s -f -t 20 -m \\192.168.1.254


net use \\192.168.1.210\ipc$ "123456" /user:"administrator"

shutdown -s -f -t 20 -m \\192.168.1.210


桥的另一端也搭好了


最后一步就是把两端连起来

这时候就要请出我们的putty工具

可谷姐、度娘下载一个

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_06


第一次要进行手动连接

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_07

用这个工具进行连接shell脚本所在的那台机子

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_08

填上IP和端口即可。

然后进行连接,会提示输入用户名和密码,登入完后就出现sshhostkeys文件夹

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_09

然后把shutdown.bat文件放入到跟这文件夹同级目录下。

在bat文件添加以下内容


#批量关闭linux机器


D:

cd puttyfile_0.62cn

putty.exe -ssh -pw 123456-m test.sh root@192.168.1.241


简单说下这个语法

putty.ext -ssh -pw 密码 -m  要在linux执行的文件 用户名@IP地址


其中test.sh也是放在sshhostkeys同级目录下,里面写上你要向linux执行的命令


#!/bin/sh


cd /opt/script/shell

#mkdir /tmp/test061502

sh shutdown_boot.sh

#mkdir test06170



最终的结果就是以下内容了

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_10


shutdown.bat

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_11


test.sh

如何使windows下的bat文件调用linux下的shell脚本的方法_putty 批量关机_12


这样就大功告成


第四步:后期工作

按照这个流程可以完成最初的要求,但这样会存在很多的安全问题,密码明码就是一个问题,这个还有待研究看要怎样处理。

另外一个,在这个bat文件中最好加一个时间判断,比如晚上6点后点击执行这个bat文件可以正常运行,其他时间段点击时则出现告警,以防误操作导致关机。


还有其他的等等一些内容需要完善,待以后想到了在 进行补充。



改进一些功能

关于bat文件内容


::批量关闭linux机器


D:

cd puttyfile_0.62cn


PLINK.EXE -ssh -v -pw suselinux root@192.168.1.241 -m test.sh


pause


这样的话就可以看到执行过程


ps:bat文件用::来注释掉行




bat文件升级版=====》》》做时间的判断

当我双机这个shutdown.bat文件后,这bat要自我判断时间是否在18点到24点之间,如果是则执行里面的关机命令,如果不是这个时间段点击这个这个bat文件的话就提示说现在不是关机时间然后退出来

这个是以防万一误操作在上班时间点中了这个文件就蛋疼了。。。。

成型代码

REM Shutdown Windows
set HOUR=%time:~0,2%
if %HOUR% lss 18 (
    echo Bad time to shutdown
    goto :end
)
net use \\192.168.1.249\ipc$ "buguniao" /user:"administrator"
::shutdown -s -f -t 20 -m \\192.168.1.249
net use \\192.168.1.254\ipc$ "dellwindows" /user:"administrator"
::shutdown -s -f -t 20 -m \\192.168.1.254
net use \\192.168.1.210\ipc$ "shangwang" /user:"administrator"
::shutdown -s -f -t 20 -m \\192.168.1.210
net use \\192.168.1.249\ipc$ /del
net use \\192.168.1.254\ipc$ /del
net use \\192.168.1.210\ipc$ /del
REM Shutdown Linux
cd /d D:\puttyfile_0.62cn
PLINK.EXE -ssh -v -pw suselinux root@192.168.1.241 -m test.sh
:end
pause



现在就剩下一个安全问题,明码明文还有待改进。。