SSH 연결에서 완전히 연결이 끊긴 원격 명령 실행

SSH 연결에서 완전히 연결이 끊긴 원격 명령 실행

나는 컴퓨터 2대 localpcremoteserver.

localpc에서 몇 가지 명령을 실행 해야 합니다 remoteserver. 해야 할 일 중 하나는 몇 시간 동안 실행되는 백업 스크립트를 시작하는 것입니다. 나는 명령이 localpc"시작"된 다음 처음에는 존재하지 않았던 remoteserver것처럼 완전히 독립적으로 실행되기를 원합니다.localpc

지금까지 내가 한 일은 다음과 같습니다.

remoteserver스크립트 포함:

/root/backup.sh

localpc이것을 실행할 계획:

ssh root@remoteserver 'nohup /root/backup.sh' &

내가 이 일을 제대로 하고 있는 걸까? 더 좋은 방법이 있나요? 내가 이렇게 하면 문제가 생길까?

답변1

가깝지만 정확하지는 않습니다.

어떤 터미널과도 독립적

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

원격 프로세스가 소켓을 여는 동안 SSH 세션은 닫히지 않으므로 SSH 소켓에 연결된 모든 파일 설명자를 닫아야 합니다. 스크립트 출력에 관심이 없는 경우(아마도 스크립트 자체가 로그 파일 쓰기를 담당하기 때문일 수 있음)로 리디렉션하십시오 /dev/null(그러나 이렇게 하면 스크립트를 시작할 수 없는 등의 오류가 숨겨집니다).

이것을 사용하면 nohup여기서는 유용한 효과가 없습니다. nohup프로그램의 제어 터미널이 사라지면 실행을 예약한 프로그램은 HUP 신호를 받지 못하지만 애초에 터미널이 없으므로 갑자기 프로세스에 SIGHUP 신호가 전송되지 않습니다. 또한 nohup표준 출력 및 표준 오류(표준 입력은 아님)가 파일로 리디렉션되지만 터미널에 연결되어 있는 경우에만 그렇지 않습니다.

터미널에서 분리

 aaron@localpc$ ssh root@remoteserver
 root@remoteserver# nohup /root/backup.sh </dev/null &
 nohup: appending output to `nohup.out'
 [1] 12345
 root@remoteserver# exit
 aaron@localpc$ 

nohup스크립트를 수신하지 않도록 제어 터미널에서 스크립트를 분리하는 데 사용됩니다.한숨을 쉬다터미널이 사라질 때. nohup또한 스크립트의 표준 출력 및 표준 오류를 ( nohup.out터미널에 연결된 경우)이라는 파일로 리디렉션합니다. 표준 입력을 직접 처리해야 합니다.

원격 단말기 예약

명령을 원격 터미널에서 실행하고 SSH 세션에 연결하지 않으려면 터미널 멀티플렉서에서 실행하십시오.화면또는멀티플렉서.

ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'

screen -S backup -rd나중에 해당 시스템에서 루트로 호출하여 스크립트를 실행하는 터미널에 다시 연결할 수 있습니다.

원격 명령 자동화

보안을 강화하려면 직접 원격 루트 로그인을 너무 광범위하게 열지 마십시오. 개인 키 쌍을 생성하고 강제 명령을 내립니다./root/.ssh/authorized_keys. 공개 키 파일의 내용은 이 키를 특정 명령을 실행하는 데만 사용할 수 있도록 지정하는 쉼표로 구분된 옵션 목록을 추가하는 것입니다. 옵션과 키를 모두 한 줄에 입력하세요.AAAA…== [email protected]command="…"

command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== [email protected]

답변2

screen진정한 독립 실행형 명령을 얻으려면 원격 호스트에서 다음을 사용해야 합니다 .

ssh root@remoteserver screen -d -m ./script

답변3

이 스레드는 매우 유용하지만 내 솔루션은 달라야 합니다.

필요하지 않은 화면 프로세스를 계속 실행하기 때문에 화면 솔루션이 마음에 들지 않습니다. 리디렉션 및 nohups는 다음과 같이 사용됩니다.

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

ssh 명령과 함께 사용하면 작동하지 않습니다.

원격 시스템에서 실제 스크립트를 실행하는 래퍼 스크립트를 만들었습니다. 래퍼 스크립트는 리디렉션 및 nohup을 설정합니다. 이 같은:

backupwrapper.sh:
nohup backup.sh > /dev/null 2>&1 &

그런 다음 내 클라이언트 컴퓨터에서 실행합니다(리디렉션 없음).

# ssh remotemachine "backupwrapper.sh"
#

ssh 명령이 즉시 반환되고 연결이 종료되며 스크립트가 계속 실행됩니다.

답변4

~처럼닐스 라고, 루트가 SSH를 통해 로그인하도록 허용하는 것은 보안상 위험합니다. 로그가 없는 시스템에서는 실질적인 작업을 실행하지 않는 것이 좋습니다. 문제가 발생하면 문제 해결 메시지를 받고 싶을 것입니다. 이 작업을 수행하는 방법을 보여주는 다른 답변이 있습니다. 그러나 나는 당신이 요구하는 것을 성취하는 방법을 제안합니다. 그것은 모두 sh(1)에 내장되어 있습니다. GNU 화면이 필요하지 않습니다(비록 그것이 영리한 해결책이라고 생각하지만). 다음 문자열을 명령에 추가하세요 >&- 2>&- <&- &. >&-표준 출력 종료를 나타냅니다. 2>&-stderr을 닫는 것을 의미합니다. <&-표준 입력 종료를 나타냅니다. &백그라운드에서 실행되는 것을 의미합니다.

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

관련 정보