PowerShell有替代SCP吗?

时间:2013-08-20 20:00:31

标签: powershell scp

我需要编写一个脚本,将文件从文件夹传输到另一台服务器(Linux),但是传输文件的脚本在Windows上,我想知道PowerShell是否有scp的替代方案(或者如果还有其他方法可以做到这一点)

5 个答案:

答案 0 :(得分:20)

有一个名为pscp.exe的{​​{3}}附带的方便的小工具可以执行此操作,并且可以在powershell中轻松调用。

下面的示例从Windows复制到CentOS框(以用户代码“bill”登录)并使用-pw中的pscp开关传入密码(否则命令窗口是spawned将提示输入Linux密码):

Start-Process 'C:\Program Files (x86)\PuTTY\pscp.exe' -ArgumentList ("-scp -pw password C:\Document.rtf bill@192.168.0.28:/home/bill/")  

PuTTY Secure Copy client
Release 0.62
Usage: pscp [options] [user@]host:source target
       pscp [options] source [source...] [user@]host:target
       pscp [options] -ls [user@]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

答案 1 :(得分:9)

pscp.exe是一个可行的选择,但我已经使用Rebex中的库几年来在C#应用程序和PowerShell脚本中进行SFTP和FTPS传输并取得了巨大成功。他们的套餐还包括an SCP object,但我没有亲自使用过它。

pscp免费相比,这需要花钱。在选择Rebex软件包之前,我曾考虑过使用PuTTY路由,但我的团队认为,从长远来看,拥有一个可以轻松插入任何应用程序/脚本的库是值得的。

答案 2 :(得分:5)

您可以使用WinSCP .NET assembly中的PowerShell进行SCP转移。

例如,请参阅http://winscp.net/eng/docs/library_powershell#example

该示例使用SFTP协议。要使用SCP,只需将其修改为:

$sessionOptions.Protocol = [WinSCP.Protocol]::Scp

虽然如果您的服务器支持SCP协议,但它可能也支持SFTP。如果您有选择,SFTP是更好的选择。

答案 3 :(得分:1)

还有一种“.NET友好”的方式:

您可以使用SharpSSH dll执行ssh命令,并执行scp / sftp传输。

例如:

[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()

还有SSH.Net库,它的功能大致相同。

答案 4 :(得分:1)

如今,Windows将OpenSSH(包括SCP)作为可选组件,因此您可以使用它。有关如何设置的说明,请参见OpenSSH in Windows

或者,如果您在两台计算机上都具有PowerShell,则应该可以使用Copy-Item并通过-ToSession进行SSH连接的会话来进行操作,但是我从未真正尝试过。它要求使用PowerShell的最新版本以及更多设置(请参见PowerShell remoting over SSH)。像这样:

Copy-Item C:\localPath\*.* ~\remotePath\ -ToSession (New-PSSession -HostName UserA@LinuxServer01:22 -KeyFilePath c:\\userAKey_rsa)

如果两台计算机都是Windows计算机,则可以使用相同的-ToSession参数通过WinRM复制文件。但是两台计算机都必须加入域,否则可能会出现安全问题。