通过带变量的ssh awk

问题描述 投票:0回答:2

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

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

有没有办法让它运作?

请帮我!非常感谢!

bash awk ssh
2个回答
3
投票

Simpler command

尝试:

ssh USER@SERVER 'ps -p "$(pgrep -d, xyz)" -o comm='

Notes

  1. -p "$(pgrep -d, xyz)"选择名称包含字符串xyz的命令。
  2. -o comm=选择您想要的输出格式。

Quoting and the original command

而不是原始命令,尝试:

ssh USER@SERVER 'command=`ps -aux | grep xpdf | grep -v grep | awk '\''{ print $11}'\''` && echo $command'

请注意,在引用的命令字符串中,'已被'\''替换。

Discussion

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

'command=`ps -aux | grep xyz | grep -v grep | awk '{ print $11}'` && echo $command'

它包括以下内容:

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

没有办法将单引号放在单引号字符串中。一个人必须结束第一个带引号的单引号的单引号字符串,然后使用转义的单引号跟随它,并使用单引号跟随它以打开单引号字符串。


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和shell报价笨手笨脚。

关于你希望完成什么的更多澄清?

© www.soinside.com 2019 - 2024. All rights reserved.