错误的stdio转发规范'%h:%p''

时间:2018-10-31 11:14:06

标签: bash macos shell

[OS-macOS,Shell-Bash]

我有一个小的bash脚本,可以根据输入参数生成ssh命令。生成的命令是:

ssh -o ProxyCommand='ssh <bastion_name> -W %h:%p' -A -D <port> <username>@<destination_host_name>

该脚本将此命令存储在一个名为cmd的变量中,其中

cmd="ssh -o ProxyCommand='ssh $1 -W %h:%p' -A -D $3 $4@$2"

其中$ 1 =堡垒名称,$ 2 =目标主机名称,$ 3 =端口和$ 4 =用户名。

然后尝试执行类似的命令,

echo "Executing --> $cmd"
$cmd

但由于以下错误而终止

Bad stdio forwarding specification '%h:%p''

但是由于我在回应cmd,所以我直接将粘贴复制到终端中,并且它可以正常运行。

请注意,bastion_name是通过ssh config解析的,该配置具有为该堡垒主机定义的用户名和其他属性。

这里的问题是什么,因为命令显然是正确的?

2 个答案:

答案 0 :(得分:3)

尽量不要使用eval,因为它是邪恶的。

总是引用您的变量(除非您有理由不这样做)。永远不要$cmd,永远不要"$cmd"

使用bash数组:

cmd=(ssh -o ProxyCommand='ssh '"$1"' -W %h:%p' -A -D "$3" "$4@$2")

echo "Executing -->" "${cmd[@]}"
"${cmd[@]}"

了解有关引用here的更多信息。

@edit:将$1部分用单引号引起来,因为OP的目的是扩展它。固定执行->行。

答案 1 :(得分:0)

这有效,

cmd=("-o ProxyCommand='ssh $bastion -W %h:%p' -A -D $port $user@$host")
echo "Executing --> $cmd"
eval "ssh ${cmd[@]}"