使用客户端主机的“ssh”修改远程服务器主机上的持久变量

使用客户端主机的“ssh”修改远程服务器主机上的持久变量

正如标题所说,我想使用“ssh”修改远程服务器上的环境变量。

我的第一次尝试是:

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

一开始我没有在服务器主机上定义$ORANGE,而是在客户端上将$ORANGE定义为“1”,得到:

1
1
getId is +

请注意,该命令正在获取客户端的 $ORANGE 值,并且更新(ORANGE+1)并未发生。

然后我删除了客户端主机上的 $ORANGE 定义,并通过将命令放入我的 中在服务器上定义了 $ORANGE .bash_profile。但是

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

导致

getId 是 +

它无法打印我尝试在服务器主机上初始化的 $ORANGE 的值!然后我尝试了这个:

$ ssh mysvr -l sikaiwei "。 。轮廓;getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId 是 '+$getId;"


getId 是 +

它仍然不起作用。

我尝试使用 '..'(单引号)而不是 ".."(双引号),正如您所说,但它什么都没有打印......

$ ssh myth@mysvr 'echo orangeis $ORANGE'
orangeis 

我想打印

 getId=1; echo 1; ORANGE=2; echo 2; …

代替

 getId=; echo ; ORANGE=1; echo ; …

那么我如何使用来自服务器主机的 $ORANGE 值而不是客户端值?

我的服务器运行的是 Windows,但我安装了 Cygwin。我的客户端运行的是 Linux。

编辑:我找到了问题的一部分:我在~/.bash_profile服务器主机上设置了 $ORANGE,我可以在交互式 shell(Cygwin)中使用“echo $ORANGE”获取 $ORANGE 的值,但这不会影响ssh命令字符串。例如,当我的客户端主机使用

$ ssh sikaiwei@mysvr 'echo orange is $ORANGE'
orange is

就像这样,我无法获得在服务器会话中获得的 $ORANGE 值。. .profile我添加的没有帮助。但如果我

$ ssh sikaiwei@mysvr '. ~/.bash_profile;echo orange is $ORANGE'
orange is 4

我得到了值!


哦,我是不是忘了说了:我希望服务器上的这些变量是持久的。换句话说,如果我执行一个ssh命令,将 $ORANGE 的值从 4 更改为 42,那么我希望在执行另一个命令时 $ORANGE 为 42 ssh

答案1

问题在于,用双引号 ( ) 括起来的 shell 变量(环境变量是其子集或变体)"…"会被立即处理。因此,如果ORANGE在本地将其设置为 1, 正如你在第一次实验中所报告的那样,然后输入

… ssh … "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; …"

ssh正在得到

getId=1; echo 1; ORANGE=2; echo 1; …

并且,如果ORANGE没有在本地设置, 正如你在第二个实验中所报告的那样ssh正在得到

getId=; echo ; ORANGE=1; echo ; …

要将您输入的命令发送到远程系统,并带有美元符号,以便由远程系统上的 shell 进行处理,请将其括在单引号 ( '…') 中。

例如,如果你说

… ssh … 'echo orangeis $ORANGE'

然后ssh看到

echo orangeis $ORANGE

并将其发送到远程系统。这将导致远程系统上的 shell 输出

orangeis 

(末尾有一个空格)因为您没有做任何事情来赋予ORANGE值(或者,如果您做了某事,但它没有起作用)。

你说

我想打印

  获取ID=1;回声1;橙色=2;回声1; …

这显然不是你的意思。如果你的意思是你想打印

getId=1
1
2

尝试类似

… ssh … '橙色=1;获取ID=“$ORANGE”;回声“getId = $ getId”;回声$ORANGE; ORANGE=$((ORANGE+1)); 回声$ORANGE; …”



您已完善了您的问题(在评论中),以表明您希望能够在远程服务器上操作 shell/环境变量并且改变的值从一个会话持续到另一个会话。为此,您需要明确将值存储在某处(在服务器上)。保存值的一种简单方法是执行

echo "$ORANGE" > orange.txt

然后,您可以使用以下命令检索该值

read ORANGE < orange.txt

或者

ORANGE=$(cat orange.txt)

稍微不同的方法是使用

echo "ORANGE=\"$ORANGE\"" > value.sh

然后使用

值.sh

.bash_profile我认为,如果您要频繁修改这些值,那么使用它来存储这些值就没有什么意义了。

请注意,您应该使用>>附加到文件并>|覆盖现有文件。

相关内容