自动ssh链接别的服务器
expect -c "
# ssh链接命令,需要链接192.168.0.171这台服务器
spawn bash -c \"ssh root@192.168.0.171\"
expect {
# 如果第一次链接的时候可能需要判断yes或者no,发送命令为yes并进行下一步
\"yes/no\" {send \"yes\r\"; exp_continue;}
# 输入密码
\"*assword\" {set timeout 300; send \"aaa\r\";}
}
# 链接完成后,退出ssh
expect \"]#\" {set timeout 300; send \"exit\r\"}
expect eof"
sh脚本如何通过控制台传参数
sh /opt/jnpf/start-platform-ssh.sh -p 参数a -c 参数b -j 参数c
【start-platform-ssh.sh】文件内容
#!/bin/bash
# 定义参数别名
PROJECTNAME=
CATALOGUE=
JAR=
# 定义参数赋值
while getopts "p:c:j:" opt
do
case $opt in
p)
PROJECTNAME=$OPTARG
;;
c)
CATALOGUE=$OPTARG
;;
j)
JAR=$OPTARG
;;
?)
echo "未知参数"
exit 1
;;
esac
done
# expect命令执行
expect -c "
# scp命令执行
spawn bash -c \"scp $JAR root@192.168.0.171:/opt/jnpf/$CATALOGUE/source/\"
expect {
\"yes/no\" {send \"yes\r\"; exp_continue;}
\"*assword\" {set timeout 300; send \"aaa\r\";}
}
# ssh命令执行
spawn bash -c \"ssh root@192.168.0.171\"
expect {
\"yes/no\" {send \"yes\r\"; exp_continue;}
\"*assword\" {set timeout 300; send \"aaaa\r\";}
}
# 进入/opt/jnpf目录下
expect \"]#\" {set timeout 300; send \"cd /opt/jnpf\r\"}
# kill 项目进程
expect \"]#\" {set timeout 300; send \"./stop.sh -t $JAR\r\"}
# 启动项目进程
expect \"]#\" {set timeout 300; send \"./start-platform.sh -s $PROJECTNAME -t $JAR -h /opt/jnpf/$CATALOGUE\r\"}
# 退出ssh
expect \"]#\" {set timeout 300; send \"exit\r\"}
# 结束expect
expect eof"
启动项目命令
./start.sh -s 项目名 -t 项目jar包名 -h jar包目录
【start.sh】文件内容
#!/bin/bash
SCREENNAME=
HOME=
TARGET=
DATE=$(date +%Y%m%d-%H:%M:%S)
while getopts "s:h:t:" opt
do
case $opt in
s)
SCREENNAME=$OPTARG
;;
h)
HOME=$OPTARG
;;
t)
TARGET=$OPTARG
;;
?)
echo "未知参数"
exit 1
;;
esac
done
for pid in $(ps -ef|grep $TARGET |grep -v grep|grep -v PPID|awk '{ print $2}'); do
if [ $pid -eq $$ ]; then
echo $pid
else
kill -9 $pid
fi
done
screen -wipe
cd $HOME
cp source/$TARGET $TARGET
screen -dmS $SCREENNAME bash -c "java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC $TARGET"
kill进程
./stop.sh -t 项目jar包名
【stop.sh】文件内容
#!/bin/bash
TARGET=
DATE=$(date +%Y%m%d-%H:%M:%S)
while getopts "t:" opt
do
case $opt in
t)
TARGET=$OPTARG
;;
?)
echo "未知参数"
exit 1
;;
esac
done
for pid in $(ps -ef|grep $TARGET |grep -v grep|grep -v PPID|awk '{ print $2}'); do
if [ $pid -eq $$ ]; then
echo $pid
else
kill -9 $pid
fi
done
screen -wipe