【发布时间】:2018-05-25 12:08:02
【问题描述】:
我有一个这样的 shell 脚本文件:
#!/bin/bash
CONF_FILE="/tmp/settings.conf" #settings.conf contains OS_NAME="Caine Linux"
source $CONF_FILE
display_os_name() { echo "My OS is:" $OS_NAME }
#using the function locally works fine
display_os_name
#displays: My OS is: Caine Linux
#using the function on the remote host doesn't work
ssh user@host "$(declare -f); display_os_name"
#displays: My OS is:
如果我删除 -f 并只使用 ssh user@host "$(declare); display_os_name" 它可以工作,但会显示这些错误和警告:
bash: line 10: BASHOPTS: readonly variable
bash: line 18: BASH_VERSINFO: readonly variable
bash: line 26: EUID: readonly variable
bash: line 55: PPID: readonly variable
bash: line 70: SHELLOPTS: readonly variable
bash: line 76: UID: readonly variable
如果我使用ssh user@host "$(declare); display_os_name >/dev/null" 来抑制警告,则只会抑制函数的输出(我的操作系统是:Caine Linux),而不是警告。
有没有办法在远程 SSH 主机上运行本地函数和本地源文件?
【问题讨论】:
-
这个answer对你有帮助吗?
-
@krampstudio,不,它没有。如果我使用
typeset -f,只有远程主机上可以使用该功能,而不是导入的设置文件。 -
最终,您想在远程主机上使用的所有内容都必须发送到远程主机。
ssh只是一个连接工具,不是分布式计算框架。 -
2>/dev/null而不是>/dev/null以抑制错误消息而不是标准输出。当然,最好修复这些错误消息的来源。 -
由于您是
sourceing 文件,您可以将其内容放入发送到远程主机执行的字符串中。ssh user@host "$(</tmp/settings.conf); $(declare -f); display_os_name"