PowerShell을 사용하여 원격으로 파일 복사


95

서버 A에서 실행할 PowerShell 스크립트를 작성 중입니다. 서버 B에 연결하고 파일을 백업으로 서버 A에 복사하려고합니다.

그렇게 할 수 없다면 서버 A에서 서버 B에 연결하고 파일을 서버 B의 다른 디렉토리에 복사하고 싶습니다.

내가 볼 Copy-Item명령을,하지만 난 그것을 컴퓨터 이름을 지정하는 방법을 볼 수 없습니다.

나는 내가 할 수 있다고 생각했을 것입니다.

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

어떻게 할 수 있습니까?


4
Copy-Item을 사용하려면 "\\ ServerB \ C $ \ Programs \ temp \ test.txt"와 같은 UNC 경로를 사용해야합니다.

답변:


97

관리 공유를 사용하여 시스템간에 파일을 복사하기 만하면됩니다. 이 방법이 훨씬 쉽습니다.

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

로컬 파일 시스템 경로 대신 UNC 경로를 사용하면 해당 UNC 경로에 대한 액세스 권한이있는 모든 클라이언트 시스템에서 스크립트를 실행할 수 있습니다. 로컬 파일 시스템 경로를 사용하는 경우 특정 컴퓨터에서 스크립트를 실행할 수 있습니다.

이는 두 관리 공유에 대한 권한이있는 사용자로 PowerShell 세션이 실행되는 경우에만 작동합니다.

모든 사람에게 읽기 전용 액세스 권한이있는 서버 B에서 일반 네트워크 공유를 사용하고 간단히 (서버 A에서) 호출하는 것이 좋습니다.

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose

9
이 접근 방식의 한 가지 가능한 문제는 Copy-Item이 대체 자격 증명을 지원하지 않는다는 것입니다 (다른 사용자로 명령을 실행해야하는 경우). 이 경우 New-PSDrive 접근 방식이 필요합니다.
요르단

1
이 솔루션은 UNC 공유를 차단하는 호스트 사이에 방화벽이없는 경우에만 작동합니다. 이 경우 올바른 솔루션은 아래 ( Copy-Item -FromSession)입니다.
Marc

88

에서 PowerShell을 버전 5 이후 (윈도우 서버 2016에 포함 된 이전 버전 WMF 5의 일부로 다운로드 ),이 리모팅 가능합니다. 이것의 장점은 어떤 이유로 든 공유에 액세스 할 수없는 경우에도 작동한다는 것입니다.

이 작업을 수행하려면 복사가 시작된 로컬 세션에 PowerShell 5 이상이 설치되어 있어야합니다. 원격 세션 에는 PowerShell 5가 설치되어 있지 않아도됩니다. PowerShell 버전 2 개 및 Windows Server 버전 2008 R2에서 작동합니다. [1]

서버 A에서 서버 B에 대한 세션을 만듭니다.

$b = New-PSSession B

그리고 여전히 A :

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

항목을 B로 복사하는 작업은 -ToSession. 두 경우 모두 로컬 경로가 사용됩니다. 어떤 서버에 있는지 추적해야합니다.


[1] : PowerShell 2 만있는 원격 서버에서 복사 할 때 PowerShell 5.1의이 버그에 주의하십시오. 작성 당시에는 재귀 파일 복사가 -ToSession에서 작동하지 않고 분명히 복사가 작동하지 않음을 의미합니다. 모두 -FromSession.


3
두 서버 모두 PS 5를 설치할 필요가 없다는 사실을 알게되었습니다. 소스 서버 (Windows 10)에만 PS 5가 설치된 상태에서 테스트를 성공적으로 수행했습니다. 대상은 기본 PS가 설치된 Windows Server 2012 R2였습니다 ($ PSVersionTable.PSVersion 보고서 4).
Taylor Buchanan

2
소스에서 -ToSession을 사용하는 경우 소스에만 PS 5가 설치되어 있어야합니다. 대상에서 -FromSession을 사용하는 경우 대상에만 PS 5가 설치되어 있어야합니다.
Taylor Buchanan

1
서버없이 Hypervisor 만 설치 한 경우에도 작동하며 공유를 설정할 필요없이 세션 만 사용하면됩니다!
dashesy

감사합니다! Linux 에서 scpover 와 유사한 멋지고 우아한 솔루션 ssh... 성가신 공유에 신경 쓸 필요가 없습니다!
Tobias J

40

사용 net use또는 New-PSDrive새 드라이브를 만들 :

New-PsDrive : PowerShell 환경에서만 볼 수있는 새 PsDrive를 만듭니다.

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Net use : OS의 모든 부분에서 볼 수있는 새 드라이브를 만듭니다.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

이걸 두 번 실행하면 New-PSDrive : A specified logon session does not exist. It may already have been terminated-> 이전 세션이 아직 진행 중이라고 생각합니다.-> 그래서 사용해 보았습니다 Remove-PSDrive-> 여전히 작동하지 않습니다. 또한 net use <driveLetter> /delete도움이되지 않았습니다. 소프트웨어 빌드 구성에서이 명령을 실행할 수 있도록 할 수있는 다른 작업이 있습니까?
Bruno Bieri

그것은 실행하는 것은 의미가 없습니다 New-PSDrive당신이해야 두 번A drive with the name 'Y' already exists.
JPBlanc

나는 그것을 두 번 실행하는 것이 의미가 없다는 데 동의합니다. 그러나 빌드 단계에 통합되어 빌드가 하루에 여러 번 실행됩니다. 그래서 내 접근 방식은 필요한 작업을 수행하면 드라이브를 제거하는 것이었고 새 빌드 실행이 발생하면 다시 만드는 것이 문제가되지 않는다고 가정했습니다. 그러나 그것은 문제인 것 같습니다. 다른 힌트가 있습니까?
Bruno Bieri

마운트하기 전에 마운트되었는지 테스트하는 것은 어떻습니까? 또는이 경로를 사용하는 모든 핸들이 닫혀 있다고 확신 할 때 스크립트에서 Remove-PSDrive를 사용할 수 있습니다.
JPBlanc

16

원격 파일에 액세스하기 위해 자격 증명이 필요한 경우 cmdlet New-Object 를 사용하여 "파일을 원격으로 복사" 하는 System.Net.WebClient 개체를 생성 할 수 있습니다.

$Source = "\\192.168.x.x\somefile.txt"
$Dest   = "C:\Users\user\somefile.txt"
$Username = "username"
$Password = "password"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)

$WebClient.DownloadFile($Source, $Dest)

또는 파일을 업로드해야하는 경우 UploadFile을 사용할 수 있습니다.

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)

1
@klm_ 무슨 말인지 설명해 주시겠습니까?
FastTrack

0

위의 답변 중 어느 것도 나를 위해 일 하지 않았습니다 . 이 오류가 계속 발생했습니다.

Copy-Item : Access is denied
+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

그래서 이것은 나를 위해 그것을했습니다.

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

그런 다음 내 호스트에서 실행 상자의 내 컴퓨터에서 다음을 수행했습니다.

\\{IP address of nanoserver}\C$

1
공유 + 파일 시스템 권한에 문제가 발생할 가능성이 있습니다. 가장 제한적인 권한이이기므로 NTFS 파일 시스템 계층에 액세스 할 수 있더라도 공유 권한이 제한하면 쓸 수 없습니다. :)
Trevor Sullivan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.