원격 Linux 서버에서 로컬 스크립트를 실행하는 방법

게시 됨: 2022-09-10
Linux 명령줄 인터페이스를 보여주는 파란색 배경의 노트북입니다.
Fatmawati achmad zaenuri/Shutterstock.com

반복적인 작업을 스크립팅하면 시스템 관리의 효율성이 향상됩니다. 로컬 컴퓨터에는 훌륭하지만 원격 서버를 감독한다면 어떻게 될까요? 원격 컴퓨터에서 로컬 스크립트를 실행할 수 있습니까? 예!

원격 연결

원격 시스템 관리에는 일반적으로 보안 연결을 통해 원격 컴퓨터에 연결하는 작업이 포함됩니다. SSH 연결은 원격 컴퓨터에서 명령 프롬프트를 제공합니다. 그런 다음 바로 진행하여 필요한 시스템 유지 관리를 수행할 수 있습니다.

셸 스크립팅은 여러 작업을 하나의 명령줄 명령으로 결합하여 마치 프로그램인 것처럼 실행할 수 있는 스크립트로 일련의 명령을 래핑할 수 있도록 하여 도움이 됩니다.

시간이 지남에 따라 스크립트를 수정하고 개선할 것입니다. 관리할 원격 컴퓨터가 많은 경우 각 서버에 있는 각 스크립트의 복사본을 최신 상태로 유지하는 것은 힘들고 성가신 오버헤드입니다. 그것은 그 자체로 관리 작업이 되며 스크립트를 사용하여 제공해야 하는 시간 절약을 먹습니다.

이상적인 솔루션은 스크립트를 로컬 컴퓨터에 유지하고 SSH 연결을 통해 원격 컴퓨터에서 실행할 수 있도록 하는 것입니다. 그러면 중앙 집중식 스크립트 모음으로 관리가 간소화되고 모든 컴퓨터에서 동일한 최신 스크립트가 실행됩니다.

Bash와 SSH는 그렇게 하는 방법을 제공합니다.

암호 없는 SSH 연결

이를 수행하는 가장 좋은 방법은 SSH 키를 사용하여 암호 없는 연결을 사용하는 것입니다. 로컬 컴퓨터에서 SSH 키를 생성하여 각 원격 컴퓨터로 보내면 매번 암호를 입력하지 않고도 원격 컴퓨터에 안전하고 편리하게 연결할 수 있습니다.

Linux 셸에서 SSH 키를 만들고 설치하는 방법
관련 Linux 셸에서 SSH 키를 만들고 설치하는 방법

SSH 키는 처음 사용하는 사용자에게는 겁이 날 수 있지만 실제로는 어렵지 않습니다. 생성하기 쉽고 원격 서버에 설치하기 쉬우며 SSH와 함께 사용할 때 마찰이 없습니다. 유일한 전제 조건은 원격 컴퓨터에 SSH 데몬 sshd 가 실행되고 있고 원격 컴퓨터에 사용자 계정이 있다는 것입니다.

이미 원격 시스템 관리를 수행하고 있다면 이 두 가지 요구 사항이 모두 충족되어야 합니다.

SSH 키 쌍을 생성하려면 다음을 입력하십시오.

 SSH 키젠

"fedora-36.local"이라는 컴퓨터에 "dave"라는 계정이 있는 경우 다음 명령을 사용하여 SSH 공개 키를 보내고 설치할 수 있습니다.

 ssh-copy-id [email protected]

이제 일반적인 방법으로 SSH 연결을 하면 SSH 키를 사용하여 인증됩니다. 암호를 묻지 않고 원격 서버의 명령 프롬프트로 이동합니다.

 ssh [email protected]

원격으로 로컬 스크립트 실행

이 테스트에서 원격 서버는 "fedora-36.local"이라는 Linux 컴퓨터입니다. SSH 키를 설정하고 로컬 컴퓨터에서 원격 서버로의 암호 없는 연결을 테스트했습니다.

우리의 스크립트는 매우 간단합니다. 원격 서버의 "timestamp.txt"라는 파일에 타임스탬프를 씁니다. 스크립트는 exit 명령으로 끝납니다. 이것은 중요합니다. 일부 이전 시스템에서는 스크립트가 완료될 때까지 실행될 수 있지만 SSH 연결은 열린 상태로 유지됩니다.

 #!/bin/bash

날짜 >> timestamp.txt

0번 출구

이 텍스트를 편집기에 복사하고 "local.sh"로 저장한 다음 chmod 를 사용하여 실행 가능하게 만듭니다.

 chmod +x local.sh 

chmod를 사용하여 스크립트를 실행 가능하게 만들기

로컬 컴퓨터에서 다음과 같이 스크립트를 시작합니다.

 ssh [email protected] 'bash -s' < local.sh 

SSH를 통해 원격 서버에서 실행할 로컬 스크립트 시작

작동 방식은 다음과 같습니다.

  • ssh [email protected] : 원격 시스템에 대한 SSH 연결입니다. 이것은 ssh 명령, 원격 서버의 기존 사용자 계정 및 원격 서버의 주소를 사용합니다.
  • 'bash -s' : 이것은 Bash가 표준 입력 스트림에서 명령을 읽도록 합니다. 이를 통해 Bash는 리디렉션되거나 파이프된 입력을 읽을 수 있습니다.
  • < local.sh : 스크립트를 Bash로 리디렉션합니다.

