Монитор через SSH и выполняет локальный сценарий после обнаружения изменения

Если sed не, необходимость с помощью Ruby могла бы быть альтернативой. Интерпретатор Ruby, ruby, может использоваться как sed и awk путем выполнения его с -n опция, которая заставляет его выполнить итерации по ее входу. Интерпретатор может затем быть каналом с остротой Ruby путем добавления его как аргумента -e опция (который говорит интерпретатору интерпретировать аргумент -e вместо того, чтобы искать сценарий в файле).

Для этой конкретной проблемы можно использовать следующую остроту (адаптированный от https://stackoverflow.com/a/3184271/789593):

ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'

На простом языке это

  • соответствия любые 3 символа или по крайней мере один символ, scan(/.{3}|.+/), во входной строке, $_ (в этом случае вход, как ожидают, прибудет из стандарта в), и помещает каждое соответствие в массив,
  • присоединяется к массиву в строку с '+' соединяющий каждый элемент, join("+"),
  • и печать завершенный новой строкой puts.

Например,

echo "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUG" | ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UG

Обратите внимание, что это не добавляет запаздывания '+'.

2
02.11.2013, 05:31
3 ответа

Можно ли выполнить sshd на машине Windows? Если да затем Вы могли бы открыть туннель так, чтобы машина Linux могла отправить команды на машину Windows как это:

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

сценарий управления затем содержал бы все Ваши проверки и если бы что-то должно быть выполнено на машине Windows, это выполнило бы команду как это:

ssh -p 2222 user@localhost something.cmd
1
27.01.2020, 22:06
  • 1
    , который звучит как обещание, если Windows является одним инициированием туннель, даст его, –  ljs.dev 01.11.2013, 19:22

Я использовал что-то подобное ответу troydj путем простого использования команды часов, которая выполняет сценарий "средства проверки", который контролирует для существования другого сценария и выполняет его, если обнаружено.

на Cygwin Windows

watch -n 5 ~/checker.bash

checker.bash

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

myscript.bash (пример для запуска Visual Studio 2012 через SSH)

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

На машине Linux я могу разработать далеко и создать сценарии. Затем то, когда я хочу их выполняемый в Windows, вошло в систему GUI пользователя, я копирую свой сценарий в myscript.bash местоположение, который когда-то обнаруженный сценарием "средства проверки" (циклично выполняемый watch команда), выполняется локально.

Я добавил последнюю строку к к сценарию для удаления себя после выполнения в этом случае.

Это работает действительно хорошо на то, что я стремился делать. Получение Cygwin управлять процессами в рамках определенной учетной записи пользователя Windows через соединение SSH часто хитро если не невозможный без обходного решения как это.

1
27.01.2020, 22:06

Если Вы имеете Expect на Вашем локальном поле Cygwin можно использовать его для ssh в Ваше удаленное поле Linux и часы для заданий в каталоге шпульки. Когда новая работа обнаруживается, Ожидать сценарий может приостановить ssh, выполните локальные команды в системе Cygwin и затем возобновите ssh. Это могло бы выглядеть примерно так (как элементарная первичная обработка):

#!/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~\032"             ;# 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
1
27.01.2020, 22:06
  • 1
    попытки благодарит, который был видом решения, которое я предполагал, попробует его –  ljs.dev 01.11.2013, 19:22

Теги

Похожие вопросы