Golang: 로컬 SSH Config를 읽어 원격 서버 연결
James Reed
Infrastructure Engineer · Leapcell

Go 애플리케이션을 개발하면서 SSH를 통해 원격 서버에 연결해야 할 때 로컬 SSH 구성을 활용하면 프로세스를 간소화할 수 있습니다. 이 접근 방식을 사용하면 Go 애플리케이션이 미리 정의된 연결 설정을 활용하여 일관성과 효율성을 높일 수 있습니다.
Key Takeaways
- Go 애플리케이션은
~/.ssh/config
를 활용하여 SSH 연결을 간소화할 수 있습니다. github.com/kevinburke/ssh_config
패키지는 Go에서 SSH 구성 파일 구문 분석에 도움이 됩니다.golang.org/x/crypto/ssh
패키지를 사용하면 Go에서 SSH 클라이언트를 구현할 수 있습니다.
로컬 SSH 구성 파일 이해
일반적으로 ~/.ssh/config
에 있는 SSH 클라이언트 구성 파일을 사용하면 사용자가 다양한 호스트에 대한 연결 매개변수를 정의할 수 있습니다. 이 파일의 표준 항목은 다음과 같습니다.
Host example HostName example.com User your-username Port 22 IdentityFile ~/.ssh/id_rsa
이 구성에서:
- Host: 호스트의 별칭; SSH 명령에서 바로 가기로 사용됩니다.
- HostName: 원격 서버의 실제 도메인 또는 IP 주소입니다.
- User: SSH 연결에 대한 사용자 이름입니다.
- Port: SSH 서비스가 실행 중인 포트입니다(기본값은 22).
- IdentityFile: 인증을 위한 개인 키의 경로입니다.
이러한 설정을 구성하면 다음과 같은 간단한 명령을 사용하여 원격 서버에 연결할 수 있습니다.
ssh example
Go에서 SSH 구성 통합
Go 애플리케이션에서 이러한 SSH 구성을 읽고 활용하려면 다음 단계를 따르세요.
-
SSH 구성 파일 읽기:
~/.ssh/config
파일을 열고 구문 분석하여 필요한 호스트 구성을 검색합니다. -
호스트 정보 추출: 애플리케이션이 연결해야 하는 특정 호스트 항목을 식별하고
HostName
,User
,Port
및IdentityFile
과 같은 매개변수를 추출합니다. -
Go에서 SSH 클라이언트 구성: 추출된 매개변수를 사용하여 Go 애플리케이션 내에서 SSH 클라이언트를 설정합니다.
Go에서 솔루션 구현
Go의 golang.org/x/crypto/ssh
패키지는 SSH 클라이언트 구현을 용이하게 합니다. 그러나 SSH 구성 파일을 기본적으로 구문 분석하지는 않습니다. 이러한 격차를 해소하기 위해 SSH 구성 파일을 구문 분석하는 기능을 제공하는 github.com/kevinburke/ssh_config
패키지를 사용할 수 있습니다.
먼저 패키지를 설치합니다.
go get github.com/kevinburke/ssh_config
그런 다음 다음 코드를 구현하여 SSH 연결을 설정합니다.
package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "github.com/kevinburke/ssh_config" "golang.org/x/crypto/ssh" ) func main() { host := "example" // SSH 구성에 정의된 별칭입니다. // SSH 구성 파일 찾기 sshConfigPath := filepath.Join(os.Getenv("HOME"), ".ssh", "config") // SSH 구성 파일 열기 및 구문 분석 configFile, err := os.Open(sshConfigPath) if err != nil { log.Fatalf("SSH 구성 파일을 열지 못했습니다: %v", err) } defer configFile.Close() sshConfig, err := ssh_config.Decode(configFile) if err != nil { log.Fatalf("SSH 구성 파일을 구문 분석하지 못했습니다: %v", err) } // 호스트에 대한 관련 구성 추출 hostname := sshConfig.Get(host, "HostName") if hostname == "" { log.Fatalf("호스트에 대한 HostName을 찾을 수 없습니다: %s", host) } user := sshConfig.Get(host, "User") if user == "" { user = os.Getenv("USER") // 지정되지 않은 경우 현재 사용자로 기본 설정 } port := sshConfig.Get(host, "Port") if port == "" { port = "22" // 기본 SSH 포트 } identityFile := sshConfig.Get(host, "IdentityFile") if identityFile == "" { identityFile = filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa") // 기본 키 } // 개인 키 읽기 key, err := ioutil.ReadFile(identityFile) if err != nil { log.Fatalf("개인 키를 읽을 수 없습니다: %v", err) } // 개인 키에 대한 서명자 만들기 signer, err := ssh.ParsePrivateKey(key) if err != nil { log.Fatalf("개인 키를 구문 분석할 수 없습니다: %v", err) } // SSH 클라이언트 구성 설정 clientConfig := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ ssh.PublicKeys(signer), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 단순성을 위해; 호스트 키 확인 구현을 고려하십시오. } // SSH 서버에 연결 connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", hostname, port), clientConfig) if err != nil { log.Fatalf("다이얼에 실패했습니다: %v", err) } defer connection.Close() // 이제 'connection'을 사용하여 원격 서버와 상호 작용할 수 있습니다. // 예를 들어 세션 열기: session, err := connection.NewSession() if err != nil { log.Fatalf("세션을 만들지 못했습니다: %v", err) } defer session.Close() // 원격 서버에서 명령 실행 output, err := session.CombinedOutput("uname -a") if err != nil { log.Fatalf("명령을 실행하지 못했습니다: %v", err) } fmt.Println(string(output)) }
FAQs
SSH 구성을 사용하면 보안이 향상되고, 하드 코딩된 자격 증명을 피할 수 있으며, 환경 전반에서 일관성을 유지할 수 있습니다.
github.com/kevinburke/ssh_config
패키지는 SSH 구성을 프로그래밍 방식으로 읽고 추출할 수 있습니다.
파서는 SSH의 표준 우선 순위 규칙에 따라 가장 구체적인 일치 항목을 사용합니다.
주요 고려 사항
-
HostKeyCallback: 위의 예에서는 단순성을 위해
ssh.InsecureIgnoreHostKey()
가 사용되었으며, 호스트 키 확인을 무시합니다. 프로덕션 애플리케이션의 경우 보안을 위해 적절한 호스트 키 확인을 구현합니다. -
오류 처리: SSH 구성 파일에 항목이 없거나 잘못된 정보가 포함된 시나리오를 관리하기 위해 강력한 오류 처리를 보장합니다.
-
보안: 항상 개인 키를 보호하고 애플리케이션 내에서 중요한 정보를 하드 코딩하지 마십시오.
Go 애플리케이션을 로컬 SSH 구성과 통합하면 기존 구성을 활용하고 개발 환경 전체에서 일관성을 유지하면서 SSH 연결을 보다 효율적으로 관리할 수 있습니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트 무료 배포
- 사용량에 대해서만 지불하세요. 요청도 없고, 요금도 없습니다.
뛰어난 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하세요.
- 예: 25달러로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI입니다.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합입니다.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅입니다.
간편한 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 확장입니다.
- 운영 오버헤드가 전혀 없습니다. 구축에만 집중하세요.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