В качестве однострочника вы должны передать сценарий в качестве аргумента функции expect -c
expect -c 'spawn ssh user@my.server.com; expect "assword:"; send "mypassword\r"; interact'
Обратите внимание, что кавычки оболочки следующие: '...' и » ... ", и соответствующие кавычки expect: {...} и " ... ", поэтому есть некоторая гибкость для передачи переменных оболочки и т. Д.
Но это быстро становится нечитаемым и недостижимым.
Вы пропустили элемент трубопровода(|
вместо;
)в своей команде. Я предлагаю этот:
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"
Вы достаточно близко подошли к своей цели. Хотя есть некоторые недостающие моменты.
|
-, чтобы вывод netstat направлялся в awk. Вы получите 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"
Не самый лучший вид, но мне подходит ваш подход.