我需要编写一个脚本,将文件从文件夹传输到另一台服务器(Linux),但是传输文件的脚本在 Windows 上,我想知道是否有scp
PowerShell 的替代方案(或者是否有另一种方法这个)
5 回答
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
您可以使用PowerShell中的WinSCP .NET 程序集进行 SCP 传输。
例如参见http://winscp.net/eng/docs/library_powershell#example
该示例使用 SFTP 协议。要使用 SCP,只需将其修改为:
$sessionOptions.Protocol = [WinSCP.Protocol]::Scp
虽然如果您的服务器支持 SCP 协议,它很可能也支持 SFTP。如果您有选择,SFTP 是更好的选择。
还有一种“.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库,它做的事情大致相同。
如今,Windows 将 OpenSSH(包括 SCP)作为可选组件,因此您可以直接使用它。有关如何设置的说明,请参阅Windows 中的 OpenSSH 。
或者,如果您在两台机器上都有 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 复制文件。但是两台机器都必须加入域,否则可能存在安全问题。