我想尝试执行这样的事情:
ssh USER@SERVER 'command=`ps -aux | grep xyz | grep -v grep | awk '{ print $11}'` && echo $command'
我得到了
awk: cmd. line:1: {
awk: cmd. line:1: ^ unexpected newline or end of string
有没有办法让它发挥作用?
请帮帮我! 非常感谢!
答案 0 :(得分:3)
尝试:
, "marque":"Klorane",
ssh USER@SERVER 'ps -p "$(pgrep -d, xyz)" -o comm='
选择名称中包含字符串-p "$(pgrep -d, xyz)"
的命令。
xyz
选择您想要的输出格式。
尝试:
,而不是原始命令-o comm=
观察,内部引用的命令字符串ssh USER@SERVER 'command=`ps -aux | grep xpdf | grep -v grep | awk '\''{ print $11}'\''` && echo $command'
已替换为'
。
这不是一个单引号字符串:
'\''
它包含以下内容:
单引号字符串:
'command=`ps -aux | grep xyz | grep -v grep | awk '{ print $11}'` && echo $command'
不带引号的字符串:
'command=`ps -aux | grep xyz | grep -v grep | awk '
单引号字符串:
{ print $11}
无法将单引号放在单引号字符串中。一个必须结束第一个带引号的单引号的单引号字符串,使用转义的单引号跟随它,然后使用单引号打开单引号字符串。
答案 1 :(得分:0)
这里有一堆令人困惑的事情。首先:您可以完全在awk中重构远程命令:
awk 'BEGIN { cmd="ps aux"; while( (cmd | getline) >0) {if($0 ~ /xyz/) print $11}}'
如果你碰巧知道你期望哪个领域" xyz"发生在,你可以直接测试,消除你的负面测试(我上面已经省略)。如果你坚持,我们可以补充一下:
awk 'BEGIN { cmd="ps xyz"; while( (cmd | getline) >0) {if($0 ~ /xyz/ && $0 !~ /awk/) print $11}}'
但请说我对用户clamav
的用途感兴趣:
awk 'BEGIN { cmd="ps aux"; while( (cmd | getline) >0) {if($1 ~ /clamav/) print $11}}'
另一个问题是您远程定义和回显环境变量,这引入了许多复杂情况。为什么不利用SendEnv
。通常这是LANG LC_*
,但后者对其允许的内容是自由的:
export LC_command="awk 'BEGIN { cmd=\"ps aux\"; while( (cmd | getline) >0) {if($1 ~ /clamav/) print $11}}'"
ssh -o USER@HOST 'echo $LC_command'
其他选项包括提供可以远程执行的脚本或shell函数,这可以避免大量的SSH和贝壳报价摸索。
还有关于你希望完成什么的澄清?