如何区分linux命令执行与命令行和程序

如何区分linux命令执行与命令行和程序,linux,Linux,我有一个unix命令“abc”,它给我一个输出 这个abc在我的服务器上 但当我从服务器上运行这个命令时,我想限制它的输出让人们看到。 我说的上述话是指。。 例如,如果我说: ls dirname 我可以在控制台上看到上述命令的输出 因此,如果命令是从命令行运行的,我不希望在控制台上出现回音。我不能使用/dev/null,因为我使用的是程序中的同一命令,我需要将输出分配给变量,然后在应用程序中进一步使用它 然而,当我从我的程序调用这个命令时,我想得到这个命令的输出。 如何在这方面区分呼叫。命令w

我有一个unix命令“abc”,它给我一个输出 这个abc在我的服务器上

但当我从服务器上运行这个命令时,我想限制它的输出让人们看到。 我说的上述话是指。。 例如,如果我说:

ls dirname

我可以在控制台上看到上述命令的输出

因此,如果命令是从命令行运行的,我不希望在控制台上出现回音。我不能使用/dev/null,因为我使用的是程序中的同一命令,我需要将输出分配给变量,然后在应用程序中进一步使用它

然而,当我从我的程序调用这个命令时,我想得到这个命令的输出。
如何在这方面区分呼叫。

命令
whoami
提供当前登录用户,命令
last-I
输出系统中最后登录用户的信息,包括IP地址(第3列)和时间戳或说明用户仍然登录的字符串

考虑到这一点,您可以通过管道发送以下命令:

last -i | grep $(whoami) | grep 'still logged in'
它将提供如下输出:

(username) pts/2        0.0.0.0          Wed Dec 23 18:58   still logged in   
(username) :0           0.0.0.0          Wed Dec 23 11:13   still logged in
因此,如果在同一主机上运行shell,则IP将
0.0.0.0
,否则将不同。您可以在命令末尾通过管道
awk
提取IP字符串


但是,除了unix系统中的原理之外,我建议采用另一种方法,将命令拆分为两个不同的命令:

last -i | grep $(whoami) | grep 'still logged in'
  • 客户机使用的命令,其中的输出是您想要的任何内容 希望客户看到
  • 另一个命令(提供2个选项,因为问题中没有太多细节):
    • 扩展第一个命令,添加额外的输出,然后从应用程序中使用这个命令
    • 或者只是生成额外的输出,并使用来自应用程序的两个命令的组合
您可以通过以下方法获得一些好处:

  • 不再需要执行检查以验证命令从何处发出
  • 避免耦合问题
  • 易于维护


更新:添加了在回答问题时提取当前用户IP的方法。

您对整个设置有点模糊,因此我不得不推断一些事情。既然您提到了“我的”服务器,我假设您可以设置文件的权限、更改文件的所有权等(例如,您可以成为root用户)

我还必须推断目标
abc
程序只产生一些输出,不需要修改任何文件[例如,
/tmp/temp.$$
]

例如,让我们从主目录执行此操作。将程序
abc
移动到
$HOME/private\u bin
并将目录权限设置为
700
,这意味着只有您可以执行它

创建具有正常权限的第二个目录:
$HOME/public\u bin
。创建一个“launcher”程序[让我们称之为
abcpub
],并将其放在这个目录中。将
abcpub
的权限设置为
4741
。它现在是一个
setuid
程序。请注意,任何非root用户都可以对其拥有的文件执行此操作。这不像创建一个
sudo
,因为普通用户需要执行
chownroot…

现在我们准备好了

您可以随时访问real
abc
程序。其他人无法直接访问abc

启动器
abcpub
将允许其他人访问
abc
,但启动器可以应用您想要的任何限制:包括不访问、输出到/dev/null等。
abcpub
可以查看
getuid
geteuid
来确定是谁在执行它[您或其他人]

我们使用您自己的uid和主目录完成了上面的示例。但是,我们可以通过在/etc/passwd中创建一个“abc”用户和一个
/home/abc
来重复这个过程。abc用户可以使用
/sbin/nologin
的shell进行设置。因此,它类似于
无人
,不会伤害任何东西

创建一个
setgrp
程序而不是
setuid
,这样做可能会更好,因为这样可以更好地进行混合。原始用户可以保留其用户权限,但仍可以通过新组进行访问


此外,还可以配置
sudo
以获得所需内容。

欢迎使用SO<代码>限制它的输出,使人们可以看到:不清楚。你们能不能把问题修改一下,再详细说明一下。如何从程序中调用该命令?用什么语言?不幸的是,这是我必须在应用程序中使用的第三方命令可执行文件。我看不到一种方法可以像你建议的那样使用它。一种可能的解决方案是,在你的应用程序中使用该命令,但用你自己的客户端命令包装它,你只需过滤输出的问题,添加使用shell命令获取用户IP的方法