gpt4 book ai didi

bash - 如何在Shell脚本中通过SSH运行功能和本地资源

转载 作者:行者123 更新时间:2023-12-02 14:30:15 25 4
gpt4 key购买 nike

我有一个这样的 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主机上与本地文件一起运行本地功能?

最佳答案

一种简单的方法(如果您的本地系统是Linux)是在set -a命令之前使用source启用自动导出。在stdin上复制/proc/self/environ;并将其解析为远程端的一组变量。

由于BASHOPTSEUID等不是环境变量,因此可以避免尝试对其进行修改。 (如果您遵守POSIX recommendations并为自己的变量使用小写名称,则甚至可以完全忽略全部大写的变量)。

set -a # enable export of all variables defined, **before** the source operation
source /tmp/settings.conf

import_env() {
while IFS= read -r -d '' item; do
printf -v "${item%%=*}" "%s" "${item#*=}" && export "$item"
done
}

cat /proc/self/environ | ssh user@host "$(declare -f); import_env; display_os_name"

甚至更简单的方法是仅通过网络复制要获取的文件。
ssh user@host "$(declare -f); $(</tmp/settings.conf); display_os_name"

关于bash - 如何在Shell脚本中通过SSH运行功能和本地资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com