Encontrei esse script de expectativa que alguém havia escrito. Funciona para mim - tenho dispositivos remotos / não assistidos por trás do firewall e do roteamento de propriedade de outras empresas. Em vez de ter que trabalhar com eles para expor minha porta ssh para o mundo através do encaminhamento de porta para que eu possa acessar os dispositivos, eu queria poder usar o SSH reverso. Então construí meu próprio sistema para contornar isso.
O lado do servidor executa um PHP & amp; Site baseado em MySQL. Eu posso clicar em um dispositivo e ir para a página dele. Clico no botão "Reverse SSH", que coloca o comando "Reverse SSH" no banco de dados com o ID do dispositivo.
No lado do cliente, eu tenho um script python que é executado a cada minuto via crontab. Toda vez que ele é executado, ele relata as informações de integridade do sistema, carga da cpu, memória, espaço em disco, etc via HTTP para o servidor. Durante essa transação HTTP, se um comando estiver aguardando o dispositivo que fez check-in, eu mando o comando de volta. O lado do cliente, em seguida, corresponde a esse comando e executa uma chamada para bash "esperar /path/to/client/reversessh.expect".
O script expect é preenchido com o meu servidor ssh info (sim, eu sei que é "inseguro", mas funciona por enquanto.) e estabelece a conexão SSH reversa por até 1 hora (você pode configurá-lo para mais tempo se você precisa). Eu posso então entrar no dispositivo remoto da minha localidade.
O servidor que estou executando é o Ubuntu Server 14.04, e os dispositivos remotos variam de servidores black e virtual beaglebone a PCs de mesa, RPi e RPi2.
Nos sistemas baseados no debian, eu instalo o expect através do apt-get:
apt-get install espera
Aqui está o script expect, modifique-o conforme necessário. Pode demorar um pouco para fazê-lo funcionar, mas funciona. Espero que a formatação não seja complicada, é difícil copiar e colar um grande bloco de código como este e fazer com que ele funcione corretamente:
Exemplo reversssh.expect
#!/usr/bin/expect -f
#Author: g0 2010 , kod.ipduh.com
#License:Same as Expect - Public Domain
#revtun sets up a reverse ssh tunnel
#ssh example: ssh -R 1025:localhost:22 -p 443 [email protected] -fN
#Hardcode the arguments or pass them at this order on the command line
#eg:$revtun 1025 22 443 user 192.0.2.123 password http://kod.ipduh.com
set remoteport "1234" # this is the port on your server that will serve the tunnel
set localport "22" # ssh port of remote/target device
set port "2222" # This is the port in which the remote device will ssh into your server. If you use standard port for ssh on server then it is, it's 22.
set user "" #ssh user on your server
set host "" # server host ie blah.com or 123.123.123.123
set password "" # user password for servers ssh user
set report_to "" # I never used this...see below line that starts with curl. In your web server php script do <?php print_r($_GET); ?>
if {$argc > 0} { set remoteport [lindex $argv 0] }
if {$argc > 1} { set localport [lindex $argv 1] }
if {$argc > 2} { set port [lindex $argv 2] }
if {$argc > 3} { set user [lindex $argv 3] }
if {$argc > 4} { set host [lindex $argv 4] }
if {$argc > 5} { set password [lindex $argv 5] }
if {$argc > 6} { set report_to [lindex $argv 6] }
set message "m"
set timeout 3600 # number of seconds to keep the tunnel open, this is set to 1 hour.
set pid [spawn ssh -N -R $remoteport:localhost:$localport $user@$host -p $port]
while {1} {
expect -nocase -re ".*yes/no?.*" {
send "yes\r"
} -nocase -re "password*" {
send -- "$password\r\n"
#send -- "\n"
} -re "(%|\\$|#) " {
set message "$message-prompt"
break
} eof {
set message "$message-eof"
break
} -re "incorrect|invalid" {
set message "$message-incorrect"
break
} -nocase -re ".*Warning.*" {
set message "$message-warning"
break
} timeout {
set message "$message-timeout"
break
}
}
set user "$env(USER)"
exec curl $report_to?$user-$message --silent >/dev/null
#1 hour max connection time used to keep the script running
E se você quiser mantê-lo em execução se / quando ele cair, eu usaria o cron para executar um script bash para verificar se o programa sshd está rodando, se não estiver rodando, inicie, caso contrário, não faça nada. Se você tiver outras conexões SSH em andamento, verificar o sshd pode não funcionar para você. Como esse script SSH reverso é a única atividade SSH nos dispositivos remotos, funciona para mim. No meu sistema, posso matar a conexão SSH reversa em um dispositivo disparando outro comando para o dispositivo remoto quando ele faz check-in, "Desconectar SSH reverso", e isso faz com que o lado do cliente execute este comando com bash:
kill 'pidof sshd'
Edite seu crontab com: crontab -e
As primeiras 6 linhas do arquivo crontab abaixo são boas para serem especificadas, você pode querer editá-las do seu jeito.
Exemplo de crontab
MAILTO="" # local mail address to get cron messages, leave blank to disable
SHELL=/bin/bash
USER=root # run these cron jobs as root user
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root # root users home dir
LOGNAME=root
# Example check reverse SSH connection - runs every minute
* * * * * bash /path/to/check_reverse_ssh.bash
Exemplo de check_reverse_ssh.bash
#!/bin/bash
process_id='ps aux | grep "sshd" | grep -v "grep"'
if [ -z "$process_id" ]; then
echo "process not running for certain."
expect /path/to/reversessh.expect &
else
echo "sshd is running, If so, your tunnel should be good to go";
fi
Boa sorte!