2015-02-26 3 views
1

Я хотел бы проверить, работает ли процесс sshd на пользователе ladmin и убил его от моего пользователя patrick. Я тоже администратор.Проверьте, выполняется ли ssh у другого пользователя-администратора и его убить. (AppleScript)

Вот мой код:

tell application "System Events" 
    set ProcessList to name of every process 
    if "sshd" is in ProcessList then 
     set ThePID to unix id of process "sshd" 
     do shell script "kill -KILL " & ThePID with administrator privileges 
    end if 
end tell 

Моя проблема заключается в том, что ProcessList содержит только процессы, на мой пользователь. Кроме того, он также содержит только определенные процессы, включая все мои приложения и системные события и док-станцию. Даже если процесс sshd принадлежит моему пользователю, он не отображается.

Кроме того, есть ли способ, который я могу установить для запуска при запуске/входе?

ответ

0

Вот мой собственный ответ:

Вместо использования set ProcessList to name of every process. Вместо этого используйте скрипт оболочки.

set kill_pid to do shell script "ps ax | grep sshd | grep -v grep | awk '{ print $1 }'" password "<PASSWORD>" with administrator privileges 

Но возникает проблема, потому что, когда кто-то удаленный доступ к компьютеру с SSH три различных пользователей запускать процесс SSHd.

Три пользователей:

корня _sshd

Кроме того, _sshd пользователя исчезает примерно через десять-двадцать секунд.

Таким образом, это означает, что в течение первых нескольких секунд kill_pid содержит три пятизначных номера, но после этого времени kill_pid содержит только два пятизначных номера. Кроме того, эти числа разделяются пробелом.

Чтобы исправить это довольно легко:

set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     if length of kill_pid > 5 then 
      set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     end if 

Существует еще больше проблем с этим в общей сложности. Если я хочу, чтобы скрипт продолжал проверять sshd, а не только один раз, я должен был перевести всю программу в цикл. Хотя, когда процесс sshd не работает, это:

set kill_pid to do shell script "ps ax | grep sshd | grep -v grep | awk '{ print $1 }'" password "<password>" with administrator privileges 

возвращает ошибку.

Также это довольно простое исправление, все, что вам нужно сделать, это использовать try. в контексте это выглядит следующим образом:

repeat 
    try 
     set kill_pid to do shell script "ps ax | grep sshd | grep -v grep | awk '{ print $1 }'" password "<password>" with administrator privileges 
     set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     if length of kill_pid > 5 then 
      set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     end if 
    end try 
end repeat 

Последняя проблема состоит в том, что повторять это вызывает сценарий занять 127% из 400% моего процессора.

Опять же, очень легко исправить:

delay 1 

Вот весь мой код:

repeat 
    try 
     set kill_pid to do shell script "ps ax | grep sshd | grep -v grep | awk '{ print $1 }'" password "<PASSWORD>" with administrator privileges 
     set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     if length of kill_pid > 5 then 
      set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     end if 
     if kill_pid is equal to "" then 
     end if 
     if kill_pid is not equal to "" and length of kill_pid is equal to 5 then 
      tell application "System Events" 
       set question to display dialog "Do you want SSH to be running right now?" buttons {"No", "Yes"} default button 2 
       set answer to button returned of question 
       if answer is equal to "No" then 
        do shell script "kill -KILL " & kill_pid password "<PASSWORD>" with administrator privileges 
       end if 
       if answer is equal to "Yes" then 
        set wait to display dialog "Press OK when you are done running SSH. Or click Stop to stop checking for SSH." buttons {"Stop", "OK"} default button 2 
        set ok to button returned of wait 
        if ok is equal to "OK" then 
        end if 
        if ok is equal to "Stop" then 
         exit repeat 
        end if 
       end if 
      end tell 
     end if 
    end try 
    delay 1 
end repeat 

Теперь, если вы хотите, чтобы это запустить как приложение и запустить при входе в систему выполните следующие действия:

Скопируйте и вставьте скрипт в свой редактор сценариев и перейдите в меню «Файл»> «Экспорт» и сохраните его как приложение.

enter image description here

Тогда для его запуска при входе в систему необходимо перейти в System Preferences> Пользователи Группы &> Вход Items и установить его для запуска при входе в систему.

enter image description here

Наконец, если вы хотите заказную иконку приложения просто скопировать и вставить часть файла изображения в иконку в закладке Получить Info.

Копия (Command + c) часть изображения.

enter image description here

правой кнопкой мыши на приложении.

enter image description here

Нажмите на маленькую иконку (она должна выделить синим цветом) и вставить (Ctrl + V) скопированного изображения.

enter image description here

А теперь у вас есть приложение, которое проверяет для любых ССТСОВ, запущенных на вашем компьютере!

enter image description here

EDIT

Я добавил функцию, так что вы можете увидеть, что IP является SSHed в ваш компьютер.

Вот новый код:

repeat 
    try 
     set kill_pid to do shell script "ps ax | grep sshd | grep -v grep | awk '{ print $1 }'" password "PASSWORD" with administrator privileges 
     set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     if length of kill_pid > 5 then 
      set kill_pid to do shell script "echo '" & kill_pid & "'| cut -c 7-" 
     end if 
     if kill_pid is equal to "" then 
     end if 
     if kill_pid is not equal to "" and length of kill_pid is equal to 5 then 
      tell application "System Events" 
       set userset to do shell script ("w") 
       set question to display dialog "Do you want SSH to be running right now?" buttons {"Show Users", "No", "Yes"} default button 3 
       set answer to button returned of question 
       if answer is equal to "Show Users" then 
        set userset to do shell script "echo '" & userset & "'| cut -c 56-" 
        set question2 to display dialog "Current users: 
       " & userset buttons {"Stop SSH", "Run SSH"} default button 2 
        set answer2 to button returned of question2 
        if answer2 is equal to "Stop SSH" then 
         set answer to "No" 
        end if 
        if answer2 is equal to "Run SSH" then 
         set answer to "Yes" 
        end if 
       end if 
       if answer is equal to "No" then 
        do shell script "kill -KILL " & kill_pid password "PASSWORD" with administrator privileges 
       end if 
       if answer is equal to "Yes" then 
        set wait to display dialog "Press OK when you are done running SSH. Or click Stop to stop checking for SSH." buttons {"Stop", "OK"} default button 2 
        set ok to button returned of wait 
        if ok is equal to "OK" then 
        end if 
        if ok is equal to "Stop" then 
         exit repeat 
        end if 
       end if 
      end tell 
     end if 
    end try 
    delay 1 
end repeat