Potrzebuję napisać skrypt, który przesyła pliki z folderu na inny serwer (Linux), ale skrypt, który przenosi pliki jest w systemie Windows, i zastanawiałem się, czy istnieje alternatywa dla scp
dla PowerShell (lub jeśli był inny sposób wykonania tej czynności)Czy istnieje alternatywa SCP dla PowerShell?
Odpowiedz
pscp.exe
jest realną opcją, ale byłem przy użyciu biblioteki z Rebex przez kilka lat na transfery i SFTP i FTPS n zarówno aplikacje C#, jak i skrypty PowerShell z dużym sukcesem. Ich pakiet zawiera także an SCP object, ale ja osobiście go nie użyłem.
To kosztuje, w przeciwieństwie do pscp
jest bezpłatna. Zanim wybrałem pakiet Rebex, rozważałem przejście na trasę PuTTY, ale mój zespół zdecydował, że posiadanie biblioteki, z której moglibyśmy w łatwy sposób przetworzyć dowolną aplikację/skrypt, było warte zachodu.
Jeśli masz budżet na to, tak :-) –
Ten wpis na blogu może pomóc ci w uruchomieniu Rebex SFTP w PowerShell http://blog.rebex.net/news/archive/2008/ 09/25/how-to-use-FTP-or-SFTP-in-PowerShell.aspx –
Jest to poręczne małe narzędzie, które jest dostarczane z Putty o nazwie pscp.exe
, które zrobi to i będzie można łatwo wywołać w programie Power Shell.
Przykład poniżej kopii z Windows na pole CentOS (zalogowaniu się jako userCode „Bill”) i użyć przełącznika w pscp
-pw
przejść w haśle (inaczej oknie poleceń, które zrodził poprosi o hasło Linux):
Start-Process 'C:\Program Files (x86)\PuTTY\pscp.exe' -ArgumentList ("-scp -pw password C:\Document.rtf [email protected]:/home/bill/")
PuTTY Secure Copy client
Release 0.62
Usage: pscp [options] [[email protected]]host:source target
pscp [options] source [source...] [[email protected]]host:target
pscp [options] -ls [[email protected]]host:filespec
Options:
-V print version information and exit
-pgpfp print PGP key fingerprints and exit
-p preserve file attributes
-q quiet, don't show statistics
-r copy directories recursively
-v show verbose messages
-load sessname Load settings from saved session
-P port connect to specified port
-l user connect with specified username
-pw passw login with specified password
-1 -2 force use of particular SSH protocol version
-4 -6 force use of IPv4 or IPv6
-C enable compression
-i key private key file for authentication
-noagent disable use of Pageant
-agent enable use of Pageant
-batch disable all interactive prompts
-unsafe allow server-side wildcards (DANGEROUS)
-sftp force use of SFTP protocol
-scp force use of SCP protocol
Używaj uwierzytelniania opartego na kluczach zamiast umieszczać hasło w swoim skrypcie. – slestak
Fajny punkt, to był tylko krótki przykład pokazujący, że PSCP może wykonać zlecone zadanie :-) –
Windows noob tutaj. Kiedy to zrobię, otrzymuję puste okno konsoli, które znika po około 10 sekundach, a transfer SCP wydaje się nie występować. Wszelkie pomysły co do tego, co się dzieje? – jayhendren
Jest też „NET przyjazny” sposób:
można użyć dll SharpSSH wykonywanie poleceń ssh, i robić przelewy SCP/SFTP.
Na przykład:
[Reflection.Assembly]::LoadFrom((Resolve-Path .\Tamir.SharpSSH.dll))
$ssh = New-Object Tamir.SharpSsh.Sftp("server","user","password")
$ssh.Connect()
$ssh.Put("C:\localfile","distantfile")
$ssh.Close()
Jest biblioteka SSH.Net też robi approximatively te same rzeczy.
Możesz użyć WinSCP .NET assembly z PowerShell dla przelewów SCP.
Dla przykładu patrz http://winscp.net/eng/docs/library_powershell#example
Przykład wykorzystuje protokół SFTP. Aby użyć SCP, po prostu zmodyfikuj go na:
$sessionOptions.Protocol = [WinSCP.Protocol]::Scp
Chociaż twój serwer obsługuje protokół SCP, prawdopodobnie obsługuje również SFTP. SFTP jest lepszym wyborem, jeśli masz opcję.
Dla każdego, kto używa PowerShell w wersji 3 lub nowszej, https://github.com/darkoperator/Posh-SSH jest opcją. –