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

Bash 错误的stdio转发规范';%h:%p'';,bash,macos,shell,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> 其中$1=堡垒名称,$2=目的地主机名称,$3=端口,$4=用户名 然后它尝试执行命令,比如 echo "Executing -->

[OS-macOS,Shell-Bash]

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

ssh -o ProxyCommand='ssh <bastion_name> -W %h:%p' -A -D <port> <username>@<destination_host_name>
其中$1=堡垒名称,$2=目的地主机名称,$3=端口,$4=用户名

然后它尝试执行命令,比如

echo "Executing --> $cmd"
$cmd
但它以以下错误终止:

Bad stdio forwarding specification '%h:%p''
但由于我在回显cmd,所以我直接在终端中复制粘贴,它运行时没有任何错误

请注意,bastion_名称是通过ssh config解析的,ssh config为该bastion主机定义了用户名和其他属性


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

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

总是引用你的变量(除非你有理由不引用)。从不
$cmd
始终
“$cmd”

使用bash数组:

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

echo "Executing -->" "${cmd[@]}"
"${cmd[@]}"
了解更多有关引用的信息


@编辑:从单引号中取出
$1
部分,因为OPs的目的是扩展它。修正执行-->行。

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

总是引用你的变量(除非你有理由不引用)。从不
$cmd
始终
“$cmd”

使用bash数组:

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

echo "Executing -->" "${cmd[@]}"
"${cmd[@]}"
了解更多有关引用的信息

@编辑:从单引号中取出
$1
部分,因为OPs的目的是扩展它。修复了执行-->行的问题。

此操作有效

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

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

不要将命令放在变量中,它们用于数据,而不是可执行代码。请参阅直接执行命令,或使用函数,或(如有必要)使用数组。在某些情况下,您可能希望将可执行文件另存为数据。下面是这样一个场景的示例:创建一个脚本,该脚本将循环通过与特定模式匹配的环境变量,并执行通过参数传递的命令。不要将命令放入变量中,它们用于数据,而不是可执行代码。请参阅直接执行命令,或使用函数,或(如有必要)使用数组。在某些情况下,您可能希望将可执行文件另存为数据。下面是这样一个场景的示例:创建一个脚本,该脚本将循环通过与特定模式匹配的环境变量,并执行通过参数传递的命令。这在macOS上不起作用
cmd=(ssh-o-ProxyCommand='ssh$1-W%h:%p'-A-D“$3”“$4@$2”)
echo“$cmd”
Output-->
ssh
cmd=(“-o-ProxyCommand='ssh$bastion-W%h:%p'-A-D$port$user@$host”)评估“ssh${cmd[@]}”是否有效。我想你是想让
ssh
退出阵列。另外,如果没有
eval
,它也无法工作。我的意思是,正如我写的那样..在第一条注释中
echo“$cmd”
等于
echo“${cmd[0]}”
-它将只打印数组的第一个元素。使用
echo“${cmd[@]}”
将它们全部打印出来。在第二条注释中,
eval“ssh${cmd[@]}”
是邪恶的-
cmd=(“-o…”;rm-rf/”;eval“ssh${cmd[@]}”将格式化您的驱动器。您可以
sshargs=$(-o ProxyCommand=''”;ssh“${sshargs[@]}”。它在我的电脑上工作。我会编辑这篇文章,因为你可能也想查看
$1
。您可以阅读有关引用的内容。我的错误,回音错误,我没有打印所有数组元素,但在没有
eval
的情况下,命令无法运行。无论如何,我有一个解决方案,现在作为答案张贴。另外,商定的
eval
是邪恶的,但对于我的用例来说,它是安全的。这在macOS上不起作用
cmd=(ssh-o-ProxyCommand='ssh$1-W%h:%p'-A-D“$3”“$4@$2”)
echo“$cmd”
Output-->
ssh
cmd=(“-o-ProxyCommand='ssh$bastion-W%h:%p'-A-D$port$user@$host”)评估“ssh${cmd[@]}”是否有效。我想你是想让
ssh
退出阵列。另外,如果没有
eval
,它也无法工作。我的意思是,正如我写的那样..在第一条注释中
echo“$cmd”
等于
echo“${cmd[0]}”
-它将只打印数组的第一个元素。使用
echo“${cmd[@]}”
将它们全部打印出来。在第二条注释中,
eval“ssh${cmd[@]}”
是邪恶的-
cmd=(“-o…”;rm-rf/”;eval“ssh${cmd[@]}”将格式化您的驱动器。您可以
sshargs=$(-o ProxyCommand=''”;ssh“${sshargs[@]}”。它在我的电脑上工作。我会编辑这篇文章,因为你可能也想查看
$1
。您可以阅读有关引用的内容。我的错误,回音错误,我没有打印所有数组元素,但在没有
eval
的情况下,命令无法运行。无论如何,我有一个解决方案,现在作为答案张贴。另外,一致同意的
eval
是邪恶的,但对于我的用例来说,它是安全的。不要使用
eval
——它在这里工作的唯一原因是定义数组时引用错误。基本上,这里有两个错误(引用和
eval
),这两个错误主要是相互抵消的。但只是大部分。最好一开始就把报价准确。请参阅@KamilCuk的最新编辑。不要使用
eval
——它在这里工作的唯一原因是定义数组时引用错误。基本上,这里有两个错误(引用和
eval
),这两个错误主要是相互抵消的。但只是大部分。最好一开始就把报价准确。请参阅@KamilCuk的最新编辑。