使用带有函数调用的ssh命令进行引用

时间:2015-03-16 18:09:18

标签: linux bash shell ssh

我需要执行shell命令,如下所示:

ssh <device> "command"

命令被调用为:

$(typeset); <function_name> \"arguement_string\"; cd ...; ls ... 

如何引用这里?这是对的吗?

""$(typeset); <function_name> \"arguement_string\""; cd ...; ls ..."

我对shell脚本中的引用感到困惑。

2 个答案:

答案 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的数据不能被视为代码 - 以牺牲灵活性为代价来排除大量潜在的安全漏洞。