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

时间:2015-12-22 13:46:52

标签: linux

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

但是当我从服务器运行此命令时,我想限制它的输出被人们看到。 通过上述声明,我的意思是...... 例如。如果我说:

  

ls dirname

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

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

但是,当我从程序中调用此命令时,我想获取此命令的输出。 如何在这方面区分电话。

2 个答案:

答案 0 :(得分:1)

命令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字符串。

然而,坚持Do One Thing and Do It Well的unix系统中的哲学,我建议采用不同的方法,将命令分成两个不同的命令:

  • 客户端使用的命令,输出是您的任何输出 希望客户看到
  • 另一个命令(提供2个选项,因为问题中没有太多细节):
    • 扩展第一个命令,添加其他输出,并使用应用程序中的这个命令
    • 或者只是生成其他输出,并使用应用程序中的2个命令的组合

遵循这种方法可以获得一些好处:

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

已更新:添加了在答案开始时提取当前用户的IP的方法。

答案 1 :(得分:1)

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

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

例如,让我们从您的主目录中执行此操作。将程序abc移至$HOME/private_bin并将目录权限设置为700,这意味着只有才能执行该目录。

创建具有正常权限的第二个目录:$HOME/public_bin。创建一个"启动器"程序[让我们称之为abcpub]并将其放在此目录中。将abcpub的权限设置为4741。它现在是setuid计划。请注意,任何非root用户可以对他们拥有的文件执行此操作。 就像创建sudo一样,因为普通用户需要chown root ...

现在我们要设置......

您可以随时访问真正的abc程序。其他人没有可以直接访问abc

启动器abcpub将允许其他人访问abc,但启动器可以应用您想要的任何限制:包括无访问权限,输出到/ dev / null等abcpub可以查看getuidgeteuid来确定执行者[您或其他人]

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

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

此外,可能可以配置sudo以获得您想要的内容。