我需要执行shell命令,如下所示:
ssh <device> "command"
命令被调用为:
$(typeset); <function_name> \"arguement_string\"; cd ...; ls ...
如何引用这里?这是对的吗?
""$(typeset); <function_name> \"arguement_string\""; cd ...; ls ..."
我对shell脚本中的引用感到困惑。
答案 0 :(得分:3)
我会使用here document:
ssh machine <<'EOF'
hello() {
echo "hello $1!"
}
hello "world"
EOF
请注意,我将起始EOF
包装在单引号中。这样做可以防止bash在本地shell中解释变量或命令替换。
答案 1 :(得分:3)
请勿尝试手工引用 - 请求shell为您完成!
command_array=( function_name "first argument" "second argument" )
printf -v command_str '%q ' "${command_array[@]}"
ssh_str="$(typeset); $command_str"
ssh machine "$ssh_str"
然后,您可以根据需要构建command_array
- 使用逻辑有条件地附加值,只使用引用类型通常引用这些值,并让{{1}添加使内容安全通过ssh所需的所有其他引用。
如果您尝试逐步构建脚本,可以这样做:
printf %q
请注意,在这种情况下,所有扩展都是在本地,生成脚本时进行的,并且不能使用shell构造(如重定向运算符)(除非将它们嵌入到函数中然后传递使用remote_script="$(typeset)"$'\n'
safe_append_command() {
local command_str
printf -v command_str '%q ' "$@"
remote_script+="$command_str"$'\n'
}
safe_append_command cp "$file" "$destination"
safe_append_command tar -cf /tmp/foo.tar "${destination%/*}"
# ...etc...
ssh machine "$remote_script"
)到远程系统。这样做意味着传递给typeset
的数据不能被视为代码 - 以牺牲灵活性为代价来排除大量潜在的安全漏洞。