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
- 在Perl脚本中捕获
- 作业配置检查:
- 确认作业步骤的运行账户权限足够
- 检查步骤类型是否为“操作系统(CmdExec)”,命令路径是否正确
- 确认作业的工作目录设置正确
内容的提问来源于stack exchange,提问作者harun prasu
相关产品推荐
相关产品推荐

