通过 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

简化命令可能会更容易,这样 shell 可能会遇到更少的特殊字符:

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

$()第二个命令在本地子 shell 中运行代码部分 ( )。您需要通过转义特殊字符(基本上$)使其在另一端运行:

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

相关内容