C 检查命令是否由用户直接运行

C 检查命令是否由用户直接运行,c,linux,linux-kernel,kernel,C,Linux,Linux Kernel,Kernel,假设出于教育原因,我想更改kill的行为。如果用户直接在shell中键入它,那么什么也不会发生。如果不是用户的其他程序/实体调用它,它将正常执行。包装if语句可能就足够了,但是在if中我应该放什么呢 编辑我不想在shell中执行此操作。我在问有关内核编程的问题 在内核源代码中,定义了kill。我将在内部代码周围包装一个if语句。在该语句中,应该进行检查,以确定调用该语句的是用户还是某个进程。检查是我不知道如何执行的部分 关于安全问题 目标: 阻止用户从任何shell直接调用kill 从字面上看

假设出于教育原因,我想更改
kill
的行为。如果用户直接在shell中键入它,那么什么也不会发生。如果不是用户的其他程序/实体调用它,它将正常执行。包装if语句可能就足够了,但是在
if
中我应该放什么呢

编辑我不想在shell中执行此操作。我在问有关内核编程的问题

在内核源代码中,定义了kill。我将在内部代码周围包装一个if语句。在该语句中,应该进行检查,以确定调用该语句的是用户还是某个进程。检查是我不知道如何执行的部分

关于安全问题

目标:

  • 阻止用户从任何shell直接调用
    kill
  • 从字面上看,其他一切都很好,不会被阻止

您可以使用别名来更改命令的行为。别名仅应用于交互式壳。Shell脚本忽略它们。例如:

$ alias kill='echo hello'
$ kill
hello

如果希望别名始终可用,可以将其添加到
~/.bashrc
(如果shell不是bash,则可以添加任何等效文件)。

可以使用别名更改命令的行为。别名仅应用于交互式壳。Shell脚本忽略它们。例如:

$ alias kill='echo hello'
$ kill
hello

如果您希望别名始终可用,可以将其添加到
~/.bashrc
(或者,如果您的shell不是bash,则可以添加任何等效文件)。

看起来您非常困惑,不了解a到底是什么以及Linux计算机是如何工作的所有操作都是通过系统调用在某些进程内完成的

应该有一个检查,看看调用它的人是直接由用户完成的,还是仅仅由某个进程完成的

上面的句子没有意义。一切都是通过一些进程通过一些系统调用来完成的。用户的概念仅作为流程的“属性”存在,请参见(因此“由用户直接完成”是模糊的)。阅读并花几天时间阅读,然后问一个更集中的问题

(我真的相信,如果你不清楚上面的ALP书在解释什么,你就不应该敢于修补内核;那么你的问题就不同了)

你还应该花几天或几周的时间阅读和。你需要对计算机的工作原理有一个更精确的了解,这需要时间(也许很多),这里的任何答案都不能涵盖所有内容

当用户键入
kill
时,他可能使用shell内置(type
whichkill
type kill
)和shell调用。当用户键入
/bin/kill
时,他是一个将调用的程序。而且命令可能不是来自终端(例如,
echo kill$$$| sh
,该命令随后来自管道,或
echo kill 1234 |午夜
在用户交互之外发生,没有任何用户交互使用计算机,该命令从
/var/spool/cron/atjobs/
中的某个文件读取,请参阅)在这两种情况下,内核只看到
SYS\u kill
系统调用

顺便说一句,在
kill
上修改内核的行为可能会影响许多系统软件,因此在这样做时要小心。还要阅读(一些信号不是来自于一个处理器)

您可以使用
isatty(STDIN_FILENO)
(请参阅)来检测程序是否在终端中运行(无需修补内核,您只需修补外壳)。但我给出了几种情况,情况并非如此。您和您的用户还可以编写一个桌面应用程序(使用GTK或Qt)调用并在桌面上启动(运行时可能不会连接任何终端,请阅读)

另请参见session和;最近基于Linuxes的概念我并不熟悉(我不知道与它相关的是什么内核内容)

如果您只想更改运行某些(识别良好的)shell的交互式终端的行为,则只需更改shell—(例如,对其进行修补以删除其
kill
内置,并可能避免shell执行
/bin/kill
),无需修补内核。。但这不会禁止高级用户编写小型C程序调用代码(甚至用C编写自己的shell并使用它),编译C源代码,并运行新编译的可执行文件。另请参见bash中的

如果您只是想通过对内核进行修补并更改其系统调用行为的练习来学习,那么您需要定义要过滤的进程状态。因此,请考虑进行系统调用的进程,而不是“用户”(进程确实有多个用户ID)

顺便说一句,修补内核是非常困难的(如果你希望它是可靠和安全的),因为根据定义它会影响整个Linux系统。经验法则是尽可能避免修补内核…在你的情况下,修补外壳似乎足以实现你的目标,所以更喜欢修补外壳(或者可能是修补所有shell实际使用的…)来修补内核。另请参阅

也许您只是希望1234(假设1234是您用户的uid)被修补过的内核使用系统调用拒绝(因此他需要一个可执行文件来拒绝),但您的问题不是这样表述的。这可能很简单,可以通过添加
kill\u ok\u by\u cred
(在Linux 4.4文件的第692行附近)来实现简单到

 if (uid_eq(1234, tcred->uid))
    return 0;

但我可能完全错了(除了一些驱动程序外,我从未修补过内核)。当然,几个小时后,我会给出一个更权威的答案。

看起来你很困惑,不明白a到底是什么以及Linux计算机是如何工作的。所有事情都是在这样的内部完成的