使用 ABAP 在 SAPGUI 里直接执行 Linux 操作系统的命令

简介: 使用 ABAP 在 SAPGUI 里直接执行 Linux 操作系统的命令

笔者之前曾经写过一篇文章:聊聊 C 语言和 ABAP,里面提到,ABAP 语言底层,包括其关键字和虚拟机(也就是 ABAP Runtime),都是基于 C/C++ 实现的。其中 ABAP 里使用最简单的 WRITE 关键字,其 C++ 的源代码就多达 2000 行以上。这个数字我是怎么知道的?答案是用本文马上要介绍的自己编写的一个小工具,找到 WRITE 实现的 C 语言源代码文件,然后看文件总行数得来的。


细心的 ABAP 开发人员可以在 ABAP 系统里,找到一些 C/C++ 的影子。


比如打开一个 ABAP 类 CL_ABAP_COMPILER 的 CHECK_FEATURE 方法,发现其实现逻辑写在了 ABAP Kernel 里,在 SAPGUI 里看到的方法只是一个壳:

ABAP 帮助文档里对这些 Kernel 方法的定义:内核方法允许直接调用用 C 或 C++ 实现的内核函数。这些内核方法取代了以前传统的 C 调用和 System Call 的概念。

再比如,我们使用 ABAP 关键字 SUBMIT,提交一个系统里并不存在的 ABAP 报表:

执行上面这个报表,发生 LOAD_PROGRAM_NOT_FOUND 运行时错误。

在 ST22 事务码里查看这个错误,在 BASIS Developer View 里,能发现 ABAP 关键字 SUBMIT,在 ABAP Kernel 里实现的源文件为 absubmit.c.


打开这个文件,里面是密密麻麻的 C 程序。在 Active Calls in SAP Kernel 里,包含了发生这个运行时错误的 C 函数调用上下文信息:

在 ABAP Control Blocks 区域,能看到这个运行时错误,是在执行虚拟机指令 SUBM 时发生的。图中这些 PERP,ENDM,SUBM 等 ABAP 虚拟机指令,可以类比成 JVM 字节码指令集。

在 ABAP 调试器里,我们通过下图的菜单项,选择 Switch to Classic Debugger,从默认的标准调试器,切换到传统调试器:

然后在 System Areas 里选择 Internal Information:

Area 字段输入 CONT 后回车,就能看到当前 ABAP 程序待执行的指令了:

前面说到,ABAP Kernel Method 取代了传统的 C 调用。所谓 C 调用,就是 ABAP 关键字 CALL. 利用这个关键字,可以在 ABAP 里执行一些系统函数。

SAP 文档明确规定,所有的 C 调用都仅能由 SAP 内部使用,不允许用来开发应用程序。所以,大家只能在 SAP 标准的框架程序看到这些 C 调用的身影。

使用下面这行 ABAP 代码,我们可以直接在 ABAP 程序里,执行 ABAP 系统安装所在的操作系统的命令:

CALL ‘SYSTEM’ ID ‘COMMAND’

根据这行 ABAP 代码,我写了一个简单的 ABAP 报表,把这个系统函数调用封装了一下,代码如下:

演示一下这个小工具的执行效果。在报表里输入想要执行的 Linux 操作系统命令,比如 ps -aux,查看当前运行的操作系统进程列表:

Linux 操作系统进程列表打印结果如下:

使用 ls -l 命令,列出 Linux 操作系统指定文件夹下相关的 ABAP 关键字的 C 程序实现源文件列表:

列表如下,密密麻麻的都是 aba 开头的 C 和 C++ 实现文件:

双击某个文件,就能查看其源代码了:

如果大家对 ABAP 和 C/C++ 的关系感兴趣,请重温我之前发布过的这篇文章:聊聊 C 语言和 ABAP.

相关文章
|
17天前
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
176 73
|
10天前
|
Linux Shell
Linux 中 Tail 命令的 9 个实用示例
Linux 中 Tail 命令的 9 个实用示例
38 6
Linux 中 Tail 命令的 9 个实用示例
|
15天前
|
Linux 应用服务中间件 nginx
|
1天前
|
机器学习/深度学习 存储 Linux
linux中强大且常用命令:find、xargs、grep
linux中强大且常用命令:find、xargs、grep
23 9
|
1天前
|
SQL 移动开发 Linux
linux下find、grep命令详解
linux下find、grep命令详解
25 8
|
8天前
|
存储 Linux 编译器
linux中vim介绍以及常用命令大全
linux中vim介绍以及常用命令大全
31 8
|
7天前
|
存储 安全 Linux
探索Linux操作系统的心脏:内核
在这篇文章中,我们将深入探讨Linux操作系统的核心—内核。通过简单易懂的语言和比喻,我们会发现内核是如何像心脏一样为系统提供动力,处理数据,并保持一切顺畅运行。从文件系统的管理到进程调度,再到设备驱动,我们将一探究竟,看看内核是怎样支撑起整个操作系统的大厦。无论你是计算机新手还是资深用户,这篇文章都将带你领略Linux内核的魅力,让你对这台复杂机器的内部运作有一个清晰的认识。
23 3
|
6天前
|
设计模式 Java Linux
Linux的20个常用命令
Linux的23个常用命令
Linux的20个常用命令
|
7天前
|
存储 数据挖掘 Linux
服务器数据恢复—Linux操作系统网站服务器数据恢复案例
服务器数据恢复环境: 一台linux操作系统服务器上跑了几十个网站,服务器上只有一块SATA硬盘。 服务器故障: 服务器突然宕机,尝试再次启动失败。将硬盘拆下检测,发现存在坏扇区
|
11天前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
12 1