Если sed не, необходимость с помощью Ruby могла бы быть альтернативой. Интерпретатор Ruby, ruby
, может использоваться как sed и awk путем выполнения его с -n
опция, которая заставляет его выполнить итерации по ее входу. Интерпретатор может затем быть каналом с остротой Ruby путем добавления его как аргумента -e
опция (который говорит интерпретатору интерпретировать аргумент -e
вместо того, чтобы искать сценарий в файле).
Для этой конкретной проблемы можно использовать следующую остроту (адаптированный от https://stackoverflow.com/a/3184271/789593):
ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
На простом языке это
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
Обратите внимание, что это не добавляет запаздывания '+'.
Можно ли выполнить sshd на машине Windows? Если да затем Вы могли бы открыть туннель так, чтобы машина Linux могла отправить команды на машину Windows как это:
ssh -R 2222:127.0.0.1:22 user@linuxmachine control-script
сценарий управления затем содержал бы все Ваши проверки и если бы что-то должно быть выполнено на машине Windows, это выполнило бы команду как это:
ssh -p 2222 user@localhost something.cmd
Я использовал что-то подобное ответу 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 часто хитро если не невозможный без обходного решения как это.
Если Вы имеете 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