如何終止 Linux 使用者除第一個使用者之外的所有會話,並限制使用者只能登入一個會話

如何終止 Linux 使用者除第一個使用者之外的所有會話,並限制使用者只能登入一個會話

我需要知道如何殺死登入使用者的所有進程,除了 linux redhat 6 中的第一個進程。

例如,AZain用戶從不同的電腦多次登錄,因此我只需要允許第一個進程並殺死該用戶的所有其他進程:

who -u
AZain    pts/2        2016-06-23 08:34   .         27191 (localhost)
AZain    pts/4        2016-06-23 09:01   .         28885 (localhost)
root     pts/0        2016-06-23 08:14   .         25962 (10.11.155.23)
AZain    pts/1        2016-06-23 08:34 00:27       27169 (10.11.155.23)
AZain    pts/3        2016-06-23 09:01   .         28867 (10.11.155.14)

編輯:我正在嘗試這樣做,因為我有一個使用使用者許可證的應用程式。因此,同一用戶的每個新會話都會消耗更多許可證。如果我可以阻止同一用戶的任何新登錄,那就太好了。

答案1

這是經典XY問題- 您試圖限制每個使用者執行的許可軟體的實例數量,但您的重點是限制 shell 登入。這是一個錯誤的問題。

更好的解決方案是:

  • 重新命名程序,例如從/usr/local/bin/foo/usr/local/bin/foo.real

  • 編寫一個與原始程式同名和路徑的包裝腳本(例如/usr/local/bin/foo)來檢查使用者是否已經在運行它。

    如果是,則退出並顯示相應的錯誤訊息。如果沒有,則運行原始程式(/usr/local/bin/foo.real

一個非常簡單的例子:

#! /bin/sh

if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
  echo "You are already running foo" >&2
  exit 1
else
  foo.real
fi

注意:這適用於了解許可問題並且不介意遵守規則的行為良好的用戶。它不會阻止狡猾的用戶foo.real自行運行。您可以透過添加 或 來阻止偷偷摸摸但不是很聰明alias foo.real=foo/etc/profile用戶/etc/bash.bashrc

您可以執行一個根 cron 作業,該作業偵測到foo.real正在執行的實例沒有稱為foo父進程的 shell 腳本。 cron 作業可能會殺死任何此類實例和/或透過電子郵件向您發送警告(為了避免給自己發送垃圾郵件,請追蹤foo.real 的進程ID,並且不要向自己發送有關同一PID 的多個警告)。


順便說一句,如果您的許可軟體附帶某種許可證管理器,請檢查其文件以查看它是否可以限制每個使用者的實例數量。

相關內容