例如,我想在 Ubuntu 伺服器上秘密地在後台運行一個進程,但是每當除我之外的任何人登入伺服器時,該進程都必須被該用戶殺死。是否可以建立這樣的流程? (我有帳號sudo
,可以修改/etc/bash.bashrc
)
謝謝!
答案1
請注意,以下內容可能會以各種方式損害您的系統安全。
建立一個腳本來負責終止您的進程(讓我們稱之為進程 P)。然後授予所有使用者在 sudoers 中執行此腳本的權限。最後使用 sudo into 對此腳本添加合適的呼叫/etc/bashrc
。
舉例來說,假設您知道您的進程是從何處啟動的/usr/local/sbin/myproc
,並且您希望在有人登入時立即終止所有這些進程,因此您將使用簡單的 grep 和終止策略來終止它們。
因此,首先將以下內容放入/usr/local/sbin/killmyprocs
:
#!/bin/sh
ps auxw|grep [m]yproc|awk '{ print $2 }'|xargs kill -TERM > /dev/null 2>&1
# end of file.
如果你真的繼續並實現這個,你可能想要一些稍微複雜的東西。因此,請確保建立腳本來捕獲適當的訊號,並且通常以安全的方式執行操作。
/etc/sudoers
其次,透過新增以下內容來授予所有使用者執行此腳本的權限:
ALL ALL = (root) NOPASSWD: /usr/local/sbin/killmyprocs
第三步,也是最後一步,是將 sudo 呼叫添加到您的腳本中/etc/bashrc
:
[ "`id -n -u`" != "<my_username>" ] && sudo /usr/local/sbin/killmyprocs
替換為您自己的帳戶,以避免在您自己登入時殺死您的「秘密」進程。
總結一下:1)創建一個不產生輸出但殺死您想要殺死的進程的腳本,2)/etc/sudoers
為系統上的每個用戶添加適當的條目,以便能夠以 root 身份執行該腳本,3)添加對您的腳本透過sudo /etc/bashrc
(或/etc/profile
)。
警告:(/etc/bashrc
或/etc/profile
就此而言)僅取得互動式 shell 的來源。這意味著使用者可以輕鬆地執行 ssh yourhost 'ps auxw' 並從進程表中找到您的進程,它不會被上面介紹的機制殺死,因為不參考 shell 初始化檔案。有一種方法可以解決這個問題,即ForceCommand
在「sshd_config」中使用,但這留給讀者作為練習。
最後,我想再次提醒一下,這有明顯的安全隱患。這聽起來也很像試圖在一個你沒有完全訪問權限的系統中設置後門,但這並不是我真正關心的問題(如果你必須向超級用戶詢問這些事情,無論如何你很快就會被抓住) 。
答案2
「進程必須被該用戶殺死」是什麼意思?
A)您希望使用者殺死他/她不擁有的進程?
製作腳本來終止進程,然後設定 setuid chmod u+s
(這可能是一個巨大的安全漏洞,除非您知道自己在做什麼。)
或者
B) 您希望進程注意到使用者登入並殺死自己嗎?
嗯,這就是你會做的事。