728x90
반응형
1. 개요
- 같은 라우터 내부에서 외부 인터넷이 제한되었으며, 파일을 공유해야할 때 작성하여 사용
- 같은 공유기 내부의 사설 IP(Private IP)를 사용하여 TCP 소켓 스트림 방식으로 파일을 송수신함
2. 사용법
- 원하는 경로에 File_Share.ps1, send.bat, recv.bat의 3개 파일을 위치시키고, 동일 위치에 전송할 대상을 send.zip으로 압축해 넣어둔다.
- 파일을 받을 대상 PC에서 recv.bat을 실행 시키고 send.zip이 위치한 PC에서 send.bat을 실행한다.
3. 코드 (파워쉘 스크립트 작성)
# File_Share.ps1
param (
[int] $sel = 1,
[string] $IP = "127.0.0.1",
[int] $Port = 29800,
[String] $Send_FileName = "send.zip",
[String] $Recv_FileName = "recv.zip"
)
Function Recv_File {
Param (
[int] $Port = 29800,
[String] $FileName = "recv.zip",
[int] $ChunkSize = 1mb
)
# Socket Init
$endpoint = new-object System.Net.IPEndPoint([ipaddress]::any, $port)
$listener = new-object System.Net.Sockets.TcpListener $endPoint
$listener.start()
# 연결 대기
$data = $listener.AcceptTcpClient()
# Stream 설정
$socket_stream = $data.GetStream()
$FileReader = New-Object System.IO.BinaryReader $socket_stream
$FileStream = [System.IO.FileStream]::new($FileName, [System.IO.FileMode]::Append, [System.IO.FileAccess]::Write)
$Writer = New-Object System.IO.BinaryWriter($FileStream)
for(){
$Chunk = $FileReader.ReadBytes($ChunkSize)
if($Chunk.Length){
$Writer.Write($Chunk, 0, $Chunk.Length)
}else{
break
}
}
# Close
$Writer.Close()
$socket_stream.close()
$listener.stop()
}
Function Send_File {
Param (
[string] $IP = "127.0.0.1",
[int] $Port = 29800,
[string] $FileName = "send.zip",
[int] $ChunkSize = 1mb
)
# Setup connection
$EndPoint_IP = [System.Net.Dns]::GetHostAddresses($IP)
$Address = [System.Net.IPAddress]::Parse($EndPoint_IP)
$Socket = New-Object System.Net.Sockets.TCPClient($Address, $Port)
# stream 설정
$Socket_Stream = $Socket.GetStream()
$Socket_Writer = New-Object System.IO.BinaryWriter($Socket_Stream)
$FileInfo = Get-Item -LiteralPath $FileName
$FileStream = $FileInfo.OpenRead()
$FileReader = New-Object System.IO.BinaryReader $FileStream
for() {
$Chunk = $FileReader.ReadBytes($ChunkSize)
$ChunkSum = 0
if($Chunk.Length) {
$Socket_Writer.Write($Chunk, 0, $Chunk.Length)
$ChunkSum += $Chunk.Length
}else {
Write-Host $ChunkSum 'Bytes 전송 완료'
break;
}
}
# Close
$Socket_Writer.Close()
$FileReader.Close()
$FileStream.Close()
$Socket_Writer.Close()
$Socket_Stream.Close()
}
if($sel -eq 1){
Write-Host 'Listener'
Recv_File -Port $Port -FileName $Recv_FileName
}else{
Write-Host 'Sender'
Send_File -IP $IP -Port $Port -FileName $Send_FileName
}
4. 코드(배치파일 작성)
// listener Start
// recv.bat
#echo off
powershell.exe -File File_Share.ps1 -sel 1
pause
// sender Start
// send.bat
#echo off
powershell.exe -File File_Share.ps1 -sel 2 -IP 127.0.0.1
pause
728x90
반응형
'프로그래밍 > Shell Script' 카테고리의 다른 글
[Script] 쉘 스크립트 모음 (0) | 2022.09.01 |
---|---|
[PowerShell] 작업 스케줄러로 휴지통 자동 비우기 (0) | 2022.05.15 |
[PowerShell] 파워쉘 사용법 정리 (0) | 2021.09.22 |
댓글