выполнить команду через ssh-соединение

выполнить команду через ssh-соединение

Я хочу выполнить следующую команду через SSH-соединение:

tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}' 

Эта команда работает на моем целевом компьютере.

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

ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}' 

Результатом является

 cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

Что не так с моим звонком?

решение1

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

ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'

Конечный фрагмент 2>/dev/nullотбрасывает текст ошибки в случае, если PID-файл либо не может быть найден, либо содержит устаревший PID.

решение2

Я бы рекомендовал поместить эти команды в скрипт, который вы вызываете удаленно с помощью ssh. В противном случае вам придется заключить всю "удаленную" часть командной строки в кавычки и правильно экранировать все внутри. Это может быть утомительно и подвержено ошибкам. Вот почему удаленный вызов скрипта.

решение3

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

ssh jboss@myTargetServer tmpValue=\$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
 && top -b -U jboss -n 1 |grep \$tmpValue |awk '{print $9}'

или поместить все в апострофы 'и экранировать внутренние:

ssh jboss@myTargetServer 'tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
 && top -b -U jboss -n 1 |grep \$tmpValue |awk \'{print $9}\''

Я это не проверял, но основная идея в том, что нужно сделать, чтобы это исправить, такова.

решение4

Если вы действительно не хотите писать сценарии, вы можете обнаружить, Здесь документудобно. Короче говоря, вы добавляете << SOMETEXMARKERв конец строки и продолжаете вводить столько команд для удаленного хоста, сколько вам нужно. Затем, в последней строке вы вводите (в самом начале строки) то же самое SOMETEXTMARKERи это заставляет введенные команды выполняться удаленно

Вот пример

[bobby@bobby ~]$ ssh jimmy@jimmy << MRK '
> # single quote above makes all vars resolve on remote host
> echo remote user and host are : 
> echo $USER $(hostname)
> # entereing closing single quote
> '
> # finally entereing the marker
> MRK
remote user and host are :
jimmy jimmy

Связанный контент