如何在单个 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】:最好将 heredoc 与 ssh
一起使用,以避免在更复杂的命令中到处转义引号:
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 命令提供密码
当我通过 Git Bash 中的 ssh 在远程 Linux 机器上运行命令时,如何将文件的内容直接复制到我的 Windows 剪贴板中?