스크립트가 실행되면 로컬 시스템의 명령 프롬프트로 돌아갑니다. 원격 시스템으로 이동하여 cat을 사용하여 "timestamp.txt" 파일 내부를 볼 수 있습니다.

 고양이 타임스탬프.txt 

마지막(현재만) 연결의 타임스탬프를 볼 수 있습니다. 로컬 스크립트를 여러 번 더 실행하면 해당 타임스탬프가 원격 파일에 추가됩니다.

 고양이 타임스탬프.txt 

물론 실제 상황에서는 스크립트가 더 유용한 작업을 수행합니다. 그러나 우리의 사소한 예에서도 로컬 스크립트가 원격 서버에서 실행되고 있음을 보여줍니다.

스크립트에 인수 전달

스크립트에 명령줄 인수를 전달할 수 있습니다. 세 개의 명령줄 매개변수를 예상하도록 스크립트를 수정합니다. 타임스탬프와 함께 "timestamp.txt" 파일로 리디렉션됩니다.

이 스크립트를 "local2.sh"로 저장하고 chmod 로 실행 가능하게 만드십시오.

 #!/bin/bash

echo "$1 $2 $3" >> timestamp.txt
날짜 >> timestamp.txt

0번 출구

우리가 사용해야 하는 명령은 몇 가지 변경 사항을 제외하고 이전 예제와 유사합니다.

 ssh [email protected] "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "기사" 

SSH를 통해 원격 서버에서 실행할 명령줄 매개변수를 사용하여 로컬 스크립트 시작

이중 하이픈 " -- "은 Bash에게 다음에 오는 내용이 ssh 명령에 대한 명령줄 매개변수로 간주되어서는 안 된다는 것을 알려줍니다. 스크립트에 대한 세 개의 매개변수는 평소와 같이 스크립트 이름을 따릅니다. "How-To\ Geek" 매개변수에서 공백을 이스케이프하기 위해 백슬래시 " \ "를 사용했다는 점에 유의하십시오.

원격 서버에서 매개변수가 올바르게 수신되고 처리되었는지 cat 를 통해 확인할 수 있습니다.

 고양이 타임스탬프.txt 

스크립트에 대한 매개변수가 원격 서버에서 올바르게 수신되고 처리되었는지 확인

원격으로 스크립트 섹션 실행

원격 서버에서 필요한 작업을 결정하기 위해 일부 로컬 처리를 수행해야 하는 스크립트가 있는 경우 해당 스크립트에 바로 섹션을 추가하여 원격 작업을 수행할 수 있습니다.

Linux의 Bash에서 "Here Documents"를 사용하는 방법
관련 Linux의 Bash에서 "Here Documents"를 사용하는 방법

여기 문서를 사용하여 이를 달성할 수 있습니다. 여기 문서를 사용하면 스크립트의 레이블이 지정된 섹션에서 명령으로 줄을 리디렉션할 수 있습니다. 로컬 처리는 here 문서 위와 아래에서 수행할 수 있습니다.

이것은 here 문서를 포함하는 스크립트 "local3.sh"입니다.

 #!/bin/bash

# 로컬 처리는 여기에서 수행할 수 있습니다.

# 원격 처리는 여기에서 수행됩니다.
ssh -T [email protected] << _remote_commands

# 원격으로 실행할 명령이 여기에 추가됩니다.
cd /home/dave/문서
# 등.

# 마지막으로 타임스탬프 파일을 업데이트합니다.
echo "Script3.sh:" $(날짜) >> /home/dave/timestamp.txt

# 이것은 리디렉션의 끝을 표시하는 레이블입니다.
_remote_commands

# 여기서 더 많은 로컬 처리를 수행할 수 있습니다.

0번 출구

이전과 동일한 연결 세부 정보로 ssh 명령을 사용하고 있습니다. "fedora-36.local"이라는 원격 서버에 사용자 "dave"로 연결하고 있습니다. 우리는 또한 -T (의사 터미널 할당 비활성화) 옵션을 사용하고 있습니다. 이것은 원격 서버가 이 연결을 위한 대화형 터미널을 제공하는 것을 방지합니다.

" << " 리디렉션 뒤에는 레이블 이름이 옵니다. 이 예에서는 "_remote_commands"를 사용하고 있습니다. 이 레이블에는 특별한 것이 없으며 단순히 레이블입니다.

리디렉션 다음 행에 나타나는 모든 명령은 SSH 연결을 통해 전송됩니다. 레이블이 발견되면 리디렉션이 중지됩니다. 그런 다음 스크립트 실행은 레이블 다음 행에서 계속됩니다.

로컬/원격 혼합 처리 스크립트를 실행해 보겠습니다.

 ./local3.sh 

로컬 및 원격 처리를 혼합하여 script3.sh 시작

예상대로 "timestamp.txt" 파일에 새 항목이 표시됩니다.

 고양이 타임스탬프.txt 

도달 범위 확장

로컬에서 작성, 저장 및 유지 관리되는 스크립트를 원격으로 실행할 수 있어 편리한 관리 도구를 제공합니다. 정확히 동일한 버전의 스크립트가 모든 원격 서버에서 실행된다는 사실을 알고 있으면 관리가 훨씬 쉬워집니다.

관련: Cockpit 웹 인터페이스로 Linux 서버를 관리하는 방법