在命令的参数中转义特殊字符

时间:2014-11-12 15:24:55

标签: bash

我在脚本中使用以下命令:

ssh user@<ip> "ssh user1@<ip1> 'df -k /local/ | awk '{print \$4}' | tail -1'"

所以它会在特殊字符'$'时转义,但它会在第二个服务器中发送如下命令:

debug1: Sending command: df -k /local/ | awk {print } | tail -1
awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string

有人可以帮我解决问题吗?

3 个答案:

答案 0 :(得分:1)

这里的文件很有用

ssh user@<ip> <<EOIP
ssh user1@<ip1> <<EOIP1
df -k /local/ | awk '{print \$4}' | tail -1
EOIP1
EOIP

如果第二台服务器要求输入密码,那么这不会起作用,而是使用sshpass提供密码

ssh user@<ip> <<EOIP
sshpass -p password ssh user1@<ip1> <<EOIP1
df -k /local/ | awk '{print \$4}' | tail -1
EOIP1
EOIP

答案 1 :(得分:1)

实际上,在这种特殊情况下不需要外部引号。

ssh user@<ip> ssh user1@<ip1> "df -k /local/ | awk '{print \$4}' | tail -1"

但也没有理由在远程主机上运行后处理。

ssh user@<ip> ssh user1@<ip1> df -k /local/ | awk '{print $4}' | tail -1

您还可以优化tail

ssh user@<ip> ssh user1@<ip1> df -k /local/ | awk '{x=$4}END{print x}'

在一般情况下,如果你需要混合双引号和单引号,你可以在双引号内反斜杠转义双引号,但单引号内的单引号是不可能的。

ssh user@<ip> "ssh user1@<ip1> \"df -k /local/ | awk '{x=\$4}END{print x}'\""

答案 2 :(得分:0)

使用转义引号尝试此命令:

ssh user@<ip> "ssh user1@<ip1> \"df -k /local/ | awk '{print \$4}' | tail -1\""