如何区分linux命令执行与命令行和程序
我有一个unix命令“abc”,它给我一个输出 这个abc在我的服务器上 但当我从服务器上运行这个命令时,我想限制它的输出让人们看到。 我说的上述话是指。。 例如,如果我说: ls dirname 我可以在控制台上看到上述命令的输出 因此,如果命令是从命令行运行的,我不希望在控制台上出现回音。我不能使用/dev/null,因为我使用的是程序中的同一命令,我需要将输出分配给变量,然后在应用程序中进一步使用它 然而,当我从我的程序调用这个命令时,我想得到这个命令的输出。如何区分linux命令执行与命令行和程序,linux,Linux,我有一个unix命令“abc”,它给我一个输出 这个abc在我的服务器上 但当我从服务器上运行这个命令时,我想限制它的输出让人们看到。 我说的上述话是指。。 例如,如果我说: ls dirname 我可以在控制台上看到上述命令的输出 因此,如果命令是从命令行运行的,我不希望在控制台上出现回音。我不能使用/dev/null,因为我使用的是程序中的同一命令,我需要将输出分配给变量,然后在应用程序中进一步使用它 然而,当我从我的程序调用这个命令时,我想得到这个命令的输出。 如何在这方面区分呼叫。命令w
如何在这方面区分呼叫。命令
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…
现在我们准备好了
您可以随时访问realabc
程序。其他人无法直接访问abc
启动器abcpub
将允许其他人访问abc
,但启动器可以应用您想要的任何限制:包括不访问、输出到/dev/null等。abcpub
可以查看getuid
和geteuid
来确定是谁在执行它[您或其他人]
我们使用您自己的uid和主目录完成了上面的示例。但是,我们可以通过在/etc/passwd中创建一个“abc”用户和一个/home/abc
来重复这个过程。abc用户可以使用/sbin/nologin
的shell进行设置。因此,它类似于无人
,不会伤害任何东西
创建一个setgrp
程序而不是setuid
,这样做可能会更好,因为这样可以更好地进行混合。原始用户可以保留其用户权限,但仍可以通过新组进行访问
此外,还可以配置
sudo
以获得所需内容。欢迎使用SO<代码>限制它的输出,使人们可以看到:不清楚。你们能不能把问题修改一下,再详细说明一下。如何从程序中调用该命令?用什么语言?不幸的是,这是我必须在应用程序中使用的第三方命令可执行文件。我看不到一种方法可以像你建议的那样使用它。一种可能的解决方案是,在你的应用程序中使用该命令,但用你自己的客户端命令包装它,你只需过滤输出的问题,添加使用shell命令获取用户IP的方法