作者: Jim Wang 公众号: 巴博萨船长

摘要:有时候回需要到ssh tunnel,手动使用ssh 创建这些并没有太大的问题,可是如果尝试开机启动,写个shell脚本并在rc.local里面运行这个脚本并不成功,原因也不得而知。 本文主要介绍如何解决这一问题。

Abstract: Sometimes you need to go to ssh tunnel. Manually using ssh to create these is not a big problem, but if you try to boot up, write a shell script and run this script in rc.local, it is unsuccessful, and the reason is unknown. This article mainly introduces how to solve this problem.

作者: Jim Wang 公众号: 巴博萨船长

背景

有时候回需要到ssh tunnel,手动使用ssh 创建这些并没有太大的问题,可是如果尝试开机启动,写个shell脚本并在rc.local里面运行这个脚本并不成功,原因也不得而知。 后来发现了autossh这东东,不单单能够静默模式创建ssh tunnel还能设置自动检测,并自动尝试链接的选项。

本文附件提供的脚本,需要放置在/etc/ini.d/目录下,并使用chmod +x 修改权限。然后也有必要使用update-rc.d service defaults添加入开机启动服务。当然不要忘记修改脚本中的配置信息。然后就能够在开机时候自动创建ssh tunnel了。 enjoy it.

解决方法

直接上结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#! /bin/bash

# For each tunnel; make a uniquely named copy of this template.


## SETTINGS
#
# autossh monitoring port (unique)
MPORT=54321
# the ssh tunnel to setup
TUNNEL="-L 2003:localhost:2003"
# remote user
RUSER="socieer"
# remote server
RSERVER="socieer.axxeo.de"
# You must use the real autossh binary, not a wrapper.
DAEMON=/usr/lib/autossh/autossh
#
## END SETTINGS

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

NAME=`basename $0`
PIDFILE=/var/run/${NAME}.pid
SCRIPTNAME=/etc/init.d/${NAME}
DESC="the tunnel"

test -x $DAEMON || exit 0

export AUTOSSH_PORT=${MPORT}
export AUTOSSH_PIDFILE=${PIDFILE}
ASOPT=${TUNNEL}" -f -N "${RUSER}"@"${RSERVER}

# Function that starts the daemon/service.
d_start() {
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--exec $DAEMON -- $ASOPT
if [ $? -gt 0 ]; then
echo -n " not started (or already running)"
else
sleep 1
start-stop-daemon --stop --quiet --pidfile $PIDFILE \
--test --exec $DAEMON > /dev/null || echo -n " not started"
fi

}

# Function that stops the daemon/service.
d_stop() {
start-stop-daemon --stop --quiet --pidfile $PIDFILE \
--exec $DAEMON \
|| echo -n " not running"
}


case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;

restart)
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 1
d_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 3
;;
esac

exit 0

才疏学浅,欢迎交流提意见彼此提高。需要声明一下51cto博客作者zuiwuxin就是作者本人,所以不存在版权问题。以后该博客将作为个人文章的主要发布地。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。