我想尝试执行这样的事情:
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
有没有办法让它运作?
请帮我!非常感谢!
尝试:
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}
'` && echo $command'
没有办法将单引号放在单引号字符串中。一个人必须结束第一个带引号的单引号的单引号字符串,然后使用转义的单引号跟随它,并使用单引号跟随它以打开单引号字符串。
这里有一堆令人困惑的事情。首先:您可以完全在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和shell报价笨手笨脚。
关于你希望完成什么的更多澄清?