如何在单个 ssh 命令中使用 bash $(awk)?

Posted

技术标签:

【中文标题】如何在单个 ssh 命令中使用 bash $(awk)?【英文标题】:How to use bash $(awk) in single ssh-command? 【发布时间】:2013-01-20 08:47:54 【问题描述】:

我正在尝试在 ssh 上执行一个包含 `sub-code` 或 $(sub-code) 的命令(我一直使用它,但我不知道它的正式名称)是首先执行,但在目标服务器上。

为了论证,假设这是我要使用的命令。当然,这可以通过hostname 完成,但这只是一个简化的示例,其中包含我想要使用的所有格式化向导。

echo `uname -a | awk 'print $2'`

没问题。但是你如何正确地逃避这个以在一个命令中通过ssh 发送它?以下是错误的,因为它让服务器回复您的本地主机名。子代码在本地执行:

ssh myServer echo `uname -a | awk 'print $2'`

但是想到的任何逃避都是行不通的:

$ ssh myServer echo \`uname -a | awk 'print $2'\`
awk: cmd. line:1: print $2`
awk: cmd. line:1:           ^ invalid char '`' in expression
$ ssh myServer echo \$(uname -a | awk 'print $2')
bash: syntax error near unexpected token `('
$ ssh myServer echo \$\(uname -a | awk 'print $2')
bash: syntax error near unexpected token `)'
$ ssh myServer echo \$\(uname -a | awk 'print $2'\)
awk: cmd. line:1: print $2)
awk: cmd. line:1:           ^ syntax error
bash: -c: line 0: unexpected EOF while looking for matching `)'
bash: -c: line 1: syntax error: unexpected end of file

我想要一个答案,包括使用正确转义的` or $() because I'd like to know if it's possible.echo` 可能会更复杂。

【问题讨论】:

为什么是echo `command`?为什么不command @anishsane 因为他想了解如何通过 ssh 将反引号或 $( 传递到远程服务器 【参考方案1】:

只是一些补充说明:

在我的情况下,$ 的转义无济于事:

ts1350:> ssh sysadm@node "grep feature features.txt| awk 'print $6' "
Password: 
A  feature   -name  ue_trace_mme    | off
ts1350:> ssh sysadm@node "grep feature features.txt| awk 'print \$6' "
Password: 
awk: cmd. line:1: print \
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: print \
awk: cmd. line:1:        ^ syntax error
ts1350:> ssh sysadm@node "grep feature features.txt| awk 'print \\$6' "
Password: 
awk: cmd. line:1: print \\
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: print \\
awk: cmd. line:1:        ^ syntax error

$ 之间添加一个space 并且数字有效:

Fri Oct  4 14:49:28 CEST 2019
ts1350:> ssh sysadm@node "grep feature features.txt| awk 'print $ 6' "
Password: 
off

希望这种次要方式可以帮助像我这样的人。

感谢@dave 的回答:How to print a specific column with awk on a remote ssh session?

【讨论】:

【参考方案2】:

最好将 heredocssh 一起使用,以避免在更复杂的命令中到处转义引号:

ssh -T myServer <<-'EOF'
uname -a | awk 'print $2'
exit
EOF

【讨论】:

【参考方案3】:

如果您尝试获取主机名,请使用:

ssh myServer "uname -n"

【讨论】:

【参考方案4】:

试试这个

ssh myServer "uname -a | awk 'print \$2' "

使用双引号 " 对您将远程执行的命令进行分组。

您还需要对$2 参数中的$ 进行转义,使其不在本地计算,而是远程传递给awk

编辑:

如果您想包含$( ),您必须再次转义$ 符号,如下所示:

ssh myServer "echo \$(uname -a | awk 'print \$2') "

你也可以转义 backtick `,像这样:

ssh myServer "echo \`uname -a | awk 'print \$2'\` "

【讨论】:

@Redsandro 我想我知道如何逃避$( 和ssh 上的反引号。刚刚更新了我的答案... 如果你在res=`ls | awk 'print \\$2'`这样的子命令中执行,我们这里需要两个转义。 是的,我正在尝试 sshpass 在远程服务器上执行 /proc/loadavg 并使用 awk 过滤结果。感谢您的回答。转义序列成功了!谢谢【参考方案5】:

如何通过管道输出命令并在本地运行 awk?

ssh yourhost uname -a | awk ' print $2  '

【讨论】:

谢谢,这在某些情况下有效。但是,为了获得更多功能,user000001 的答案正是我想要的。 :)【参考方案6】:

解决方法是使用命令创建一个 sh 文件,然后将其传递给 ssh 命令:

test.sh

echo `uname -a | awk 'print $2'`

和命令:

ssh myServer 'bash -s' < test.sh

更新

不带引号的命令也可以正常工作:

ssh myServer uname -a | awk 'print $2'

【讨论】:

@"不带引号的命令也可以正常工作:"正在执行的 awk 是本地 awk,不在远程系统上。 是的,所有 3 个问题的命令在本地运行正确的部分(在管道之后)。所以唯一的解决办法就是把命令保存在脚本里。 谢谢,这行得通。赞成。但是 user000001 在一个命令中完全符合我的要求,我已经接受了那个命令。 :) “所以唯一的解决方案是将命令保存在脚本中”:我反对“唯一”这个词。可能您的意思是“最简单”。 对不起,我的意思是答案。我已经测试了 user000001 的最后一个命令,它在远程服务器上运行,所以我错了。

以上是关于如何在单个 ssh 命令中使用 bash $(awk)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 脚本中使用 Expect 为 SSH 命令提供密码

如何在 ssh / 远程 bash 命令中转义单引号字符?

当我通过 Git Bash 中的 ssh 在远程 Linux 机器上运行命令时,如何将文件的内容直接复制到我的 Windows 剪贴板中?

如何从 bash 脚本中 ssh?

在 bash 脚本中为 ssh 命令提供密码,无需使用公钥和 Expect

AWS:使用 Elastic Beanstalk 命令行界面 (EB CLI) 3.x SSH 到 EC2