问题描述
我一直试图将这个问题分解为两个部分,以实现自动化:
- PowerShell:将文件从本地桌面传输到 EFS(通过 WinSCP) - 好的
- PowerShell:在 EFS 上获取相同的文件(通过 WinSCP)并将其放入 Cloudera WebHDFS(我们使用 Hue 接口)- NOK
在部分 (1) 中,我创建了以下代码:
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Set up session options
$sessionoptions = New-Object WinSCP.Sessionoptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "peanut-edgenode1.dundlermufflin.com"
UserName = "JoeStreet"
Password = "dundlermufflin123"
SshHostKeyFingerprint = "ssh-ed28549 255 HJGF564hjfq8if1Y8KYALtf6zEv+z3o="
}
$sessionoptions.AddRawSettings("Cipher","aes,chacha20,3des,WARN,des,blowfish,arcfour")
$sessionoptions.AddRawSettings("ProxyHost","web.isa.la.proxy.dundlermufflin.com")
$sessionoptions.AddRawSettings("ProxyPort","4200")
$sessionoptions.AddRawSettings("ProxyUsername","na%5CJoeStreet")
$sessionoptions.AddRawSettings("ProxyPassword","dundlermufflin123")
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionoptions)
# Your code
$session.PutFiles("C:\Users\JoeStreet\Documents\report-2021-02-02_no_locations.xlsx","/efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx").Check()
}
finally
{
$session.dispose()
}
但是...如果我想从 EFS (WinSCP) 转移到 Cloudera WebHDFS,通过 PuTTY 我们登录到 peanut-edgenode1.dundlermufflin.com
并执行以下操作:[上面的部分 (2) ]
hdfs dfs -put -f /efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx /prd/product/ssa_stg/JoeStreet/
一切顺利。
但是我如何在 PowerShell 中插入该命令?
我尝试以不同的方式放入 $session.PutFiles(origin,destiny).Check()
但没有成功...
解决方法
如果 EFS 具有类似 Linux 的外壳,您可以使用 Session.ExecuteCommand
:
$session.ExecuteCommand("hdfs dfs -put -f /efs/home/JoeStreet/report-2021-02-02_no_locations.xlsx /prd/product/ssa_stg/JoeStreet/")
如果服务器的内容更非标准,您可能需要使用适当的 SSH(而非 SFTP)库,例如 SSH.NET 或 Posh-SSH。