저는 OpenSSH를 사용하여 Linux 서버에 연결하고 있으며 서버에서 tmux
오랜 시간이 걸리는 컴파일 작업을 수행하는 세션이 있습니다. 이제 오랜 시간이 걸리는 명령이 최종적으로 완료되면 Linux 클라이언트(연결된 컴퓨터)에서 즉시 알림을 받고 싶습니다.
로컬에서는 팝업 사용 방법, 재생 방법 등을 알고 있습니다. (1), (2) 특정 명령을 실행하여 알림을 받습니다. 이제 원격으로 동일한 작업을 수행해야 합니다. 완벽한 솔루션은 일종의 피드백 채널이겠지만, ssh
저는 그러한 기능을 전혀 알지 못합니다.
그리고 (3)에서 제안한 이메일 기반 솔루션을 사용하지 마십시오 . 나는 이미 업무용 이메일을 너무 많이 받아서 읽기, 저장, 전달 또는 답장용이 아닌 확인용 이메일 수를 줄이려고 노력하고 있습니다. (저는 이를 위해 별도의 이메일 계정도 만들었습니다. 실시간 알림을 받을 수 없습니다).
답변1
SSH 연결이 여전히 존재하는 경우 이를 사용할 수 있습니다 port forwarding
. 두 대의 컴퓨터를 호출하겠습니다. 그 laptop
중 server
후자는 장기 실행 작업을 실행하고 있습니다. 내 생각에 이것의 가장 큰 장점은 커피숍에서 노트북으로 연결하는 것과 같은 임시 설정에 있다고 생각합니다. 이 사용 사례의 경우 NAT 뒤에서 실행되며 PNP를 사용하여 포트를 열지 못할 수도 있습니다. 일반적으로 서버에 아무것도 설치할 필요가 없습니다. 이것이 적용되지 않으면 노트북에서 SSH 서비스 설정에 대한 조언을 따르십시오.
노트북에서 SSH를 호출하고 원격 TCP 포트 4000을 로컬 포트 5000으로 전달하도록 요청합니다. 실제로 양쪽 끝에서 동일한 포트 번호를 사용하게 됩니다. 저는 무슨 일이 일어나고 있는지 더 명확하게 하기 위해 다른 포트 번호를 사용했습니다. 여기서는 openssh 명령줄을 사용합니다.
ssh -R 4000:127.0.0.1:5000 username@server
tmux에 연결하고 작업을 시작한 다음 완료되면 포트 4000에 쓰도록 장기 실행 작업을 예약합니다.
(long_running job with params ; echo "$?" > /dev/tcp/127.0.0.1/4000) &
/dev/tcp가 없고 쉘에서 에뮬레이션되지 않은 경우 다음과 같은 것을 사용할 수 있습니다.echo "$?" | netcat 127.0.0.1 4000
동시에 랩톱은 아마도 다른 창에서 포트 5000의 연결을 수신하고 있습니다.
netcat -l -p 5000; do_something_to_alert_the_local_user.
netcat은 서버가 암호화된 SSH 터널을 통해 포트 5000으로 전달되는 포트 4000에 연결될 때까지 기다리는 것을 차단합니다. 에코가 끝날 때 연결이 닫히면 로컬이 netcat
종료되고 do_something_to_alert_the_local_user가 실행됩니다.
답변2
가장 간단한 해결책은 tmux를 사용하여 종료하고 tmux detach를 실행하여 ssh 연결을 닫은 다음 알림을 보낸 다음 다시 연결하고 tmux에 다시 연결하는 것입니다. 예를 들어 스크립트를 사용하면
ssh -t remote tmux
notify-send done
ssh -t remote tmux attach
tmux를 실행하고 장기 실행 명령을 시작한 다음 미리 명령을 입력합니다.
tmux detach
긴 명령이 완료되면 실행됩니다. 이렇게 하면 tmux가 닫히고 SSH가 닫히며 알림 전송 시 데스크톱 메시지가 표시됩니다. 새 SSH는 중단한 위치에 정확히 다시 연결됩니다.
답변3
@icarus의 솔루션에 대한 후속 조치를 취하려면 대신 다음 명령을 사용하십시오.
echo "$?" | netcat 127.0.0.1 4000 -q 0
그렇지 않으면 netcat은 무기한 대기하고 연결을 닫지 않습니다. 또는 SSH 호스트에서 로컬 호스트로 데이터를 전송하려는 경우 다음과 같이 수신할 수 있습니다.
SUM=$(netcat -l -p 5000); notify-send $SUM
답변4
클라이언트에서 OpenSSH 서버를 실행하는 경우 특정 키에 대해 특정 명령이 실행되도록 구성할 수 있습니다. 올바르게 완료되면 이 키는 이 알림을 트리거하는 데만 사용할 수 있으며 명백히 사악한 작업에는 사용할 수 없습니다.
혼란을 덜기 위해(이 경우 우리 둘 다 클라이언트 또는 서버 작업을 수행하기 때문에) 긴 작업을 시작하기 위해 원격 서버에 연결하는 클라이언트인 로컬 시스템을 호출하겠습니다.앨리스.단발그런 다음 서버는 그곳에서 컴파일 작업을 시작하고 Alice는 서버에서 작업 완료에 대한 알림을 받습니다.
이렇게 하려면 기본적으로 키 생성을 사용한 ssh-keygen -f notif_key
다음 공개 키( notif_key.pub
)를 별도의 줄에 Alice에 추가합니다 .ssh/authorized_keys
. 단, 앞에는 다음이 추가됩니다.
command="/path/to/notifier.sh \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa …
( ssh-rsa …
공개 키를 나타냅니다.)
notifier.sh
는 Alice 측의 스크립트로, 통지 명령을 호출합니다(물론 가능하면 즉시 시작할 수 있습니다. 전체 행이 셸에서 실행된다는 점만 참고하세요).
그런 다음 Bob 측에서 다음을 사용하여 Alice 측에서 알림을 트리거 ssh
할 수 있습니다 tmux
.
time-consuming-command; ssh -i notif_key user@alice_pc foobar
그게 다야!
그런데 는 force 명령으로 전달될 $SSH_ORIGINAL_COMMAND
명령에 대한 모든 추가 명령줄에 대한 자리 표시자입니다 . ssh
예를 들어 이 방법으로 여러 작업을 동시에 실행할 때 Bob의 특정 알림을 사용자 정의할 수 있습니다.
notifier.sh
이를 염두에 둔 예:
#!/bin/sh
some-notification-command --message "Task '$*' is done!"
echo 'Note to Bob: Alice has been notified.'
전체적으로 이 솔루션은 최적과는 거리가 멀습니다. 클라이언트에 OpenSSH 서버가 필요하며 구성하기가 매우 번거롭습니다. 더 나은 해결책이 있기를 바랍니다.