1

一直在尝试使用 posh-ssh 连接到 sftp。当我运行它时工作正常,当我尝试通过 Windows 任务调度程序运行它时它不起作用。

我尝试切换要运行脚本的用户,例如管理员、我自己、系统等。

我曾尝试使用密钥保存密码并稍后解密。

$Password = ConvertTo-SecureString 'sftpPW' -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostIP'
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential

然后其他方法 VVVVVVVVVV 这部分不是在脚本中运行而是创建密码

Get-Random -Count 32 -InputObject (0..255) | Out-File -FilePath encrypt
ConvertTo-SecureString 'sftpPW' -AsPlainText -Force | convertFrom-secureString -key (get-content -path encrypt) | Out-File pw

^^^^^^^^^^

$SFTPUser="user"
$password = (cat pw | ConvertTo-SecureString -key (Get-Content -path encrypt))
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostIP'
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential

编辑*

Import-Module Posh-SSH
$datestuff = Get-Date
echo "start $datestuff" > C:\sftptestlog
$SFTPUser="user"
echo $sftpuser >> C:\sftptestlog
$Password = ConvertTo-SecureString 'sftpPW' -AsPlainText -Force
echo $password >> C:\sftptestlog
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostip'

echo $Credential >> C:\sftptestlog
echo $sftpip >> C:\sftptestlog
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential
echo $sftpSess >> C:\sftptestlog

sftptestlog 的预期输出

开始时间 2019 年 9 月 10 日 16:31:19

用户

System.Security.SecureString

用户名密码

-------- --------

用户 System.Security.SecureString

主机IP

已连接的 SessionId 主机

--------- ---- ---------
2 hostIP 真

以上输出仅在从命令行运行脚本时发生。使用调度程序时,输出是相同的,只有最后几行(从 sessionID 开始)没有打印出来。

4

3 回答 3

1

我强烈建议您将一些日志记录到您的脚本中,以便您可以诊断这类事情,因为任务调度程序事件日志根本没有太大帮助。一个简单的方法是使用Start-Transcript

# Put this line at the very start of your script
Start-Transcript -Path 'c:\temp\sftplog.txt'

Write-Host 'Setting up user credentials'
$Password = ConvertTo-SecureString 'sftppassword' -AsPlainText -Force
$SFTPUser="username"
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 

# Destination host
$sftpIP = 'hostip'
Write-Host 'Destination host is $sftpIP, testing availability'
Try {
    Test-Connection -ComputerName $sftpIP -ErrorAction Stop
    Write-Host 'Host is contactable'
}
Catch {
    $_.Exception
}


# Attempt connection
Try {
    Write-Host 'Trying to connect via SFTP to $SftpIP'
    $sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential -ErrorAction Stop
    Write-Host 'Done'
}
Catch {
    $_
}

# Put this line at the very end of your script
Stop-Transcript

诊断出问题后,您可以删除 Transcript 和/或所有 Write-Host 命令。

于 2019-08-31T05:07:26.597 回答
1

发现ENV:PSModulePath使用任务计划程序时没有安装模块的路径。导入模块时,我直接链接到模块所在的位置。Import-Module "C:\Program Files\WindowsPowerShell\Modules\Posh-SSH"

于 2019-09-11T17:41:07.797 回答
0

为避免 posh-ssh 模块的路径出现问题,您可以使用以下命令安装它:

安装模块豪华 ssh -Scope AllUsers

于 2022-01-19T19:11:20.680 回答