Как выполнять команды подоболочки через SSH?

Вы предоставили достаточно информации, чтобы определить, в чем проблема, но не как ее исправить.

Сообщение «Синтаксическая ошибка:» («неожиданно» явно исходит из оболочки. Почему оболочка пытается выполнить ваш двоичный файл? Потому что ядро ​​попыталось и отказалось. Когда это происходит, sudo решает, что это может быть оболочка сценарий, у которого отсутствует правильный заголовок и который пытается вызвать оболочку по своему выбору (sudo пытается запустить sh ).

Почему ядро ​​не смогло запустить программу? исполняемый файл находится в неподдерживаемом формате. Это даже не просто из-за того, что он был скомпилирован для неправильной архитектуры (например, попытка запустить 64-разрядный двоичный файл x86 в 32-разрядной системе или наоборот) или для неправильной операционной системы ( например, попытка запустить исполняемый файл FreeBSD в Linux): ядро ​​вообще не распознает файл как имеющий исполняемый формат. Например, если вы пытались запустить это в Linux, это означает, что у вас не ELF двоичный.Среди распространенных операционных систем это может быть вызвано попыткой запустить двоичный файл macOS в Linux или наоборот.

Обратите внимание, что проблема не из-за плохих разрешений или отсутствия библиотек. Если бы одна из этих проблем была проблемой, ядро ​​сообщило бы о другой ошибке, и вместо этого sudo не попытался бы запустить оболочку.

Решение состоит в том, чтобы скомпилировать программу для правильной операционной системы и правильной архитектуры. Если вы не можете скомпилировать на той же машине, на которой запускаете программу, вам может потребоваться установить кросс-компилятор . Если у вас нет возможности перекомпилировать программу, возможно, есть способ запустить ее в эмуляторе, но обычно это намного сложнее и медленнее, чем перекомпиляция, поэтому попробуйте ее только в крайнем случае.

1
18.04.2016, 10:07
4 ответа

Я заключил команду kill -9 $ (ps -ef | awk "/ service_name / {print \ $ 2}") в символ '' ' и запустил его с помощью моей утилиты, и это сработало как шарм. Итак, вот последняя команда:

`kill -9 $(ps -ef | awk "/service_name/{print \$2}")`
-2
27.01.2020, 23:11

Не следует вводить grep в awk!

ps -ef | awk '/service_name/ { print $2}' | xargs kill -9

или

pkill service_name
6
27.01.2020, 23:11

Попробуйте:

ps -ef | grep service_name | awk '{print $2}' | xargs kill -9

Вы можете сначала протестировать его.

1
27.01.2020, 23:11

На самом деле подстановка команд, которая не является просто подоболочкой, работает отлично. Ваша проблема в том, что вы хотите, чтобы он выполнялся в удаленной системе удаленной оболочкой, потому что процессы, которые вы хотите убить, являются процессами в удаленной системе. Поэтому вы должны процитировать его, который становится немного неуклюжим, хотя вы можете отказаться от grep, когда у вас есть awk. Два варианта:

ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \$2}")'

Однако лучшим решением этой проблемы на большинстве Linux и некоторых (?) других Unix является pkill, который выполняет всю работу по поиску процессов, выполняющих определенную команду, и убивает их:

ssh user@remote pkill -9 service_name

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

ssh user@remote pkill -f -9 service_name
9
27.01.2020, 23:11

Теги

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