[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解析的,该配置具有为该堡垒主机定义的用户名和其他属性。
这里的问题是什么,因为命令显然是正确的?
答案 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[@]}"