我正在尝试设置一个在bash脚本中使用另一个变量的变量:
echo "Enter server IP:"
read serverIP
ssh="ssh $serverIP"
$ssh cp ...
$ssh mv ...
$ssh rm ...
然而,这不起作用。在这种情况下,正确的语法是什么?
答案 0 :(得分:1)
你可以使用
SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"
你很高兴
答案 1 :(得分:1)
如果您想运行remote commands via SSH,唯一安全的方法是使用arrays和参数转义。
首先,使用一个数组来存储命令,选项,标志,参数等。例如:
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"
成功!
答案 2 :(得分:0)
尝试
eval $ssh cp ...
我不认为设置serverIP和ssh是引用该值的问题。
Eval推迟从shell到系统的最终提交命令,允许另一次传递。在第一次传递中,$ssh
被扩展,在第二次和最后一次(eval)传递中,现在shell可以看到$ ssh实际上意味着ssh 10.10.10.10
(例如)。
Eval被认为是邪恶的,用户可以通过执行/bin/rm -rf /*
的serverIP变量提交正确的sytnax。所以要小心你如何使用它。
最后一点琐事,有可能,但几乎不是每一个实际的,在一条线上使用更多的1 eval传递,即eval eval eval... \$${ssh} ....
。
我希望这会有所帮助。