通过带变量的ssh awk

时间:2017-12-16 21:28:15

标签: bash awk ssh

我想尝试执行这样的事情:

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

有没有办法让它发挥作用?

请帮帮我! 非常感谢!

2 个答案:

答案 0 :(得分:3)

更简单的命令

尝试:

, "marque":"Klorane",

注释

  1. ssh USER@SERVER 'ps -p "$(pgrep -d, xyz)" -o comm=' 选择名称中包含字符串-p "$(pgrep -d, xyz)"的命令。

  2. xyz选择您想要的输出格式。

  3. 引用和原始命令

    尝试:

    ,而不是原始命令
    -o comm=

    观察,内部引用的命令字符串ssh USER@SERVER 'command=`ps -aux | grep xpdf | grep -v grep | awk '\''{ print $11}'\''` && echo $command' 已替换为'

    讨论

    这不是一个单引号字符串:

    '\''

    它包含以下内容:

    1. 单引号字符串:

      'command=`ps -aux | grep xyz | grep -v grep | awk '{ print $11}'` && echo $command'
      
    2. 不带引号的字符串:

      'command=`ps -aux | grep xyz | grep -v grep | awk '
      
    3. 单引号字符串:

      { print $11}
      
    4. 无法将单引号放在单引号字符串中。一个必须结束第一个带引号的单引号的单引号字符串,使用转义的单引号跟随它,然后使用单引号打开单引号字符串。

答案 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和贝壳报价摸索。

还有关于你希望完成什么的澄清?