使用 Winscp Client 实现 SAP 对 SFTP 的访问
简介: SAP ECC 不支持对 SFTP 的访问,因此通过使用 Winscp Client 实现 SAP 对 SFTP 的访问。
原为地址:SFTP from SAP using Winscp Client - My Experiments with ABAP
我们使用FTP将销售订单信息传输给运输商;这是他们规划资源(司机、卡车等)的重要信息。我们在站点到站点VPN上使用FTP,以确保通信安全。出于基础设施原因,我们正在远离站点到站点 VPN,要求使用 SFTP。
SAP ECC不支持sftp,这就是我使用开源Winscp sftp客户端实现sftp通信的方式。请注意,我们在Windows 2003服务器上安装了SAP服务器,您必须针对其他服务器操作系统调整一些步骤。
步骤 1 :下载并安装 Winscp 客户端
从 WinSCP :: Official Site :: Download 下载Winscp便携式可执行文件。它是一个zip文件,带有exe和com文件。解压缩内容并将其放在 SAP 可以执行它们的服务器上。我已经把我的保存在externexe / sftp文件夹中。第一次执行它会自动创建 ini 文件,所以如果你没有 ini 文件,请不要担心。
步骤 2 :检查安装和连接
在开始开发SAP之前,让我们检查一下这个客户端是否正常工作。
通常,Winscp 客户端会打开与服务器的一个会话,您可以在其中执行命令并在完成后将其关闭。但是在这里,我们希望一次性打开会话,执行命令和关闭会话,幸运的是Winscp确实支持此功能。
一个简单的 dir 命令以及打开的会话和退出命令如下所示
winscp.com /command "option batch abort" "open ftp://username:password@host_ip" "dir" "exit"
- 1
选项批处理中止可防止会话在出现任何问题时查找用户输入。例如,如果您的用户 ID 在 sftp 服务器上没有授权,则 Winscp 客户端将提示重试,如果我们从 SAP 执行命令,这是不可取的。您可以在此处执行多个命令,只需在退出之前将它们添加到列表中,然后用双引号引起来。
从客户端 (F:/data) 上的特定目录到 sftp 服务器 (in) 上的特定目录的文件传输命令如下所示。
winscp.com /command "option batch abort" "open ftp://username:password@host_ip"
"lcd F:\Data" "cd in" "put data.txt" "exit"
- 1
- 2
步骤 3 :在SM69中创建将调用 Winscp.com 的命令
确保选中允许的其他参数。
按保存。
要从SAP测试命令,请按执行并在其他参数中输入“打开”sftp://用户名:password@host_ip“”dir“”exit“并执行。
您应该获得与命令提示符相同的输出。请注意变量返回代码。零值表示成功执行。
步骤 4 :使用功能模块SXPG_COMMAND_EXECUTE调用外部命令ZFTP
这是示例代码,将让您了解如何调用我们刚刚创建的外部命令。您必须进行一些更改才能使其在您的位置工作。
METHOD execute_all_commands.
DATA : lv_additional_parameters TYPE string ,
lv_additional_param_func TYPE sxpgcolist-parameters .
* Create additional parameters strings based on username, password and host ip
IF me->username IS INITIAL .
RAISE EXCEPTION TYPE zcx_sfp
EXPORTING
textid = zcx_sfp=>user_name_empty .
ENDIF.
IF me->password IS INITIAL .
RAISE EXCEPTION TYPE zcx_sfp
EXPORTING
textid = zcx_sfp=>password_empty .
ENDIF.
IF me->host_ip IS INITIAL .
RAISE EXCEPTION TYPE zcx_sfp
EXPORTING
textid = zcx_sfp=>password_empty .
ENDIF.
* winscp.com /command "open "sftp://username:password@host_ip"" "dir" "exit"
* Create open command
CONCATENATE '"open'
' "sftp://'
me->username
':'
me->password
'@'
me->host_ip
'""'
INTO lv_additional_parameters .
* Add user commands
CONCATENATE lv_additional_parameters
me->additional_commmands
INTO lv_additional_parameters
SEPARATED BY space .
* Add exit command in the end
CONCATENATE lv_additional_parameters
'"exit"'
INTO lv_additional_parameters
SEPARATED BY space .
IF STRLEN( lv_additional_parameters ) > 255 .
RAISE EXCEPTION TYPE zcx_sfp
EXPORTING
textid = zcx_sfp=>command_too_long .
ENDIF.
DATA : lv_status TYPE extcmdexex-status ,
lv_exitcode TYPE extcmdexex-exitcode ,
li_return TYPE lca_tracefile_tab .
lv_additional_param_func = lv_additional_parameters .
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
commandname = me->command_name
additional_parameters = lv_additional_param_func
IMPORTING
status = lv_status
exitcode = lv_exitcode
TABLES
exec_protocol = li_return
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
program_start_error = 6
program_termination_error = 7
x_error = 8
parameter_expected = 9
too_many_parameters = 10
illegal_command = 11
wrong_asynchronous_parameters = 12
cant_enq_tbtco_entry = 13
jobcount_generation_error = 14
OTHERS = 15.
IF sy-subrc <> 0 OR lv_exitcode <> 0.
RAISE EXCEPTION TYPE zcx_sfp
EXPORTING
textid = zcx_sfp=>error_sftp
exit_code = lv_exitcode
status = lv_status
sftp_log = li_return .
ENDIF.
return = li_return .
ENDMETHOD.