当我们需要通过脚本(Windows下)自动发布程序(服务)文件到Linux服务器上时,putty工具包中的plink与pscp则是我们所需的利器。
putty工具
putty是一个跨平台的远程登录工具,包括一组程序:
- putty:Telnet和SSH客户端连接工具,方便远程连接Linux服务器;
- pscp:scp客户端,命令行下通过SSH拷贝文件;
- psftp:SFTP的命令行客户端,类似FTP的文件传输,但是使用的是SSH的22端口;
- plink:命令行工具,可远程执行Linux服务器上的命令;
plink
plink便于执行自动化的命令和工作。可以在命令行制定好要执行的命令,然后执行,完成后自动关闭session。plink [options] [user@]host [command]
- -batch:关闭所有交互提示,脚本执行时非常有用;
- -m file:执行命令较多时,把命令保存在文件中,指定文件;
- -P:(大写)指定连接的端口;
- -pw:指定用户密码;
plink -batch root@192.168.1.2 -pw abcd1234 date
pscp
pscp可实现命令行下文件的上传与下载。pscp [options] [user@]host:source target
下载pscp [options] source [source...] [user@]host:target
上传pscp [options] -ls user@host:filespec
显示文件列表
- -batch:关闭所有交互提示,脚本执行时非常有用;
- -p:(小写)拷贝文件时,保留源文件建立的时间;
- -P:(大写)指定连接的端口;
- -pw:指定用户密码;
- -r:拷贝整个目录;
- -v:拷贝文件时,显示提示信息;
pscp -pw abcd1234 test.txt root@192.168.1.2:/data/mydir/
自动发布文件
为能自动发布文件到Linux服务器(以MyTest.WebService服务为例),需要:
- 在服务器上查找对应的服务,并停止;
- 上传文件到服务器上;
- 启动服务;
启动与停止服务的脚本放在Linux服务,由发布脚本调用。
启动服务脚本
对于jar包服务,只需通过java命令启动即可;启动后(等待1s,sleep 1),查看对应服务是否存在,若存在则启动成功。
#!/bin/bash
DIR=$1
if [ -z $DIR ]; then
DIR=p80
echo "Use default Dir: $DIR"
fi
FILE=$2
if [ -z $FILE ]; then
FILE=MyTest.WebService-1.0-SNAPSHOT.jar
echo "Use default File: $FILE"
fi
FULL=$(cd `dirname $0`; cd $DIR; pwd)
cd $FULL
FULL=$FULL/$FILE
echo "To run: $FULL"
nohup java -jar $FULL >> RTCWeb-run.log 2>&1 &
sleep 1
PID=$(ps -ef | grep $FULL | grep -v grep | grep -v stopWebService | awk '{print $2}')
if [[ $PID -ne 0 ]]; then
echo "SUCCESS run as: $PID"
else
echo "!!! ERROR: run $FILE fail"
exit
fi
停止服务脚本
通过ps与grep查找到对应的服务信息,然后通过awk提前对应的进程ID;若获取成功,则通过Kill命令停止服务。
#!/bin/bash
DIR=$1
if [ -z $DIR ]; then
DIR=p80
echo "Use default Dir: $DIR"
fi
FILE=$2
if [ -z $FILE ]; then
FILE=MyTest.WebService-1.0-SNAPSHOT.jar
echo "Use default File: $FILE"
fi
FULL=$DIR/$FILE
echo "To find: $FULL"
PID=$(ps -ef | grep $FULL | grep -v grep | grep -v stopWebService | awk '{print $2}')
if [[ $PID -ne 0 ]]; then
echo "ProcessId: $PID"
else
echo "Process not found"
exit
fi
echo "Kill now"
kill -9 $PID
发布脚本
先停止服务,后通过pscp把文件上传到对应位置后,再启动服务。
@echo OFF
set IP=%~1
set FILE=%~2
set DIR=%~3
if "%IP%"=="" (set IP=192.168.1.129)
if not defined FILE (set FILE=MyTest.WebService-1.0-SNAPSHOT.jar)
if not defined DIR (set DIR=p80)
set FULL=%DIR%/%FILE%
echo Server: %IP%
echo File: %FULL%
echo=
echo To kill %FULL% first
plink.exe -batch root@%IP% -pw abcd1234 "sh /data/webService/stopWebService.sh %DIR% %FILE%"
if errorlevel 1 (
echo kill fail: %errorlevel%
goto ERROR
)
@REM wait a second
@ping -n 2 127.0.0.1 > nul
echo=
echo Upload %FILE% to %DIR%
pscp.exe -pw abcd1234 %FILE% root@%IP%:/data/webService/%DIR%/
if errorlevel 1 (
echo upload fail: %errorlevel%
goto ERROR
)
@ping -n 2 127.0.0.1 > nul
echo=
echo To start %FULL%
plink.exe -batch -ssh root@%IP% -pw abcd1234 "sh /data/webService/startWebService.sh %DIR% %FILE%"
if errorlevel 1 (
echo start fail: %errorlevel%
goto ERROR
)
echo=
echo SUCESS!
goto FINISH
:ERROR
echo !!!ERROR!!!
:FINISH
若要发布文件,只需call publishJar.bat %IP% %FILE% %DIR%
即可。