성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>리눅스 환경에서 TFS 서버 연동</h1> <p> 리눅스 환경의 tfvc 명령행 버전을,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > TFVC Command Line Client ; <a target='tab' href='https://github.com/Microsoft/azure-repos-vscode/blob/master/TFVC_README.md#tfvc-command-line-client'>https://github.com/Microsoft/azure-repos-vscode/blob/master/TFVC_README.md#tfvc-command-line-client</a> </pre> <br /> 다음과 같이 다운로드해 압축을 해제합니다. (여기서는 temp 폴더 하위에 설치)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ mkdir temp $ cd temp $ curl -L https://github.com/Microsoft/team-explorer-everywhere/releases/download/v14.114.0/TEE-CLC-14.114.0.zip --output tee-clc.zip $ unzip tee-clc.zip $ cd TEE-CLC-14.114.0 </pre> <br /> 그럼 "tf" 파일명의 shell 스크립트 파일이 있을 텐데 그걸 이용해 TFS와 연동하게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 만약 java가 없다면 설치해야 하는데요, 우분투 16.04의 경우 "default-jdk"를 설치합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ sudo apt install default-jdk </pre> <br /> 그런데 18.04의 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ java Command 'java' not found, but can be installed with: sudo apt install default-jre sudo apt install openjdk-11-jre-headless sudo apt install openjdk-8-jre-headless </pre> <br /> 여러 가지 옵션이 있는데 이 중에서 openjdk-11의 경우 ./tf 스크립트가 실행은 되지만 아무런 출력 결과가 보이지 않게 되는데 아무래도 비정상 동작하는 것 같습니다. 따라서 8 버전의 자바를 설치하는 것이 좋습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ sudo apt install openjdk-8-jre-headless </pre> <br /> <hr style='width: 50%' /><br /> <br /> 여기까지 준비되었으면 "./tf"라고 실행 시 다음과 같은 식의 출력이 보입니다.<br /> <br /> <pre style='height: 400px; margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>./tf</span> Team Explorer Everywhere Command Line Client (version 14.114.0.201703081734) Available commands and their options: add [-lock:none|checkin|checkout] [-type:<value>] [-recursive] [-silent] [-noignore] <localItemSpec>... branch [-version:<value>] [-noget] [-lock:none|checkin|checkout] [-recursive] [-checkin] [-comment:<value>|@valuefile] [-author:<value>] [-notes:"note"="value"[;"note2"="value2"[;...]]|@notefile] <oldItemSpec> <newLocalItem> branches [-version:<value>] <itemSpec>... changeset [-latest] [-comment:<value>|@valuefile] [-notes:"note"="value"[;"note2"="value2"[;...]]|@notefile] [changenumber] checkin [-all] [-author:<value>] [-comment:<value>|@valuefile] [-notes:"note"="value"[;"note2"="value2"[;...]]|@notefile] [-override:<value>|@valuefile] [-recursive] [-validate] [-bypass] [-force] [-noautoresolve] [-associate:<workItemID>[,<workItemID>...]] [-resolve:<workItemID>[,<workItemID>...]] [-saved] [<itemSpec>...] checkout [-recursive] [-lock:none|checkin|checkout] [-type:<value>] <itemSpec>... delete [-lock:none|checkin|checkout] [-recursive] <itemSpec>... delete -detect [-lock:none|checkin|checkout] [-recursive] destroy [-keephistory] [-startcleanup] [-preview] [-silent] [-stopat:<value>] [-noprompt] itemspec1[;versionspec][;XdeletionID] [itemspec2...itemspecN] difference [-recursive] <itemSpec> <itemSpec2> difference [-shelveset:<value>] [-recursive] <shelvesetItemSpec> difference [-version:<value>] [-recursive] <itemSpec> dir [-version:<value>] [-recursive] [-folders] [-deleted] <itemSpec>... eula [-accept] get [-version:<value>] [-recursive] [-preview] [-force] [-all] [-overwrite] [-noautoresolve] [<itemSpec>...] getcs -changeset:changeset [-latest] help [-listexitcodes] [<command>] history [-version:<value>] [-stopafter:<value>] [-recursive] [-user:<value>] [-format:brief|detailed|xml] [-slotmode] [-itemmode] <itemSpec> info [-recursive] [-version:<value>] <itemSpec>... label [-owner:<value>] [-version:<value>] [-comment:<value>|@valuefile] [-child:fail|replace|merge] [-recursive] <labelName>[@<scope>] <itemSpec>... label -delete [-owner:<value>] [-version:<value>] <labelName>[@<scope>] labels [-owner:<value>] [-format:brief|detailed|xml] [<labelNameFilter>] lock [-recursive] [-lock:none|checkin|checkout] <itemSpec>... merge [-recursive] [-force] [-candidate] [-discard] [-version:<value>] [-lock:none|checkin|checkout] [-preview] [-baseless] [-nosummary] [-noimplicitbaseless] [-format:brief|detailed|xml] [-noautoresolve] <source> <destination> merges [-recursive] [-format:brief|detailed|xml] [<sourceItem>] <destinationItem> online [-adds] [-deletes] [-diff] [-exclude:<value>[,<value>]] [-recursive] [-preview] [<itemSpec>...] print [-version:<value>] <itemSpec> property [-output:<value>] [-recursive] [-version:<value>] <itemSpec> [<propertyname>] property -deleteall [-recursive] <itemSpec> property -deletevalues:<value>[,<value>] [-recursive] <itemSpec> property -setvalues:@valuefile|name1=value1[;name2=value2;name3=@valuefile;...] [-recursive] <itemSpec> reconcile [-teamProject:<value>] reconcile -buildName:<value> [-teamProject:<value>] [-recursive] [<itemSpec>...] reconcile -changeset:changeset [-recursive] [<itemSpec>...] reconcile -forgetBuild:<buildName> [-teamProject:<value>] rename [-lock:none|checkin|checkout] <oldItem> <newItem> resolve [-auto:AutoMerge|TakeTheirs|KeepYours|OverwriteLocal|DeleteConflict|KeepYoursRenameTheirs| External] [-preview] [-converttotype:<value>] [-recursive] [-newname:<value>] <itemSpec> resolve [-auto:AutoMerge|TakeTheirs|KeepYours|OverwriteLocal|DeleteConflict|KeepYoursRenameTheirs| External] [-preview] [-overridetype:<value>] [-recursive] [-newname:<value>] <itemSpec> resolvePath [-collection:<url>] [-workspace:<value>] <serverPath> resolvePath <serverPath> rollback -changeset:changesetfrom~changesetto [-recursive] [-lock:none|checkin|checkout] [-version:<value>] [-keepmergehistory] [-noautoresolve] [<itemSpec>...] rollback -toversion:versionspec [-recursive] [-lock:none|checkin|checkout] [-version:<value>] [-keepmergehistory] [-noautoresolve] <itemSpec>... shelve [-move] [-replace] [-comment:<value>|@valuefile] [-recursive] [-validate] [-saved] <shelvesetName[;owner]> <fileSpec>... shelve [-replace] [-comment:<value>|@valuefile] [-validate] [-saved] <shelvesetName[;owner]> shelve -delete [-collection:<url>] [-validate] [-saved] <shelvesetName[;owner]> shelvesets [-owner:<value>] [-format:brief|detailed|xml] [<shelvesetName>] status [-workspace:<value>] [-shelveset:<value>] [-format:brief|detailed|xml] [-recursive] [-user:<value>] [-nodetect] [<itemSpec>...] undelete [-noget] [-lock:none|checkin|checkout] [-newname:<value>] <itemSpec>[;deletionID]... undelete [-noget] [-lock:none|checkin|checkout] [-recursive] <itemSpec>[;deletionID]... undo [-recursive] <itemSpec>... unlabel [-recursive] <labelName>[@<scope>] <itemSpec>... unshelve [-move] [-recursive] [-nomerge] [-noautoresolve] [-format:brief|detailed|xml] <shelvesetName[;owner]> [<itemSpec>...] uu [-recursive] [-noprompt] <itemSpec>... workfold [-collection:<url>] [-workspace:<value>] <serverFolder> workfold [-map] [-collection:<url>] [-workspace:<value>] <serverFolder> <localFolder> workfold [-workspace:<value>] workfold <localFolder> workfold -cloak [-collection:<url>] [-workspace:<value>] <serverFolder>|<localFolder> workfold -decloak [-collection:<url>] [-workspace:<value>] <serverFolder>|<localFolder> workfold -unmap [-collection:<url>] [-workspace:<value>] <serverFolder>|<localFolder> workspace [-collection:<url>] [-comment:<value>|@valuefile] [-newname:<value>] [-filetime:current|checkin] [-permission:Private|PublicLimited|Public] [<workspacename;[workspaceowner]>] workspace -delete [-collection:<url>] [<workspacename;[workspaceowner]>] workspace -new [-noprompt] [-template:<value>] [-computer:<value>] [-comment:<value>|@valuefile] [-collection:<url>] [-location:server|local] [-filetime:current|checkin] [-permission:Private|PublicLimited|Public] [<workspacename;[workspaceowner]>] workspaces [-owner:<value>] [-computer:<value>] [-collection:<url>] [-format:brief|detailed|xml] [-updateUserName:<user@domain>|<domain\user>] [-updateComputerName:<value>] workspaceName workspaces -remove:<workspace1>[,<workspace2>,...] -collection:<url> Options accepted by most commands: [-login:domain\username,password] | [-login:username@domain,password] -collection:<url> -continueOnError -exitcode -help -noprompt -nosummary -outputSeparator:<value> -proxy:<url> -server:<url> -workspace:<value> Options may be started with any of: - For general help, view the 'help/index.htm' file installed with the program. For help on a specific command, supply the command name as an argument to the help command. For example: 'tf help checkin' </pre> <br /> 우선, eula 동의를 한 다음,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ./tf eula </pre> <br /> 현재의 우분투 컴퓨터를 위한 workspace를 하나 추가합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>~/temp/TEE-CLC-14.114.0/tf workspace -new -computer:ubuntu18 -collection:http://192.168.100.70:8080/tfs/defaultcollection -location:local</span> Default credentials are unavailable because no Kerberos ticket or other authentication token is available. Username: testad\testusr Password: Workspace 'ubuntu18' created. </pre> <br /> 생성된 workspace는 Visual Studio의 "소스 컨트롤 탐색기"에서도 확인할 수 있습니다.<br /> <br /> <img alt='tfs_linux_1.png' src='/SysWebRes/bbs/tfs_linux_1.png' /><br /> <br /> 자, 그럼 이제 workspace에 현재 컴퓨터의 로컬 경로와 서버 측의 Team 프로젝트에 대한 경로를 매핑시켜 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ mkdir testprj $ cd testprj ~/testprj$ ~/temp/TEE-CLC-14.114.0/tf workfold -map -collection:http://192.168.100.70:8080/tfs/defaultcollection -workspace:ubuntu18 $/testsolution/testprj ~/testprj -login:"testad\testusr" </pre> <br /> 서버 측 소스 컨트롤의 경로($/testsolution/testprj)를 우분투 로컬 PC의 경로(~/testprj)에 매핑시켰으니 이제 해당 프로젝트의 소스 코드를 가져올 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ~/testprj$ ~/temp/TEE-CLC-14.114.0/tf get . -recursive -login:"testad\testusr" </pre> <br /> 이 정도면, 대충 어떤 식으로 연동해야 할지 감이 올 것입니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 위의 실행 예제에도 나오지만, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Default credentials are unavailable because no Kerberos ticket or other authentication token is available. </pre> <br /> 매번 인증 정보를 입력해야 한다는 매우 불편한 점이 있습니다. 물론 명령행에 계정뿐만 아니라 암호까지 입력할 수 있지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ~/temp/TEE-CLC-14.114.0/tf get . -recursive -login:"testad\testusr,...password..." </pre> <br /> 누가 저런 식으로 ^^; 평문 입력을 하겠습니까? 이 문제를 해결하기 위해, 인증 정보를 저장하라는 환경 변수를 설정한 다음,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ export TF_AUTO_SAVE_CREDENTIALS="1" </pre> <br /> Kerberos 인증 모듈을 설치하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ sudo apt install krb5-user </pre> <br /> 이후의 명령어들은 다음과 같이 인증 정보 입력 없이 곧바로 실행됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ~/temp/TEE-CLC-14.114.0/tf get . -recursive All files up to date. </pre> <br /> <hr style='width: 50%' /><br /> <br /> tfvc가 비정상적으로 동작하고 있다면 로그 파일을 확인해야 합니다. tf 명령어마다 다음의 경로에 로그가 남겨지고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ~/.microsoft/Team\ Foundation/4.0/Logs/ </pre> <br /> 이를 확인하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ls ~/.microsoft/Team\ Foundation/4.0/Logs/ teamexplorer-clc-2019.06.17-13.45.48.log teamexplorer-soap-clc-2019.06.17-13.26.53.log $ cat ~/.microsoft/Team\ Foundation/4.0/Logs/teamexplorer-clc-2019.06.17-13.26.53.log </pre> <br /> 일례로, 다음은 krb5-user 모듈이 없는 상황에서 TF_AUTO_SAVE_CREDENTIALS="1" 환경 변수만 설정했을 때 발생하는 오류를 보여줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ cat ~/.microsoft/Team\ Foundation/4.0/Logs/teamexplorer-clc-2019.06.17-13.45.48.log 2019-06-17 13:45:49,872 INFO [main] (com.microsoft.tfs.core.telemetry.TfsTelemetryHelper) Command Line Client v.14.114.0.201703081734 2019-06-17 13:45:49,873 INFO [main] (com.microsoft.tfs.core.telemetry.TfsTelemetryHelper) AppInsights telemetry initialized 2019-06-17 13:45:49,873 INFO [main] (com.microsoft.tfs.core.telemetry.TfsTelemetryHelper) Developer Mode: false 2019-06-17 13:45:49,873 INFO [main] (com.microsoft.tfs.core.telemetry.TfsTelemetryHelper) Production Environment: true 2019-06-17 13:45:50,288 INFO [main] (com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore) gnome-keyring library not loaded <span style='color: blue; font-weight: bold'>java.lang.UnsatisfiedLinkError: Unable to load library 'gnome-keyring': Native library (linux-x86-64/libgnome-keyring.so) not found in resource path</span> ([file:...[생략]...]) at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:277) at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403) at com.sun.jna.Library$Handler.<init>(Library.java:147) at com.sun.jna.Native.loadLibrary(Native.java:502) at com.sun.jna.Native.loadLibrary(Native.java:481) at com.microsoft.alm.storage.posix.internal.GnomeKeyringLibrary.<clinit>(GnomeKeyringLibrary.java:23) at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.isGnomeKeyringLibraryAvailable(GnomeKeyringBackedSecureStore.java:210) at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.getGnomeKeyringLibrary(GnomeKeyringBackedSecureStore.java:232) at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.<clinit>(GnomeKeyringBackedSecureStore.java:17) at com.microsoft.tfs.core.credentials.internal.GnomeKeyringCredentialsManager.<clinit>(GnomeKeyringCredentialsManager.java:23) at com.microsoft.tfs.core.credentials.CredentialsManagerFactory.getCredentialsManager(CredentialsManagerFactory.java:89) at com.microsoft.tfs.client.clc.commands.Command.createConnection(Command.java:1537) at com.microsoft.tfs.client.clc.commands.Command.createConnection(Command.java:1196) at com.microsoft.tfs.client.clc.vc.commands.CommandGet.run(CommandGet.java:171) at com.microsoft.tfs.client.clc.Application.run(Application.java:306) at com.microsoft.tfs.client.clc.Application.run(Application.java:154) at com.microsoft.tfs.client.clc.vc.Main.main(Main.java:55) 2019-06-17 13:45:50,290 INFO [main] (com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore) gnome-keyring library not loaded java.lang.NoClassDefFoundError: Could not initialize class com.microsoft.alm.storage.posix.internal.GnomeKeyringLibrary at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.isGnomeKeyringLibraryAvailable(GnomeKeyringBackedSecureStore.java:210) at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.getGnomeKeyringPasswordSchema(GnomeKeyringBackedSecureStore.java:236) at com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore.<clinit>(GnomeKeyringBackedSecureStore.java:18) at com.microsoft.tfs.core.credentials.internal.GnomeKeyringCredentialsManager.<clinit>(GnomeKeyringCredentialsManager.java:23) at com.microsoft.tfs.core.credentials.CredentialsManagerFactory.getCredentialsManager(CredentialsManagerFactory.java:89) at com.microsoft.tfs.client.clc.commands.Command.createConnection(Command.java:1537) at com.microsoft.tfs.client.clc.commands.Command.createConnection(Command.java:1196) at com.microsoft.tfs.client.clc.vc.commands.CommandGet.run(CommandGet.java:171) at com.microsoft.tfs.client.clc.Application.run(Application.java:306) at com.microsoft.tfs.client.clc.Application.run(Application.java:154) at com.microsoft.tfs.client.clc.vc.Main.main(Main.java:55) 2019-06-17 13:45:50,290 INFO [main] (com.microsoft.alm.storage.posix.internal.GnomeKeyringBackedSecureStore) gnome-keyring library not loaded, return null for SCHEMA 2019-06-17 13:45:54,528 INFO [main] (com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory) HttpClient configured for http://192.168.100.70:8080/tfs/defaultcollection/, authenticating as testad\testusr 2019-06-17 13:45:55,964 ERROR [main] (com.microsoft.tfs.jni.natives.NativeAuthMethods) <span style='color: blue; font-weight: bold'>Could not load GSSAPI library, Kerberos authentication disabled</span> 2019-06-17 13:45:56,745 INFO [main] (com.microsoft.tfs.client.clc.vc.Main) Shutting down 2019-06-17 13:45:56,752 INFO [main] (com.microsoft.tfs.client.clc.vc.Main) Has shut down </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, TEE-CLC-14.114.0.zip 파일의 다운로드 경로가 redirection URL이라서 아무런 옵션 없이 curl을 이용해 다운로드하면 다음과 같은 오류가 발생합니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> $ curl <a target='tab' href='https://github.com/Microsoft/team-explorer-everywhere/releases/download/v14.114.0/TEE-CLC-14.114.0.zip'>https://github.com/Microsoft/team-explorer-everywhere/releases/download/v14.114.0/TEE-CLC-14.114.0.zip</a><br /> <html><body>You are being <a href="<a target='tab' href='https://github-production-release-asset-2e65be.s3.amazonaws.com/'>https://github-production-release-asset-2e65be.s3.amazonaws.com/</a>...[생략]...2Foctet-stream">redirected</a>.</body></html><br /> </div><br /> <br /> 따라서 "-L" 옵션을 줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ curl -L https://github.com/Microsoft/team-explorer-everywhere/releases/download/v14.114.0/TEE-CLC-14.114.0.zip </pre> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1271
(왼쪽의 숫자를 입력해야 합니다.)