AutoSH的Bash init脚本
我正在尝试创建一个脚本,该脚本将通过init脚本在引导时启动AutoSH的Bash init脚本,bash,ssh,init,Bash,Ssh,Init,我正在尝试创建一个脚本,该脚本将通过init脚本在引导时启动autossh,但我无法让它工作。我希望看到它记录所有的操作,因为它工作不正常,但进展不太顺利。因为我在bash方面不是专业人士,我希望我的代码不会太尴尬 #!/bin/sh # # by Patrick van der Leer <pat.vdleer@gmail.com> # released under GPL, version 2 or later PATH=/sbin:/bin:/usr/sbin:/usr/bi
autossh
,但我无法让它工作。我希望看到它记录所有的操作,因为它工作不正常,但进展不太顺利。因为我在bash
方面不是专业人士,我希望我的代码不会太尴尬
#!/bin/sh
#
# by Patrick van der Leer <pat.vdleer@gmail.com>
# released under GPL, version 2 or later
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/usr/bin/autossh"
DESC="Autossh job"
PIDFOLDER="/var/run/autossh"
PIDFOLDERSSH="$PIDFOLDER/ssh"
REMOTE_USER=""
REMOTE_ADDR=""
LOGFILE="/var/log/autossh.log"
if [ ! -d $PIDFOLDER ] ; then
mkdir -p $PIDFOLDER
fi
if [ ! -d $PIDFOLDERSSH ] ; then
mkdir -p $PIDFOLDERSSH
fi
test -f $DAEMON || exit 0
. /lib/lsb/init-functions
PIDFILE="$PIDFOLDER/$REMOTE_USER-$REMOTE_ADDR.pid"
PIDFILESSH="$PIDFOLDERSSH/$REMOTE_USER-$REMOTE_ADDR.pid"
is_running() {
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
if [ -n "$PID" ]; then
return 0
else
return 1
fi
else
return 1
fi
}
start_autossh() {
if ! is_running; then
echo "Starting $DESC"
export AUTOSSH_FIRST_POLL=10
export AUTOSSH_POLL=60
export AUTOSSH_PIDFILE=$PIDFILESSH
start-stop-daemon --start --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- -M 29000 -i /root/.ssh/id_rsa -X -C -R 2222:localhost:22 $REMOTE_USER@$REMOTE_ADDR >> $LOGFILE 2>&1 &
sleep 1;
if ! is_running; then
echo "$DESC: running @ pid $PID"
else
echo 'Something went wrong';
fi
else
echo "$DESC: already running (pid $PID)"
fi
}
stop_autossh() {
if is_running; then
echo "Stopping $DESC"
start-stop-daemon --stop --pidfile $PIDFILE --signal 15
if [ -f $PIDSSHFILE ]; then
PIDSSH=`cat $PIDFILESSH`
kill $PIDSSH
rm -f $PIDFILESSH
fi
else
echo "$DESC: not running"
fi
[ -f $PIDFILE ] && rm -f $PIDFILE
}
case "$1" in
start)
start_autossh
;;
stop)
stop_autossh
;;
force-reload|restart)
stop_autossh
start_autossh
;;
status)
if is_running; then
echo "$DESC: running (pid $PID)"
exit 0
else
echo "$DESC: not running"
[ -f $PIDFILE ] && exit 1 || exit 3
fi
;;
log)
if [ -f $LOGIFLE ]; then
tail $LOGFILE
else
echo "log file '$LOGFILE' does't exist"
fi
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload|status|log}"
exit 3
;;
esac
exit 0
#/垃圾箱/垃圾箱
#
#帕特里克·范德勒
#在GPL版本2或更高版本下发布
路径=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=“/usr/bin/autossh”
DESC=“AutoSh作业”
PIDFOLDER=“/var/run/autossh”
PIDFOLDERSSH=“$PIDFOLDER/ssh”
远程用户=“”
远程地址=“”
LOGFILE=“/var/log/autossh.log”
如果[!-d$PIDFOLDER];然后
mkdir-p$PIDFOLDER
fi
如果[!-d$PIDFOLDERSSH];然后
mkdir-p$PIDFOLDERSSH
fi
测试-f$DAEMON | |退出0
. /lib/lsb/init函数
PIDFILE=“$PIDFOLDER/$REMOTE_USER-$REMOTE_ADDR.pid”
PIDFILESSH=“$PIDFOLDERSSH/$REMOTE_USER-$REMOTE_ADDR.pid”
你在跑步吗{
如果[-f$PIDFILE];则
PID=`cat$PIDFILE`
如果[-n“$PID”];则
返回0
其他的
返回1
fi
其他的
返回1
fi
}
启动_autosh(){
如果你在跑步,那么
echo“起始$DESC”
导出自动搜索首个轮询=10
导出自动搜索轮询=60
导出AutoSh_PIDFILE=$PIDFILESH
启动停止守护进程--启动--生成pidfile--pidfile$pidfile--exec$守护进程--M 29000-i/root/.ssh/id_rsa-X-C-R 2222:localhost:22$REMOTE_USER@$REMOTE_ADDR>>$LOGFILE 2>&1&
睡眠1;
如果你在跑步,那么
echo“$DESC:running@pid$pid”
其他的
回声“出了问题”;
fi
其他的
echo“$DESC:已在运行(pid$pid)”
fi
}
停止{
如果你在跑步,那么
echo“停止$DESC”
启动停止守护进程--停止--pidfile$pidfile--信号15
如果[-f$PIDSSHFILE];则
pidsh=`cat$pidsh`
杀死$pidsh
rm-f$s
fi
其他的
echo“$DESC:未运行”
fi
[-f$PIDFILE]&&rm-f$PIDFILE
}
案件“$1”
开始)
启动自动刷新
;;
(停止)
停下来
;;
强制重新加载(重新启动)
停下来
启动自动刷新
;;
(状态)
如果您正在运行;然后
echo“$DESC:正在运行(pid$pid)”
出口0
其他的
echo“$DESC:未运行”
[-f$PIDFILE]&退出1 | |退出3
fi
;;
日志)
如果[-f$LOGIFLE];然后
tail$LOGFILE
其他的
echo“日志文件“$LOGFILE”不存在”
fi
;;
*)
echo“用法:$0{start | stop | restart | force reload | status | log}”
出口3
;;
以撒
出口0
如果设置x
选项,Shell将在执行语句之前打印所有语句。要么:
- 以
/bin/sh-x脚本的形式运行脚本
- 更改
#代码>行到
#/bin/sh-x
- 在脚本开头执行
设置-x
检查它的手册页似乎你用错了。您不应该使用
&
来后台启动停止守护进程
,而应该使用--background
选项告诉启动停止守护进程
来对已执行的进程进行后台处理。--make pidfile
的文档甚至说,除非与--background
选项一起使用,否则它不应该工作
您还应该重定向start-stop-dameon的输出,它是您需要重定向的流程的唯一输出
start-stop守护进程
将把它重定向到/dev/null
IIRC,但我看不到覆盖它的方法。您可能必须创建一个包装器,该包装器将执行适当的重定向,并在--startas
选项中使用它,除非您设法告诉autossh
直接登录到文件。下面的脚本在调用时运行一个且仅一个autossh进程
#!/bin/sh
### BEGIN INIT INFO
# Provides: skeleton
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: autosshtun
# Description: Used to launch SSH tunnel with autossh
### END INIT INFO
# Author: Laurent HUBERT <lau.hub@gmail.com>
#
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="AUTOSSH Tunnel"
NAME=autosshtun
DAEMON=/usr/lib/autossh/autossh
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
CONN_PORT=22
SSH_TUNNEL_KEY_PATH=/root/.ssh/id-rsa
SSH_USERNAME=user
SSH_SERVER=server.domain.tld
ENTRY_PORT=1122
EXIT_PORT=22
ENV_COMMAND=/usr/bin/env
ENV_OPTIONS="AUTOSSH_PIDFILE=$PIDFILE"
SSH_COMMAND_OPTIONS="-p $CONN_PORT -i $SSH_TUNNEL_KEY_PATH $SSH_USERNAME@$SSH_SERVER"
OPEN_TUNNEL_OPTIONS="-T -N -R $ENTRY_PORT:localhost:$EXIT_PORT"
AUTOSSH_OPTION="-M 0"
DAEMON_ARGS="$AUTOSSH_OPTION $SSH_COMMAND_OPTIONS $OPEN_TUNNEL_OPTIONS"
is_running() {
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
if [ -n "$PID" ]; then
return 0
else
return 1
fi
else
return 1
fi
}
#
# Function that starts the daemon/service
#
do_start()
{
QUIET="--quiet"
if ! is_running; then
start-stop-daemon --background --start $QUIET --name $NAME \
--exec $ENV_COMMAND -- $ENV_OPTIONS $DAEMON $DAEMON_ARGS
retval=$?
sleep 1
if [ $retval -gt 0 ]; then
return $retval
else
sleep 1
start-stop-daemon --stop $QUIET --pidfile $PIDFILE \
--test --exec $DAEMON > /dev/null || return 2
fi
else
return 1
fi
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=TERM/10/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
exit 3
;;
esac
#/垃圾箱/垃圾箱
###开始初始化信息
#提供:骨架
#必需的开始:$network$remote\u fs$syslog
#所需停止:$network$remote\u fs$syslog
#默认开始:2 3 4 5
#默认停止:0 1 6
#简短描述:autoshtun
#描述:用于启动带有AutoSH的SSH隧道
###结束初始化信息
#作者:劳伦特·休伯特
#
#不要“设置-e”
#如果路径在mountnfs.sh脚本之后运行,则仅应包括/usr/*路径
路径=/sbin:/usr/sbin:/bin:/usr/bin
DESC=“AutoSH隧道”
NAME=autoshtun
守护进程=/usr/lib/autossh/autossh
DAEMON_ARGS=“”
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
#如果未安装程序包,请退出
[-x“$DAEMON”]| |退出0
#读取配置变量文件(如果存在)
[-r/etc/default/$NAME]&&&/etc/default/$NAME
#加载详细设置和其他rcS变量
. /lib/init/vars.sh
#定义LSB log_*函数。
#依赖lsb base(>=3.2-14)确保此文件存在
#进程的状态正在运行。
. /lib/lsb/init函数
连接端口=22
SSH\u TUNNEL\u KEY\u PATH=/root/.SSH/id rsa
SSH\u USERNAME=user
SSH_SERVER=SERVER.domain.tld
入口端口=1122
出口端口=22
ENV_命令=/usr/bin/ENV
ENV_OPTIONS=“AUTOSSH_PIDFILE=$PIDFILE”
SSH_命令_选项=“-p$CONN_端口-i$SSH_隧道_密钥_路径$SSH_用户名@$SSH_服务器”
OPEN_TUNNEL_OPTIONS=“-T-N-R$ENTRY_PORT:localhost:$EXIT_PORT”
AutoSh_选项=“-M 0”
DAEMON_ARGS=“$AUTOSSH_OPTION$SSH_COMMAND_OPTIONS$OPEN_TUNNEL_OPTIONS”
你在跑步吗{
如果[-f$PIDFILE];则
PID=`cat$PIDFILE`
如果[-n“$PID”];则
返回0
其他的
返回1
fi
其他的
返回1
fi
}
#
#启动守护进程/服务的函数
#
你要开始吗
{
安静=“--安静”
如果你在跑步,那么
启动停止守护进程--后台--启动$QUIET--名称$name\