使用printf %q
生成的參數列表的eval
-safe的字符串形式:
# generate a string which evals to list of command-line parameters
printf -v cmd_str '%q ' "[email protected]"
# pass that list of parameters on the remote shell's command line
ssh "$host" "bash -s $cmd_str" <<'EOF'
echo "This is running on the remote host."
echo "Got arguments:"
printf '- %q\n' "[email protected]"
EOF
對於你真正做,最好的做法可能會使用ProxyCommand - 請參閱the relevant documentation - 並通過代理轉發將您的私鑰暴露出來,而不是讓它位於磁盤上的反彈主機上。這就是說,它是直截了當採用上面給出以適應問題的代碼答案:
#!/bin/bash
printf -v args '%q ' "[email protected]"
echo "Arguments on original host are:"
printf '- %q\n' "[email protected]"
ssh -t "StrictHostKeyChecking=no" -i "$1" [email protected] "bash -s $args" <<'EOF1'
printf -v args '%q ' "[email protected]"
echo "Arguments on ip1 are:"
printf '- %q\n' "[email protected]"
ssh -t -i "$1" [email protected] "bash -s $args" <<'EOF2'
echo "Arguments on ip2 are:"
printf '- %q\n' "[email protected]"
EOF2
EOF1
如果你想要比我已經提供的更好的答案,你需要問一個更好的問題。顯示代碼來重現問題,也許? –
請查看[如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 – Cyrus
已添加代碼。 –