是否有PowerShell的SCP替代方案?

sycxhyv7  于 2022-11-29  发布在  Shell
关注(0)|答案(5)|浏览(353)

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

jjhzyzn0

jjhzyzn01#

Putty附带了一个方便的小工具,叫做pscp.exe,它可以做到这一点,并且可以很容易地在powershell中调用。
下面的示例从Windows复制到CentOS框(以用户代码“bill”登录),并使用pscp中的-pw开关传入密码(否则,生成的命令窗口将提示输入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
qeeaahzv

qeeaahzv2#

pscp.exe是一个可行的选择,但我已经使用Rebex的库几年了,现在在C#应用程序和PowerShell脚本中进行SFTP和FTPS传输,并取得了巨大的成功。他们的包也包括an SCP object,但我个人还没有使用过它。
它确实需要花钱,而X1 M1 N1 X是免费的。在选择Rebex软件包之前,我曾考虑过走PuTTY路线,但我的团队决定,从长远来看,拥有一个我们可以轻松融入任何应用程序/脚本的库是值得的。

7d7tgy0s

7d7tgy0s3#

您可以使用PowerShell中的WinSCP .NET assembly进行SCP传输。
例如,请参阅http://winscp.net/eng/docs/library_powershell#example
本例使用SFTP协议,要使用SCP,只需修改为:

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

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

pwuypxnk

pwuypxnk4#

既然可以使用SCP,为什么还要使用SCP的替代方案?

现在,Windows已经将OpenSSH(包括SCP)作为可选组件,所以你可以直接使用它。它最早出现在2018年秋季的Windows 10版本中。它与你在大多数Linux发行版中看到的命令几乎相同,因为它来自相同的代码库。微软只是做了一两个小调整,使其在Windows上工作。
安装非常简单,只需进入开始-〉设置-〉应用程序-〉可选功能-〉查看功能在搜索框中输入OpenSSH并选中OpenSSH客户端,然后单击下一步。有关如何设置它的详细说明,请参阅OpenSSH in Windows。要获得更多PowerShell安装方式,请从提升的PowerShell提示符下运行以下命令:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

您可以使用此命令检查是否有更新的版本,以及您是否已经安装了该版本:

Get-WindowsCapability -Online | Where Name -Like '*ssh*'

安装后,您可以从PowerShell调用scp,就像调用任何其他可执行命令一样。

scp file.dat user.name@example.com:/target/path

如果您确实不想使用SCP,请使用Copy-Item

这需要在您的服务器上安装PowerShell。是的,您可以在Linux上安装PowerShell。只需使用-ToSession参数调用Copy-Item传递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复制文件.但两台计算机都必须加入域,否则可能会出现安全问题.

5t7ly7z5

5t7ly7z55#

还有一种“.NET友好”方式:
您可以使用SharpSSHdll来执行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库,它做的事情大致相同。

相关问题