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