我想禁用所有kill命令(包括root用戶)。我嘗試過更改權限,但仍然可以執行。有沒有辦法做到這一點?
答案1
kill
即使root
可能,「停用」也很可能會產生不必要的副作用,例如係統腳本故障,並且在最壞(但可能)的情況下,它會阻止您的電腦正常啟動(甚至關閉適當地)。
對於用戶來說,這也會造成問題。例如,我有作為非特權用戶運行的腳本,用於檢查某些進程是否正在使用kill -0 $pid
.這些腳本將停止工作。
對你自己來說,你可以alias
命令kill
其他東西,例如echo "kill"
:
$ alias kill='echo "kill"'
這kill
至少會阻止在命令列上執行任何有用的操作:
$ kill -s HUP $$
kill -s HUP 11985
答案2
使用此核心模組停用kill
上的系統呼叫amd64
。
使用風險自負。預計會產生毀滅性的副作用。
#include <linux/module.h>
MODULE_LICENSE("GPL");
int __init init(void) __attribute__((noreturn))
{
unsigned long long cr0 = read_cr0();
write_cr0(cr0 & ~(1 << 16)); /* Clear Write Protection (WP) bit */
*(unsigned char *)sys_kill = 0xc3; /* opcode for "ret" */
write_cr0(cr0);
/* This makes sure that delete_module below won't complain */
__this_module.refcnt = 1;
__this_module.state = MODULE_STATE_LIVE;
asm volatile
(
"mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
"jmp sys_delete_module\n\t" /* call delete_module(name, flags) */
:: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
);
}
void __exit exit(void)
{
return;
}
像編譯任何其他模組一樣編譯它。然後用insmod
在它上面。
答案3
你不應該在系統範圍內停用它,因為它在系統腳本中使用(例如,在/etc/init.d/functions
套件中initscripts
)。
您可以禁用它用於登入 shell(及其子 shell)alias
'ing它,比如說,true
/ false
(或類似的東西kill_disabled
,如果你希望得到一個錯誤而不是一個空操作)。
請注意,這種方式並不是萬無一失的:它只會影響直接執行的命令(而不是腳本內的命令)。使用者將能夠使用 刪除別名unalias
。
為此,請執行以下命令
alias kill=kill_disabled
或將其添加到適當的bash
啟動文件在每次登入時運行它。
現在,kill
互動式運作將產生:
$ kill 9999
-bash: kill_disabled: command not found
正如我所說,上面的方式很容易被顛覆。如果您需要一種萬無一失的方法,唯一的解決方案是在chroot
環境。它仍然只會禁用庫存命令,不是直接的系統調用,但完成了。後者不能被停用,因為它對於正常操作至關重要(例如, every Ctrl+C發送SIGINT
,管道需要SIGPIPE
,後台進程由五個以上不同的信號控制)。設定 chroot 環境是一項高階任務,如果使用者需要存取整個檔案系統,通常會很不方便。
答案4
如果您希望使用者能夠kill
正常使用,除非他們試圖殺死您的特定程序,您可以在使用者設定kill
檔中定義一個函數.bashrc
,並在該函數中檢查使用者是否試圖殺死您的程式。如果沒有,您可以kill
從函數本身內部呼叫該實用程式。
作為一個例子,我編寫了一個小的終止函數,它不會終止該sleep
實用程序,但對於提供給它的任何其他參數來說,它將充當正常的終止實用程式。
function kill() {
process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
if [[ $process == "sleep"]]
then
echo "Killing $process is not allowed"
else
/bin/kill $@
fi
}