由于要在Windows下使用集群系统,因此需要有远程登陆和管理的工具,所以就找来OpenSSH for Windows,根据网上的资料在WinXP系统内进行的反复的尝试,但总是只能进行基于密码的远程登陆,无法采用基于密钥的无密码登陆,这样就必须在每次登陆的时候输入密码,既不安全也不便于实现自动化管理。
索性就改用cygwin实现的openssh,居然没有费什么劲就设置好了,想一想估计是因为OpenSSH for Windows的版本太旧了(最新的v3.81也是2003年的东西了),在WinXP上存在些兼容性的问题,加上需要手动修改其安装目录下的/etc/sshd_conf文件中的一些配置,不太好使也是难免的了。
在WinXP上通过cygwin实现openssh就要简单的多了,主要包括两个部分,首先配置SSH服务器,然后就可以通过在其中建立组与用户密码来实现基于密码的远程登陆,另外一部分就是通过在本地生成密钥对并上传给SSH服务器来实现基于密钥的远程登陆。
当然一切都是从cygwin的安装开始的,无论在服务器端还是远程的客户端都是必须要做的。安装的时候需要注意,除了缺省的那些包之外,还需要安装/libs/zlib、/net/openssh和/net/tcp_wrappers,这几个包不属于缺省安装的内容,因此需要在安装界面中手动选择。
配置SSH服务器
1. 配置ssh主机,在cygwin的控制台中输入如下命令:
ssh-host-config
当屏幕显示关于“privilege seperation”,输入yes后回车;
当屏幕显示关于“create local user sshd”,输入yes后回车;
当屏幕显示关于“install sshd as a service”,输入yes后回车;
当屏幕显示关于“CYGWIN=”,输入ntsec tty后回车;
当屏幕提示“Host configuration finished. Have fun!”时,就说明已经正常的完成了ssh主机的配置。
2. 启动ssh服务,也就是启动ssh的服务器功能,在cygwin的控制台中输入如下命令:
net start sshd
或者
cygrunsrv –start sshd
屏幕提示“CYGWIN sshd服务已经启动成果。”,或者没有任何错误提示(对于cygrunsrv命令而言),说明ssh服务已经正常启动。
3. 创建用户组与密码,在cygwin的控制台中输入如下命令:
mkpasswd –cl > /etc/passwd
mkgroup –local > /etc/group
至此服务器的配置已经完成,可以基于用户与密码实现从远程登陆SSH服务器。
通过密码登陆SSH服务器
在cygwin的控制台输入如下命令:
ssh username@hostname
其中hostname为建立SSH服务器的计算机IP地址或机器名,username为用于登陆该计算机的用户名称,如果根据前面的服务器配置步骤,应当就是该计算现有的某个账户名称。
如果是所用的客户端计算机是第一次登陆SSH服务器,命令行中会提示“Are you sure you want to continue connecting (yes/no) ?”,只要输入yes即可,SSH服务器会自动将这次的登陆信息存储在/.ssh/known_host文件中。
接着屏幕中会提示输入登陆账户的密码,也就是ssh服务器中登陆账户的密码,当显示“Fanfare!!! You are successfully logged in to this server!!!”时,说明已经成功登陆到ssh服务器计算机内了,需要注意的是,此时在当前控制台内输入的命令都将在ssh服务器计算机里运行。
如果要退出登陆,只要在命令行中输入
exit
即可,屏幕中会显示“logout Connection to [hostname] closed.”
通过密钥登陆ssh服务器
1. 在客户端计算机上安装好包含openssh的cygwin;
2. 为客户端生成rsa密钥,在cygwin命令行中输入:
ssh-keygen –t rsa
对于提示输入密钥文件名或密钥的包含密码时都可以直接回车,从而将无密码保护的密钥保存在缺省文件中,两个密钥文件都保存在客户端当前用户的cygwin账户目录的/.ssh文件夹中,其中公钥的名称比私钥的名称只多一个pub后缀。
3. 将客户端的公钥上传到ssh服务器,这时可以通过前面已经成功的基于密码的方式完成文件的上传,即在客户端的cygwin命令行中输入如下命令:
cd ~/.ssh
scp id_rsa.pub username@hostname:~/.ssh/newkey
4. 在ssh服务器中将客户端的公钥添加到authorized_keys中,在服务器的cygwin命令行中输入如下命令:
cd ~/.ssh
ls (这时可以在目录中看到newkey文件)
cat newkey >> authorized_keys
rm newkey
chmod 600 authorized_keys (更改文件的属性)
5. 这时已经可以从客户端通过密钥对登陆到ssh服务器上了,只需在客户端的cygwin命令行中输入:
ssh username@hostname
在没有密码输入提示的情况下,应该可以看到“Ranfare!!! ……”,这说明已经成功登陆,如果在此时继续输入
whoami
可以看到在服务器上的登陆用户名。
需要注意的事情
1. 由于cygwin不能直接支持包含空格的文件路径,因此在cygwin中执行的应用尽量不要有包含空格的路径,如果一定要用,需要在空格前添加“/”来标注;
2. Windows的账户一定要有密码,否则只能通过修改sshd_conf来允许无密码的账户登陆;
3. 默认的sshd服务不允许其与桌面进行交互,因此当通过ssh执行基于窗口的命令时,将无法看到创建的窗口,而只能在“任务管理器”中看到该进程已经被创建。为此,可通过进入“控制面板-管理工具-服务”窗口中打开“CYGWIN sshd”服务,在其弹出窗口的“登陆”属性页中选中“允许服务与桌面交互”复选框,如果此时在客户端输入
ssh username@host ‘notepad’
将可以看到对话框窗口能够正常弹出。
想在本机上搭建Hadoop的伪分布式运行环境,需要配置SSH。
Cygwin安装的时候是带有OpenSSH的,之前会偶尔用他连接远程服务器。试了一下:
$ssh localhost
提示:ssh: connect to localhost port 22: Connection refused.
纳闷,怎么连自己不行?想了一会才明白,原来Cygwin的OpenSSH安装后,默认的client端开启,服务器端没有配置。
那就来安装sshd吧。
$ssh-host-config
本来一路输入yes就可以的,我这却不断提示/var目录下的一些目录访问属性不对,但是用chmod命令改却没有反应,网上查了一下,原来如果磁盘格式为FAT32的话,Cygwin的chmod将没有作用。
到Dos下用convert命令改:
convert D: /FS:NTFS
转换完成后,更改对应文件夹属性,SSH的服务器端终于安装好。
启动ssh server:
$cygrunsrv -S ssh
提示:cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062:
怎么搞得?
先重新安装一遍:
$cygrunsrv -R sshd
$ssh-host-config -y
还是不行。
上网查了一下,原来一般是一些需要访问的目录权限不对,天哪,一个个改太要命了,而且我也不清楚到底得改多少。。。都怪当初FAT32格式惹的祸。
索性把Cygwin重装了。
这次终于启动成功了。
试验自连:
$ssh localhost
成功!
用IP连接,失败了,提示:
ssh_exchange_identification: Connection closed by remote host
上网查了一下,说是/etc/hosts.allow和/etc/hosts.deny两个文件的问题,
打开看了看,觉得写的挺有歧义的,太烦了,全给注释掉了,再连,成功了!!
通过别的机器连接,也成功!