一般情况下,当我们使用ssh连接到远端服务器时,所获得的环境变量都是远端服务器为我们设定的。但在某些特殊情况下,例如:我们需要在服务端上绑定客户端来源信息,以便执行特定的操作。这样,我们就需要让客户端可以传递变量给服务端。当然,这可以通过编写程序来实现,也可以参考下面的文档,利用OpenSSH可传递客户端环境变量的特性来达成。
而我要完成这次的配置,就是为了解决一个Linux应用程序1通过ssh访问另一台的Linux上的交互的应用程序2(由于该应用2不能从远端机器移走,同时在启动应用前,又必须根据客户端的信息才能启动)。
一、软件版本
OpenSSH:4.3 p2以上
※ 红旗 DC Server 5.0上自带的OpenSSH版本是4.0 p1,虽然man上说可以实现需要的功能,但经测试无效。故需要升级到更高的版本。Asianux 3.0自带的就是4.3 p2。
另外,这里有个Bug提示,提交时间非常新,但没法确定版本,先留个心眼吧。
红旗 DC Server 5.0用OpenSSH 4.3 p2升级包:
二、实现步骤
实现的步骤非常简单,以两台服务器来演示说明:
1、升级OpenSSH版本
# ssh -v
OpenSSH_4.3p2, OpenSSL 0.9.7a Feb 19 2003
2、设定服务端
修改/etc/ssh/sshd_config文件,增加:
这句的意思是,服务端接受来自客户端的TEST变量。重启服务:
服务端上的变量:
(服务端上没有TEST变量,是unset状态)
3、设定客户端
修改/etc/ssh/ssh_config文件,增加:
这句的意思就是,让客户端传递自己的环境变量TEST到服务端上。
4、测试
在服务端上执行:
[root@mail i386]# export TEST
[root@mail i386]# ssh 192.168.228.155
root@192.168.228.155's password:
Last login: Sat Sep 27 15:19:33 2008 from 192.168.228.99
[root@ftpserver ~]# set|grep TEST
TEST=0000000000000000000000000000000
很清楚的可以看到,客户端mail上的变量TEST,被传到了ftpserver上。这样,ftpserver就可以根据不同的TEST变量的值,在运行应用前引用了。
※ 注意,客户端上的变量需要export出来。
三、其他
在看OpenSSH的man文档时,发现有一个设定与上面的功能是很容易混淆的。就是服务端上的PermitUserEnvironment参数。
该参数的意思是,当客户端从ssh登陆到服务端时,服务端会从本地的~/.ssh/environment读取特定客户端的环境变量配置文件。
这和AcceptEnv的最大区别是,写有环境变量的配置文件是在服务端的,而不是客户端,甚至不可能是客户端传过去的。这里举个例子:
1、设定服务端
修改/etc/ssh/sshd_config文件,增加:
重启服务:
建立~/.ssh/environment文件,及写入环境变量内容:
[root@ftpserver ~]# cd .ssh/
[root@ftpserver .ssh]# chmod 600 environment
※ 必须把~/.ssh/environment的权限设定为600,否则无效的。
2、客户端上测试
root@192.168.228.155's password:
Last login: Sat Sep 27 15:42:16 2008 from 192.168.228.99
[root@ftpserver ~]# set|grep TOOL
TOOL=88888888888
可见,在客户端登陆服务端后,由服务端根据客户端的用户名读取其主目录下的~/.ssh/environment文件,根据其中的内容为客户端增加新的环境变量。
这有点像在~/.bashrc或~/.bash_profile上写入环境变量内容的作用,区别在于谁设定而已。但这和上面提到的,由客户端传递环境变量到服务端是完全不同的。
四、附录
OpenSSH 官方网站
OpenSSH 下载镜像地址
OpenSSH使用putty的密钥
解决set_loginuid failed opening loginuid报错
putty使用密钥登陆OpenSSH
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/112291.html