Вот мой собственный ответ:
Вместо использования 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](https://i.stack.imgur.com/lGpBF.png)
Тогда для его запуска при входе в систему необходимо перейти в System Preferences> Пользователи Группы &> Вход Items и установить его для запуска при входе в систему.
![enter image description here](https://i.stack.imgur.com/au0TQ.png)
Наконец, если вы хотите заказную иконку приложения просто скопировать и вставить часть файла изображения в иконку в закладке Получить Info.
Копия (Command + c) часть изображения.
![enter image description here](https://i.stack.imgur.com/hgYBV.png)
правой кнопкой мыши на приложении.
![enter image description here](https://i.stack.imgur.com/fjJXY.png)
Нажмите на маленькую иконку (она должна выделить синим цветом) и вставить (Ctrl + V) скопированного изображения.
![enter image description here](https://i.stack.imgur.com/KwElL.png)
А теперь у вас есть приложение, которое проверяет для любых ССТСОВ, запущенных на вашем компьютере!
![enter image description here](https://i.stack.imgur.com/Vo4Gr.jpg)
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