Cygwin을 통해 Linux 시스템에 SSH로 연결할 수 있는 환경이 있지만 제어할 수 없는 보안 정책으로 인해 Linux 시스템에 연결할 수 없습니다.
Windows 컴퓨터에서 작업을 자동화해야 하지만 Linux 컴퓨터(예: 모니터링되는 폴더 또는 웹 서비스)에서 가져온 스크립트나 매개 변수를 통해 이러한 작업을 지시해야 합니다.
이 원격 변수 변경이 감지되면 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
는 "inspector" 스크립트(명령 루프를 통해)에 의해 발견되면 watch
로컬로 실행됩니다 .
이 경우에는 실행 후 자동으로 삭제되도록 스크립트에 마지막 줄을 추가했습니다.
이것은 내 목표에 아주 효과적입니다. 이러한 해결 방법이 없으면 Cygwin이 SSH 연결을 통해 특정 Windows 사용자 계정에서 프로세스를 구동하도록 하는 것이 종종 까다롭습니다.
답변3
Expect
로컬 Cygwin 시스템에 있는 경우 이를 사용 ssh
하여 원격 Linux 시스템에 접속하고 스풀 디렉터리의 작업을 모니터링할 수 있습니다. 새 작업이 감지되면 Expect 스크립트를 일시 중지하고 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