【问题标题】:Environmental/global variables are not expanded in shell script环境/全局变量未在 shell 脚本中展开
【发布时间】:2015-03-16 21:08:47
【问题描述】:

我正在尝试通过 SSH 执行功能。关注this post之后我就可以做到了。

但是,如果我在 shell 脚本中有一些全局/环境变量,则这些变量不会被扩展。这是文件的源代码到 SSH 节点不是一个选项,因为它就像一个本地副本。

我试过了:

#!/bin/bash

SKS="TYPO"

fun2(){

    arg=$1
    echo $arg >> /tmp/a.o
    echo $SKS >> /tmp/a.o
}

fun1() {

    echo "SKSKSKSKS" > /tmp/a.o
    fun2 "SPSP"

}

fun1

SSH="ssh -4q -o StrictHostKeyChecking=no -o ConnectTimeout=10"
$SSH <ssh-host> "$(typeset -f); fun1"

当我在本地节点上执行这个脚本时,它给我的输出是:

cat /tmp/a.o 
SKSKSKSKS
SPSP
TYPO

但在 SSH 节点上:

SKSKSKSKS
SPSP

所以这里$SKS没有在SSHed节点上展开。

请帮我解决这个问题。

问候, 什里达

【问题讨论】:

    标签: linux bash shell ssh


    【解决方案1】:

    您没有将本地 $SKS 变量设置或导出到远程端。 typeset -f 扩展了函数,因此您可以在远程获取函数,但不能获取变量。

    如果您希望该变量在远程端可用,您要么需要在远程执行的 shell 脚本中分配它,要么以某种方式在本地端的函数中预扩展它。

    【讨论】:

    • 如何通过 ssh 提取所有环境变量?有什么方法或调整吗?
    • typeset 命令可以扩展您想要的任何变量(如 Ondrej 指示的方式),只需列出您想要的变量(或删除 -f),您就可以获得变量和函数。但是请注意,您可能不希望在本地端设置的许多变量在远程端扩展,因此您可能希望限制为导出到导出的变量(因为这些变量通常应该更安全)并使用typeset -x。
    • 非常感谢您的 cmets
    【解决方案2】:

    尝试在 SSH 命令中添加typeset -p SKS:

    $SSH <ssh-host> "$(typeset -f; typeset -p SKS); fun1"
    

    【讨论】:

    • 但是我在脚本中有很多环境变量,所以对于这个没有其他选择吗?
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2022-01-03
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-12-31
    • 2011-03-19
    相关资源
    最近更新 更多