Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

Visual Studio의 Connection Manager 기능(Remote SSH 관리)을 위한 명령행 도구

Visual Studio가 없는 빌드 머신에서 리눅스 프로젝트를 빌드하려는 경우,

Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

원격 빌드 머신이 등록되어 있지 않기 때문에 다음과 같은 식의 오류가 발생합니다.

C:\temp> msbuild TestApp.vcxproj Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 2019-06-12 오후 2:22:46.
Project "c:\temp\TestApp.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
Touching "c:\temp\TestApp\obj\x86\Debug\TestApp.tlog\unsuccessfulbuild".
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Application Type\Linux\1.0\Linux.targets(100,5): error : There are not remote machines configured for remote builds. Please configure a machine using Tools | Options | Cross Platform | Connection Manager. [c:\temp\TestApp.vcxproj] Done Building Project "c:\temp\TestApp.vcxproj" (default targets) -- FAILED.

...[생략]...


해결을 위해서는 Visual Studio를 실행해야 하는데 ^^; 빌드 머신에 설치하기는 좀 그렇죠. 검색해 보면 다행히 해결책이 있습니다.

Is there any way to add connections to cross platform connection manager programatically?
; https://developercommunity.visualstudio.com/content/problem/540405/is-there-any-way-to-add-connections-to-cross-platf.html

정리해 보면, Visual Studio의 Connection Manager는 연결 정보를 다음의 파일에 보관합니다.

%LOCALAPPDATA%\Microsoft\Linux\User Data\3.0\store.xml

임의로 편집할 수 있다면 빌드 머신에 해당 XML을 생성해 연결 정보를 설정할 수 있겠지만 아쉽게도 "hash" 값이 담겨 있으므로 그럴 수가 없습니다. 다행히, 이것을 프로그램으로 접근할 수 있는 방법이 있습니다.

우선 다음의 DLL을 참조 추가하면,

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PrivateAssemblies\liblinux.dll

현재 store.xml에 등록된 연결 정보를 다음과 같은 식으로 열람할 수 있고,

ConnectionInfoStore store = new ConnectionInfoStore();

foreach (var item in store.Connections)
{
    Console.WriteLine($"ID: {item.Id}");
    Console.WriteLine($"LastUpdated: {item.LastUpdated}");
    Console.WriteLine($"PersistenceMode: {item.PersistenceMode}");
    foreach (string propKey in item.Properties)
    {
        Console.WriteLine($"{propKey}: {item.Properties[propKey]}");
    }
    Console.WriteLine();
}

대략 다음과 같은 출력을 얻을 수 있습니다.

ID: 409410665
LastUpdated: 2019-06-13 오전 10:06:21
PersistenceMode: Disk
SystemId: Ubuntu
Platform: x64
IsWsl: False
Sysroot: %LOCALAPPDATA%\Microsoft\Linux\HeaderCache\1.0\409410665
SysrootUpdate: 132048615813208963
SysrootEnabled: true
HomeDirectory: /home/testusr

ID: 1356110592
LastUpdated: 2019-06-12 오후 2:42:19
PersistenceMode: Disk
SystemId: Ubuntu
Platform: x64
IsWsl: False
Sysroot: %LOCALAPPDATA%\Microsoft\Linux\HeaderCache\1.0\1356110592
SysrootUpdate: 132030508772785837
SysrootEnabled: true
HomeDirectory: /home/testusr

새로운 연결도 등록해 볼까요? ^^

private static void AddConnectionInfo(ConnectionInfoStore store, string hostNameOrAddress, string userId, string userPassword)
{
    SecureString ss = new SecureString();
    foreach (char ch in userPassword)
    {
        ss.AppendChar(ch);
    }

    liblinux.PasswordConnectionInfo pci = new liblinux.PasswordConnectionInfo(hostNameOrAddress, userId, ss);
    store.Add(pci);
    store.Save();
}

등록 후 다시 열람을 해보면 대략 다음과 같은 정보를 얻게 됩니다.

ID: 409410665
LastUpdated: 0001-01-01 오전 12:00:00
PersistenceMode: Disk

결과를 보면 "Properties"에 있는 항목들이 전혀 열람이 안 된 것인데요, 사실 연결 정보만 구성하고 헤더 파일 자동 구성 작업이 비주얼 스튜디오에 의해 이뤄지지 않는다면 다음과 같은 식으로만 store.xml에 등록되기 때문입니다.

<?xml version="1.0" encoding="utf-8"?>
<store hash="51970831b3fef09afccf5...[생략]...927cf8848375f08fb7f27620e">
  <entries>
    <entry id="409410665">
      <hostname>192.168.100.50</hostname>
      <port>22</port>
      <dateAdded>목-13-6 2019 10:50:22</dateAdded>
      <credentials>
        <lastsuccessful>월-1-1 0001 00:00:00</lastsuccessful>
        <lastfailed>월-1-1 0001 00:00:00</lastfailed>
        <lastupdated>월-1-1 0001 00:00:00</lastupdated>
        <username>testusr</username>
        <authenticationMethod>Password</authenticationMethod>
        <password>AQAAANCMn...[생략]...xWSNYXloQqXTA==</password>
      </credentials>
      <properties />
    </entry>
  </entries>
