Monitorar via SSH e executar script local após a detecção de alterações

2

Eu tenho um ambiente onde posso usar o SSH em uma máquina Linux via Cygwin, mas não o contrário, devido a uma política de segurança fora do meu controle.

Eu preciso automatizar tarefas na máquina Windows, mas ditar essas coisas para fazer a partir de scripts ou parâmetros PUXADOS da máquina Linux (ou seja, uma pasta assistida ou serviço da web).

Como posso estruturar isso para que eu possa manter uma conexão SSH aberta e ao detectar essa alteração de variável remota, acionar outro comando do Cygwin na máquina Windows?

Um caso de uso de exemplo seria a automação do navegador com parâmetros. Enquanto eu poderia fazer isso através de um repositório git e um script recorrente que primeiro sincroniza com o código mais recente de cada vez antes de executar, eu gostaria de ter mais controle, como forçar a matar o thread de execução passando outra variável ou script de shell linha.

ATUALIZAÇÃO: Depois de tudo isso, houve outro método para alterar o firewall do Windows que permitia conexões de porta 22, portanto, este caso complicado não será necessário, mas eu gosto das sugestões listadas abaixo. / p>

UPDATE: parece que o cenário ainda existe. Embora obter acesso direto ao sistema via SSH permitisse a execução de tarefas, elas eram armazenadas em área restrita no usuário SSH, não no usuário do domínio da rede com o qual eu queria executar tarefas GUI (a instância local do Cygwin não tem problemas para executar dentro do usuário do domínio GUI). Veja minha resposta abaixo.

    
por WP2Static.com 01.11.2013 / 03:14

3 respostas

1

Você pode executar o sshd na máquina do Windows? Se sim, então você poderia abrir um túnel para que a máquina Linux possa enviar comandos para a máquina Windows assim:

ssh -R 2222:127.0.0.1:22 user@linuxmachine control-script

control-script conteria todas as suas verificações e se algo tiver que ser executado na máquina Windows, ele executaria um comando como este:

ssh -p 2222 user@localhost something.cmd
    
por 01.11.2013 / 10:46
1

Eu usei algo semelhante à resposta do troydj, simplesmente usando o comando watch que executa um script "checker" que monitora a existência de outro script e o executa se descoberto.

no Windows Cygwin

watch -n 5 ~/checker.bash

checker.bash

#!/bin/bash
if [ -f myscript.bash ]; then
 sh ~/myscript.bash
else
 echo 'checking...'
fi

myscript.bash (exemplo para iniciar o Visual Studio 2012 via SSH)

#!/bin/bash
/cygdrive/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 11.0/Common7/IDE/devenv.exe
rm myscript.bash

Na máquina Linux, posso desenvolver e criar os scripts. Então, quando eu quiser que eles sejam executados na GUI do usuário logado, copio meu script para o myscript.bash location, que, uma vez descoberto pelo script "checker" (sendo colocado em loop pelo comando watch ), é executado localmente. p>

Eu adicionei a última linha ao script para remover a si mesma após a execução, neste caso.

Isso funciona muito bem para o que eu pretendia fazer. Fazer com que o Cygwin conduza processos em uma conta de usuário do Windows específica por meio da conexão SSH é geralmente complicado, se não impossível, sem uma solução alternativa como essa.

    
por 02.11.2013 / 04:40
1

Se você tem Expect em sua caixa local do Cygwin, você pode usá-lo para ssh em sua caixa Linux remota e procurar por trabalhos em um diretório de spool. Quando um novo trabalho é detectado, o script Expect pode suspender ssh , executar comandos locais no sistema Cygwin e, em seguida, retomar o ssh. Pode parecer algo assim (como uma primeira passagem rudimentar):

#!/usr/bin/expect

set timeout 10
log_user 1

spawn bash --login
expect -re {.*\$}       ;# Assumes a dollar sign in your prompt on local box

send "ssh remoteuser@your_remote_linux_box\r"
expect "*word:*"
send "REMOTE_PASSWORD\r"  ;# Bad security practice!!  For illustration purposes only.
expect -re {\r\n.*\$}     ;# Assumes a dollar sign in your prompt on your remote box
puts "Connected to remote system"

set i 0

while {$i < 5} {     ;# For now, we just loop 5 times. You might loop forever...
    send "ls ~/TasksSpoolDir | wc -l\r";
    expect -re "\r\n(\[0-9\]+)\r"
    set taskcount $expect_out(1,string)
    sleep 1
    if { $taskcount } {
            # Inspect remote job files from spool directory, for example, to determine what you want to do locally
            send "\r~2"             ;# Send ~CTRL-Z to ssh
            expect "Stopped"
            send "pwd; ls; echo Do local tasks now.  Remove remote job files from spool directory...\r"
            sleep 1
            send "fg\r"                ;# Resume ssh.
            sleep 1
            send "\r\r"
            expect -re {\r\n.*\$}      ;# Assumes a dollar sign in your prompt on your remote box
    }

    incr i
    sleep 1;  # Sleep however long between checks for new work from spool directory
}

send "exit\r"
expect -re {.*closed}
puts "Connection to remote host closed..."
send "exit\r"
expect "*"
puts "Local bash process closed..."
wait

exit 0
    
por 01.11.2013 / 15:56