20

我需要编写一个脚本,将文件从文件夹传输到另一台服务器(Linux),但是传输文件的脚本在 Windows 上,我想知道是否有scpPowerShell 的替代方案(或者是否有另一种方法这个)

4

5 回答 5

24

Putty附带了一个方便的小工具,可以pscp.exe执行此操作,并且可以在 powershell 中轻松调用。

下面的示例从 windows 复制到 CentOS 机器(以用户代码“bill”登录),然后您使用-pw开关pscp输入密码(否则生成的命令窗口将提示输入 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
于 2013-08-20T23:12:38.943 回答
10

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

它确实花钱而pscp不是免费。在选择 Rebex 包之前,我曾考虑采用 PuTTY 路线,但我的团队认为,从长远来看,拥有一个可以轻松融入任何应用程序/脚本的库是值得的。

于 2013-08-21T01:35:28.163 回答
6

您可以使用PowerShell中的WinSCP .NET 程序集进行 SCP 传输。

例如参见http://winscp.net/eng/docs/library_powershell#example

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

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

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

于 2014-01-17T19:25:37.990 回答
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库,它做的事情大致相同。

于 2013-08-21T12:39:52.973 回答
1

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

或者,如果您在两台机器上都有 PowerShell,则应该可以使用Copy-Item并传递-ToSessionSSH 连接会话来执行此操作,但我从未真正尝试过。它需要最新版本的 PowerShell 和更多设置,请参阅PowerShell remoting over SSH。像这样的东西:

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

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

于 2020-09-22T15:53:11.993 回答