Гарантируйте это AuthorizedKeysFile
точки к правильному местоположению, использовать %u
как заполнитель для имени пользователя:
# /etc/ssh/sshd_config
AuthorizedKeysFile /home/%u/authorized_keys
Может случиться так, что просто необходимо не прокомментировать строку:
AuthorizedKeysFile .ssh/authorized_keys
Следите за этим, необходимо перезагрузить ssh сервис для изменений для происхождения:
service sshd reload
Это покажет вам процессы, использующие туннель:
netstat -tnp | grep :2219 | awk '{print $NF}'
Я не могу воспроизвести ваши мертвые соединения, но это должно работать
for i in $(seq 2000 2030) do
if !nmap -p $i localhost
netstat -tnp | grep 2222 | grep '/ssh *$' | awk '{print $NF}' | sed -e 's#/ssh##' | xargs kill
fi
end
Возможно, если вы измените свой клиентский скрипт, чтобы он вручную проверял статус обратного туннеля, сравнивая команду hostname
локально и удаленно -через -туннельhostname
(тот же комп):
#!/bin/bash
tunport=$(grep -o "[0-9][0-9][0-9][0-9]" /some/dir/id)
while true; do # -f (detached, foreground)
ssh -i /some/dir/reverse-ssh.key -fnNT -R $tunport:localhost:22 rsuname@server.addr
while true; do
if [ "$(hostname)" = "$(ssh -p $tunport rsuname@$srvip hostname)" ]; then
sleep 30
else # kill local and remote process
pkill -f "ssh.* -R $tunport:localhost"
ssh rsuname@server.addr "lsof -ti tcp:$tunport | xargs -r kill"
break # to tunnel re-init
fi
done
done
выглядит как пуленепробиваемое решение, ответы A и B, и устраняет необходимость в tcpkeepalive, параметрах liveInterval/countMax клиент/сервер и вмешательстве администратора.