Я хочу выполнить следующую команду через 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