root@XiaoQiang:/# cat /etc/init.d/dropbear
#!/bin/sh /etc/rc.common
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# Copyright (C) 2006-2010 OpenWrt.org
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# Copyright (C) 2006 Carlos Sobrinho
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
START=19
dmin
admin
dmin
dmin
admin
admin
dmin
admin
STOP=50
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
USE_PROCD=1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
PROG=/usr/sbin/dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
NAME=dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
PIDCOUNT=0
dmin
admin
dmin
dmin
admin
admin
dmin
admin
EXTRA_COMMANDS="killclients"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
EXTRA_HELP=" killclients Kill ${NAME} processes except servers and yourself"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
append_ports()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local ipaddrs="$1"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local port="$2"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -z "$ipaddrs" ] && {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_append_param command -p "$port"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
return
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for addr in $ipaddrs; do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_append_param command -p "$addr:$port"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
validate_section_dropbear()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
uci_validate_section dropbear dropbear "${1}" \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'PasswordAuth:bool:1' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'enable:bool:1' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'Interface:string' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'GatewayPorts:bool:0' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'RootPasswordAuth:bool:1' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'RootLogin:bool:1' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'rsakeyfile:file' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'BannerFile:file' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'Port:list(port):22' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'SSHKeepAlive:uinteger:300' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'IdleTimeout:uinteger:0' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'MaxAuthTries:uinteger:3' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'RecvWindowSize:uinteger:0' \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
'mdns:bool:1'
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dropbear_instance()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local PasswordAuth enable Interface GatewayPorts \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
RootPasswordAuth RootLogin rsakeyfile \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
BannerFile Port SSHKeepAlive IdleTimeout \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
MaxAuthTries RecvWindowSize mdns ipaddrs
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
validate_section_dropbear "${1}" || {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
echo "validation failed"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
return 1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -n "${Interface}" ] && {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
network_get_ipaddrs_all ipaddrs "${Interface}" || {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
echo "interface ${Interface} has no physdev or physdev has no suitable ip"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
return 1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${enable}" = "0" ] && return 1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
PIDCOUNT="$(( ${PIDCOUNT} + 1))"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local pid_file="/var/run/${NAME}.${PIDCOUNT}.pid"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_open_instance
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_set_param command "$PROG" -F -P "$pid_file"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${PasswordAuth}" -eq 0 ] && procd_append_param command -s
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${GatewayPorts}" -eq 1 ] && procd_append_param command -a
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${RootPasswordAuth}" -eq 0 ] && procd_append_param command -g
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${RootLogin}" -eq 0 ] && procd_append_param command -w
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -n "${rsakeyfile}" ] && procd_append_param command -r "${rsakeyfile}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -n "${BannerFile}" ] && procd_append_param command -b "${BannerFile}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
append_ports "${ipaddrs}" "${Port}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${IdleTimeout}" -ne 0 ] && procd_append_param command -I "${IdleTimeout}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${SSHKeepAlive}" -ne 0 ] && procd_append_param command -K "${SSHKeepAlive}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${MaxAuthTries}" -ne 0 ] && procd_append_param command -T "${MaxAuthTries}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${RecvWindowSize}" -gt 0 -a "${RecvWindowSize}" -le 1048576 ] && \
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_append_param command -W "${RecvWindowSize}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${mdns}" -ne 0 ] && procd_add_mdns "ssh" "tcp" "$Port" "daemon=dropbear"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_set_param respawn
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_close_instance
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
keygen()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for keytype in rsa; do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# check for keys
dmin
admin
dmin
dmin
admin
admin
dmin
admin
key=dropbear/dropbear_${keytype}_host_key
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -f /tmp/$key -o -s /etc/$key ] || {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# generate missing keys
dmin
admin
dmin
dmin
admin
admin
dmin
admin
mkdir -p /tmp/dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -x /usr/bin/dropbearkey ] && {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
/usr/bin/dropbearkey -t $keytype -f /tmp/$key 2>&- >&- && exec /etc/rc.common "$initscript" start
dmin
admin
dmin
dmin
admin
admin
dmin
admin
} &
dmin
admin
dmin
dmin
admin
admin
dmin
admin
exit 0
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
lock /tmp/.switch2jffs
dmin
admin
dmin
dmin
admin
admin
dmin
admin
mkdir -p /etc/dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
mv /tmp/dropbear/dropbear_* /etc/dropbear/
dmin
admin
dmin
dmin
admin
admin
dmin
admin
lock -u /tmp/.switch2jffs
dmin
admin
dmin
dmin
admin
admin
dmin
admin
chown root /etc/dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
chmod 0700 /etc/dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
load_interfaces()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_get interface "$1" Interface
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_get enable "$1" enable 1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${enable}" = "1" ] && interfaces=" ${interface} ${interfaces}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
boot()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
BOOT=1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
start "$@"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
start_service()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# 稳定版不能打开ssh服务
dmin
admin
dmin
dmin
admin
admin
dmin
admin
flg_ssh=`nvram get ssh_en`
dmin
admin
dmin
dmin
admin
admin
dmin
admin
channel="debug"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -s /etc/dropbear/dropbear_rsa_host_key ] || keygen
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
. /lib/functions.sh
dmin
admin
dmin
dmin
admin
admin
dmin
admin
. /lib/functions/network.sh
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_load "${NAME}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_foreach dropbear_instance dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
service_triggers()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local interfaces
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_add_config_trigger "config.change" "dropbear" /etc/init.d/dropbear reload
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_load "${NAME}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
config_foreach load_interfaces dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ -n "${interfaces}" ] && {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for n in $interfaces ; do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_add_interface_trigger "interface.*" $n /etc/init.d/dropbear reload
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
procd_add_validation validate_section_dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
shutdown() {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# close all open connections
dmin
admin
dmin
dmin
admin
admin
dmin
admin
killall dropbear
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
killclients()
dmin
admin
dmin
dmin
admin
admin
dmin
admin
{
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local ignore=''
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local server
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local pid
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# if this script is run from inside a client session, then ignore that session
dmin
admin
dmin
dmin
admin
admin
dmin
admin
pid="$$"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
while [ "${pid}" -ne 0 ]
dmin
admin
dmin
dmin
admin
admin
dmin
admin
do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# get parent process id
dmin
admin
dmin
dmin
admin
admin
dmin
admin
pid=`cut -d ' ' -f 4 "/proc/${pid}/stat"`
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${pid}" -eq 0 ] && break
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# check if client connection
dmin
admin
dmin
dmin
admin
admin
dmin
admin
grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" && {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
append ignore "${pid}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
break
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# get all server pids that should be ignored
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for server in `cat /var/run/${NAME}.*.pid`
dmin
admin
dmin
dmin
admin
admin
dmin
admin
do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
append ignore "${server}"
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# get all running pids and kill client connections
dmin
admin
dmin
dmin
admin
admin
dmin
admin
local skip
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for pid in `pidof "${NAME}"`
dmin
admin
dmin
dmin
admin
admin
dmin
admin
do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# check if correct program, otherwise process next pid
dmin
admin
dmin
dmin
admin
admin
dmin
admin
grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || {
dmin
admin
dmin
dmin
admin
admin
dmin
admin
continue
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# check if pid should be ignored (servers, ourself)
dmin
admin
dmin
dmin
admin
admin
dmin
admin
skip=0
dmin
admin
dmin
dmin
admin
admin
dmin
admin
for server in ${ignore}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
do
dmin
admin
dmin
dmin
admin
admin
dmin
admin
if [ "${pid}" = "${server}" ]
dmin
admin
dmin
dmin
admin
admin
dmin
admin
then
dmin
admin
dmin
dmin
admin
admin
dmin
admin
skip=1
dmin
admin
dmin
dmin
admin
admin
dmin
admin
break
dmin
admin
dmin
dmin
admin
admin
dmin
admin
fi
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
[ "${skip}" -ne 0 ] && continue
dmin
admin
dmin
dmin
admin
admin
dmin
admin
dmin
admin
dmin
dmin
admin
admin
dmin
admin
# kill process
dmin
admin
dmin
dmin
admin
admin
dmin
admin
echo "${initscript}: Killing ${pid}..."
dmin
admin
dmin
dmin
admin
admin
dmin
admin
kill -KILL ${pid}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
done
dmin
admin
dmin
dmin
admin
admin
dmin
admin
}
dmin
admin
dmin
dmin
admin
admin
dmin
admin
root@XiaoQiang:/#