如何通过SSH将本地脚本的函数与变量传递至远程服务器
如何将本地变量和函数一起传递到远程机器执行?
问题出在你只传递了函数getIPAddress的定义,但本地的my_var变量并没有同步到远程的执行环境中,所以远程执行函数时无法读取到这个变量的值。
下面是几种可行的解决方法:
方法1:同时传递变量定义和函数
在ssh命令里,把变量的赋值语句和函数定义一起传给远程机器:
ssh user@remote "$(typeset -f getIPAddress); my_var='$my_var'; getIPAddress"
如果my_var里包含空格、引号等特殊字符,用printf %q来转义更安全,避免出现语法错误:
ssh user@remote "$(typeset -f getIPAddress); $(printf 'my_var=%q' "$my_var"); getIPAddress"
方法2:通过环境变量传递(需远程配置支持)
先把本地变量导出为环境变量,再通过ssh的SendEnv选项传递到远程:
export my_var="Myvar Value" ssh -o SendEnv=my_var user@remote "$(typeset -f getIPAddress); getIPAddress"
注意:这种方法需要远程机器的sshd_config文件中配置了AcceptEnv my_var(或者AcceptEnv *),否则远程sshd会拒绝接收这个环境变量。
方法3:通过Here Document传递完整脚本
把变量和函数都写入一个临时的脚本内容,通过管道传给远程的bash执行:
cat <<EOF | ssh user@remote bash my_var="$my_var" getIPAddress() { echo \$my_var ip_address=\$(hostname -i) echo \$ip_address } getIPAddress EOF
这里要注意用反斜杠转义\$my_var和\$(hostname -i),避免本地shell提前解析这些变量和命令,确保它们在远程机器上执行时才被展开。
内容的提问来源于stack exchange,提问作者Rachit Singh
相关产品推荐
相关产品推荐

