抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

接到一个需求,对现有的ci任务做一些调整,好久没写shell脚本,遇到远程登录种变量无法赋值的问题。背景如下:

环境

hostA

1
2
192.168.1.1
username:userA

存在普通权限用户userA,在userA目录下存在名为system,结构为如下的文件夹

1
2
3
4
5
6
version
EV20160101
EV20160201
EV20160301
EV20160401
EV20160501

其中version为文件,其余为文件夹,在version中只有一行,记录了某个文件夹的名字,我们称之为版本号。

hostB

1
2
192.168.2.1
username:userB

hostAhostB做了互信,现需要hostB登录到hostA,取得version记录的值,并进入相应的文件夹。

例如

1
2
3
cat version
得到 EV20160101
则需要 cd EV20160101

过程

一开始,在hostB上写了如下脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash
ssh -tt userA@192.168.1.1 > test.log 2>&1 << eeooff
cd /home/userA/system
version=`cat version`
cd $version
pwd
exit
eeooff
more test.log

结果无效,每次日志打印和调试都显示version=后面为空,期间尝试使用$(),grep来获取version里记录的值,结果没有变化,由于无值,cd默认切换到了userA的根目录,即/home/userA

遂直接在hostA上执行如下操作,发现取到值,后续步骤也正常。

1
2
3
4
cd /home/userA/system
version=`cat version`
cd $version
pwd

解决方案

初步猜测,ssh-tt a@b << eeooff这样的方式里,变量值无法传递,或者说,这个值只是hostA上的变量,脚本在hostB,并不支持。于是决定,先取的值,再进行下一步操作。

1
2
3
4
5
6
7
8
9
10
version=`ssh userA@hostA "
cd /home/userA/system
grep "EV" version
"`

ssh -tt userA@hostA > test.log 2>&1 << eeooff
cd /home/userA/system/$version
exit
eeooff
more test.log

说明,变量可以在远程登录的时候传入,但不能传出。

评论