SSH на удаленный сервер и найдите конкретную PID и убить его

В качестве однострочника вы должны передать сценарий в качестве аргумента функции expect -c

expect -c 'spawn ssh user@my.server.com; expect "assword:"; send "mypassword\r"; interact'

Обратите внимание, что кавычки оболочки следующие: '...' и » ... ", и соответствующие кавычки expect: {...} и " ... ", поэтому есть некоторая гибкость для передачи переменных оболочки и т. Д.

Но это быстро становится нечитаемым и недостижимым.

0
26.11.2018, 13:54
2 ответа

Вы пропустили элемент трубопровода(|вместо;)в своей команде. Я предлагаю этот:

ssh -t test@192.168.94.139  "sudo netstat -plnt | grep 2020 | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"

Я предполагаю, что у вас установлено sudoи разрешено использовать его на вашем сервере. Мои тесты показали, что вам может понадобиться это, чтобы заставить netstatправильно работать с опцией -p.

Здесь я предпочитаю использовать grep+ sed, чтобы избежать слишком -сложного (на мой взгляд )awk-скрипта.

  • -t:позволяет ввести пароль пользователя для выполнения команды sudo
  • grep 2020:фильтрует номер порта
  • awk '{print \$7}':позволяет awkвыбрать правильное поле
  • sed s+/.*++g:удаляет /и последующие символы (примечание :знак +заменяет здесь традиционный /для краткости)
  • sort -u:на всякий случай, если у вас будет несколько процессов, работающих с портом (происходит, если используются и IPv4, и IPv6)
  • xargs kill:вызывает kill, используя стандартный ввод в качестве параметра

Вам может понадобиться добавить sudoк последнему, если процесс, который нужно убить, принадлежит другому пользователю:sudo xargs kill

В качестве примера вы также можете использовать переменные (обратите внимание на двоеточие -с запятой, используемое для разделения команд без конвейера):

server=test@192.168.94.139 ; port=2020 ; ssh -t $server "sudo netstat -plnt | grep $port | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"
0
28.01.2020, 04:08

Вы достаточно близко подошли к своей цели. Хотя есть некоторые недостающие моменты.

  1. После IP-адреса узла точка с запятой не требуется, удаленная команда должна идти сразу после IP-адреса. Итак, уберите точку с запятой.
  2. Замените другую точку с запятой перед awk знаком вертикальной черты |-, чтобы вывод netstat направлялся в awk.
  3. Все знаки доллара должны быть экранированы обратной косой чертой. в противном случае он оценивается на локальной машине

Вы получите PID после выполнения вышеуказанных пунктов (, если таковой имеется ). Затем вам нужно будет передать этот PID для команды kill. Я бы посоветовал вам использовать xargs kill, так как здесь он выглядит самым простым. Таким образом, PID будет принят командой kill.

Таким образом, окончательная версия может выглядеть так:

ssh -T test@192.168.94.139 "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"

Не самый лучший вид, но мне подходит ваш подход.

0
28.01.2020, 04:08

Теги

Похожие вопросы