正如标题所说,我想使用“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
我认为,如果您要频繁修改这些值,那么使用它来存储这些值就没有什么意义了。
请注意,您应该使用>>
附加到文件并>|
覆盖现有文件。