0

我正在尝试设置一个在 bash 脚本中使用另一个变量的变量:

echo "Enter server IP:"
read serverIP

ssh="ssh $serverIP"

$ssh cp ...
$ssh mv ...
$ssh rm ...

但是,这不起作用。在这种情况下,正确的语法是什么?

4

3 回答 3

1

您可以使用

SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"

你可以走了

于 2012-05-24T03:37:34.780 回答
1

如果你想通过 SSH 运行远程命令,唯一安全的方法是使用数组和参数转义。

首先,使用一个数组来存储命令、选项、标志、参数等。例如:

remote_cmd=(touch -- "path with spaces")
echo "${remote_cmd[2]}" # path with spaces

您需要转义这些参数以通过 SSH 运行:

for arg in "${remote_cmd[@]}"
do
    remote_cmd_escaped+=("$(printf %q "$arg")")
done
echo "${remote_cmd_escaped[2]}" # path\ with\ spaces

然后你应该为 SSH 命令本身使用另一个数组:

ssh_cmd=(ssh "localhost" "${remote_cmd_escaped[@]}")

现在您可以毫无问题地运行它:

"${ssh_cmd[@]}"

验证文件是用空格创建的:

ls "$HOME/path with spaces"

成功!

于 2012-05-24T12:23:35.657 回答
0

尝试

 eval $ssh cp ...

我不认为设置 serverIP 和 ssh 是引用值的问题。

Eval 推迟命令从 shell 到系统的最终提交,允许再次通过。在第一遍中,$ssh扩展了,在第二遍和最后一遍(eval)中,现在 shell 可以看到 $ssh 的真正含义ssh 10.10.10.10(例如)。

Eval 被认为是邪恶的,用户有可能通过执行的 serverIP 变量提交正确的 sytnax /bin/rm -rf /*。所以要小心你如何使用它。

最后一点琐事,在一行上使用超过 1 个 eval 传递是可能的,但几乎不是每一个实际操作,即eval eval eval... \$${ssh} .....

我希望这有帮助。

于 2012-05-24T03:32:36.793 回答