我正在尝试设置一个在 bash 脚本中使用另一个变量的变量:
echo "Enter server IP:"
read serverIP
ssh="ssh $serverIP"
$ssh cp ...
$ssh mv ...
$ssh rm ...
但是,这不起作用。在这种情况下,正确的语法是什么?
我正在尝试设置一个在 bash 脚本中使用另一个变量的变量:
echo "Enter server IP:"
read serverIP
ssh="ssh $serverIP"
$ssh cp ...
$ssh mv ...
$ssh rm ...
但是,这不起作用。在这种情况下,正确的语法是什么?
您可以使用
SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"
你可以走了
如果你想通过 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"
成功!
尝试
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} ....
.
我希望这有帮助。