</store>

상관없습니다. 어쨌든 저렇게 등록되었다는 것만으로 비주얼 스튜디오는 리눅스 프로젝트 빌드 시 정상적으로 SSH 연결을 해 빌드를 수행합니다.

(첨부 파일은 이 글의 프로젝트를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]





[최초 등록일: ]
[최종 수정일: 6/13/2019 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer@outlook.com

비밀번호

댓글 쓴 사람
 




1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...
NoWriterDateCnt.TitleFile(s)
12023정성태9/19/20191180.NET Framework: 860. ServicePointManager.DefaultConnectionLimit와 HttpClient의 관계파일 다운로드1
12022정성태9/12/20192356개발 환경 구성: 458. C# 8.0 (Preview) 신규 문법을 위한 개발 환경 구성 [3]
12021정성태9/17/20206508도서: 시작하세요! C# 8.0 프로그래밍 [3]
12020정성태9/11/20191233VC++: 134. SYSTEMTIME 값 기준으로 특정 시간이 지났는지를 판단하는 함수
12019정성태9/11/2019922Linux: 23. .NET Core + 리눅스 환경에서 Environment.CurrentDirectory 접근 시 주의 사항
12018정성태9/25/2019809오류 유형: 567. IIS - Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. (D:\lowSite4\web.config line 11)
12017정성태9/11/20191256오류 유형: 566. 비주얼 스튜디오 - Failed to register URL "http://localhost:6879/" for site "..." application "/". Error description: Access is denied. (0x80070005)
12016정성태9/5/20192012오류 유형: 565. git fetch - warning: 'C:\ProgramData/Git/config' has a dubious owner: '(unknown)'.
12015정성태9/3/20192887개발 환경 구성: 457. 윈도우 응용 프로그램의 Socket 연결 시 time-out 시간 제어
12014정성태6/23/20201593개발 환경 구성: 456. 명령행에서 AWS, Azure 등의 원격 저장소에 파일 관리하는 방법 - cyberduck/duck 소개
12013정성태8/28/20191500개발 환경 구성: 455. 윈도우에서 (테스트) 인증서 파일 만드는 방법
12012정성태8/28/20192144.NET Framework: 859. C# - HttpListener를 이용한 HTTPS 통신 방법
12011정성태8/27/20191561사물인터넷: 57. C# - Rapsberry Pi Zero W와 PC 간 Bluetooth 통신 예제 코드파일 다운로드1
12010정성태8/27/20191187VS.NET IDE: 138. VSIX - DTE.ItemOperations.NewFile 메서드에서 템플릿 이름을 다국어로 설정하는 방법
12009정성태8/26/20191224.NET Framework: 858. C#/Windows - Clipboard(Ctrl+C, Ctrl+V)가 동작하지 않는다면?파일 다운로드1
12008정성태8/26/20191147.NET Framework: 857. UWP 앱에서 SQL Server 데이터베이스 연결 방법
12007정성태8/24/20191227.NET Framework: 856. .NET Framework 버전을 올렸을 때 오류가 발생할 수 있는 상황
12006정성태8/23/20192486디버깅 기술: 129. guidgen - Encountered an improper argument. 오류 해결 방법 (및 windbg 분석) [1]
12005정성태8/13/20192278.NET Framework: 855. 닷넷 (및 VM 계열 언어) 코드의 성능 측정 시 주의할 점 [2]파일 다운로드1
12004정성태8/12/20192853.NET Framework: 854. C# - 32feet.NET을 이용한 PC 간 Bluetooth 통신 예제 코드
12003정성태8/12/20191738오류 유형: 564. Visual C++ 컴파일 오류 - fatal error C1090: PDB API call failed, error code '3'
12002정성태8/12/20191545.NET Framework: 853. Excel Sheet를 WinForm에서 사용하는 방법 - 두 번째 이야기 [5]
12001정성태8/10/20192165.NET Framework: 852. WPF/WinForm에서 UWP의 기능을 이용해 Bluetooth 기기와 Pairing하는 방법
12000정성태8/9/20191613.NET Framework: 851. WinForm/WPF에서 Console 창을 띄워 출력하는 방법파일 다운로드1
11999정성태8/1/20191079오류 유형: 563. C# - .NET Core 2.0 이하의 Unix Domain Socket 사용 시 System.IndexOutOfRangeException 오류
11998정성태7/30/20191347오류 유형: 562. .NET Remoting에서 서비스 호출 시 SYN_SENT로 남는 현상파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...