You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSMS代理作业执行含SCP命令的Perl脚本陷入循环无结果求助

问题描述

尝试通过SSMS代理作业调用Perl脚本执行SCP命令传输文件至SFTP,作业持续运行无结果,但直接在Windows命令提示符运行该脚本可正常完成文件上传。

相关代码片段

Perl中构建的SCP命令

$Command = "scp -i D:\File1\RS2\DataFeed\Code\PrivateKey.ppk -s $InternalFile admin@sftp.world.com:$VendorName/$DestFileName";

Perl调用系统命令的代码

system($command);

实际执行SCP的Perl方法

sub CopyDataFeedFileToSftp{

   my ($DataFeedFileInternal, $DataFeedVendorName,$DataFeedFileName) = @_;
   my($DestFileName)=$DataFeedFileName.".zip";
   my($Command);
   my($RetValue) = 1;

   $Command = "C:\\Users\\hprasu\\Downloads\\OpenSSH-Win64\\scp.exe -i D:\\File1\\RS2\\DataFeed\\Code\\PrivateKey.ppk -s $DataFeedFileInternal a_Tne\@nasftp\.egencia.com:$DataFeedVendorName/$DestFileName";
   $RetVal = &CallSystem($Command);
   if ($RetVal == 0) {
      &AppendFileToLog($TempFile);
      &ErrorExit("Unable to copy data feed file using SCP command:\n".$Command);
   }
}

调用Perl脚本的批处理文件(DataFeed.cmd)

%_Debug% echo off


cd /d %0\.. 
pushd .
setlocal

rem -----------------------------------------------------------------
rem Localize environment
rem -----------------------------------------------------------------

if exist DataFeed_Environment.cmd (
    call DataFeed_Environment.cmd
) else (
    echo DataFeed_Environment.cmd not found!!!
    echo
    goto CmdUsage
)



rem -----------------------------------------------------------------
rem Run perl package
rem -----------------------------------------------------------------

C:\Perl\bin\perl.exe DataFeedProd1.pl
if %ERRORLEVEL% NEQ 0 goto ErrorExit

goto Exit

rem -----------------------------------------------------
rem Command Usage
rem -----------------------------------------------------
:CmdUsage
    Echo ---------------------------------------------------------------------
    echo.
    echo DataFeed.cmd
    echo  Wraps the call to DataFeed.pl,
    echo  mails log upon errors.
    echo.
    echo Usage:
    echo DataFeed.cmd
    echo.
    echo ----------------------------------
rem endlocal
rem popd
rem exit 1


rem -----------------------------------------------------------------
rem Error exit
rem -----------------------------------------------------------------
:ErrorExit
echo DataFeedProd1.pl failed !!!
echo 
rem endlocal
rem popd
rem exit  1


rem -----------------------------------------------------------------
rem Exit
rem -----------------------------------------------------------------
rem endlocal
rem popd
:Exit

rem exit  0
故障排查方向
  • 权限与身份验证:SSMS代理作业默认使用SQL Server Agent服务账户运行,该账户可能没有私钥文件PrivateKey.ppk的读取权限,或者私钥需要交互式密码验证。
    • 给SQL Server Agent服务账户添加私钥所在目录的读取权限
    • 将ppk格式私钥转换为OpenSSH格式,避免交互式验证需求
  • 环境变量差异:CMD会话的环境变量与SQL Agent服务的环境变量不一致,可能导致找不到依赖工具或文件。
    • 确认SCP、Perl的绝对路径正确,且SQL Agent账户能访问这些路径
    • 在DataFeed.cmd中手动设置必要的环境变量(如PATH)
  • 交互式阻塞:首次连接SFTP服务器时,SCP需要确认主机密钥,非交互式的SQL Agent会话会因此卡住。
    • 用SQL Agent服务账户登录服务器,手动运行一次SCP命令,完成主机密钥确认
    • 在SCP命令中添加-o StrictHostKeyChecking=no参数跳过验证(仅测试用,注意安全风险)
  • 日志缺失:当前脚本未记录足够的执行细节,无法定位问题。
    • 在Perl脚本中捕获system命令的输出并写入日志文件
    • 修改DataFeed.cmd中的Perl调用,添加输出重定向:C:\Perl\bin\perl.exe DataFeedProd1.pl >> DataFeed.log 2>&1
  • 作业配置检查:
    • 确认作业步骤的运行账户权限足够
    • 检查步骤类型是否为“操作系统(CmdExec)”,命令路径是否正确
    • 确认作业的工作目录设置正确

内容的提问来源于stack exchange,提问作者harun prasu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:09:16