SSHを介して監視し、変更が検出されたらローカルスクリプトを実行します。

SSHを介して監視し、変更が検出されたらローカルスクリプトを実行します。

Cygwinを介してLinuxシステムにSSH接続できる環境がありますが、制御できないセキュリティポリシーのため、Linuxシステムに接続できません。

Windows コンピューターでタスクを自動化する必要がありますが、Linux コンピューター (モニター対象フォルダーや Web サービスなど) からインポートされたスクリプトまたはパラメーターを使用してこれらのタスクを指示する必要があります。

このリモート変数の変更が検出されたら、SSH接続を開いたままにし、Windowsシステムで他のCygwinコマンドをトリガできるようにこれをどのように構築できますか?

ユースケースの例には、パラメータを使用したブラウザの自動化があります。 gitリポジトリと各実行の前に、まず最新のコードと同期するループスクリプトを使用してこれを実行できますが、他の変数やシェルスクリプトを渡して強制終了するなど、より多くの制御機能を持ちたいと思います。 。ワイヤー。

修正する:結局のところ、ポート22接続を許可するようにWindowsファイアウォールを変更する別の方法があるので、幸いなことにこの複雑さは必要ありませんが、以下に示す提案が好きです。

修正する:このシナリオがまだ存在しているようです。 SSHを介してシステムに直接アクセスするとジョブを実行できますが、ジョブはGUIジョブを実行したいネットワークドメインユーザーではなくSSHユーザーでサンドボックス化されます(ドメインユーザーの環境で実行されている場合はローカルCygwinインスタンスが機能しません)。ドメイン)問題があります)グラフィカルユーザーインターフェイス)。以下の私の答えをご覧ください。

答え1

Windowsシステムでsshdを実行できますか?その場合は、Linux コンピュータが次のように Windows コンピュータにコマンドを送信できるようにトンネルを開くことができます。

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

これにより、コントロールスクリプトにはすべてのチェックが含まれ、Windowsシステムでタスクを実行する必要がある場合は、次のタスクを実行します。

ssh -p 2222 user@localhost something.cmd

答え2

私はtroydjの答えに似たものを使用しました。 watchコマンドを使用して他のスクリプトの存在を監視し、見つかった場合に実行する「チェッカー」スクリプトを実行しました。

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(SSH経由でVisual Studio 2012を起動する例)

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

Linuxシステムでは、スクリプトを開発して生成できます。次に、ユーザーがGUIにログインしているWindowsで実行したい場合は、スクリプトをその場所にコピーします。ここで、スクリプトmyscript.bashは、「インスペクタ」スクリプト(コマンドループを介して)によって検出されるとwatchローカルに実行されます。

この場合、実行後に自動的に削除されるようにスクリプトに最後の行を追加しました。

これは私の目標に非常に効果的です。これらの回避策がない場合、CygwinにSSH接続を介して特定のWindowsユーザーアカウントでプロセスを駆動させることはしばしば面倒です。

答え3

ExpectローカルCygwinシステムにいる場合は、それを使用sshしてリモートLinuxシステムに接続し、スプールディレクトリの操作を監視できます。新しいジョブが検出されたら、Expectスクリプトを一時停止し、sshCygwinシステムでローカルコマンドを実行してから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

関連情報