[Linux]ssh免密码登陆

最近在学习搭建hadoop,搭建环境的一个步骤就是要设置免密码登陆。这里使用VMWare的两台CentOS虚拟机为例。


原理

Master要实现无密码公钥认证,连接到服务器Salve1上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave1上。当Master通过SSH连接Salve1时,Salve1就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave1确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave1上。


虚拟机环境设置

虚拟机一:

Hostname: Master.Hadoop

Group/User: hadoop/hadoop

虚拟机二:

Hostname: Slave1.Hadoop

Group/User: hadoop/hadoop

两台虚拟机必须都是用桥接方式接入,为了确保已经联通,可以相互ping一下


启动sshd服务

[hadoop@Slave1 ~]$ which sshd
/usr/sbin/sshd

如果没有安装sshd,

[hadoop@Slave1 ~]$ yum search|grep ssh
Error: Need an item to match
[hadoop@Slave1 ~]$ yum search ssh
Loaded plugins: fastestmirror, refresh-packagekit, security
Determining fastest mirrors
 * base: mirrors.yun-idc.com
 * extras: mirrors.btte.net
 * updates: mirrors.sina.cn
base                                                     | 3.7 kB     00:00     
extras                                                   | 3.4 kB     00:00     
updates                                                  | 3.4 kB     00:00     
=============================== N/S Matched: ssh ===============================
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
libssh2.x86_64 : A library implementing the SSH2 protocol
libssh2.i686 : A library implementing the SSH2 protocol
libssh2-devel.i686 : Development files for libssh2
libssh2-devel.x86_64 : Development files for libssh2
libssh2-docs.x86_64 : Documentation for libssh2
openssh.x86_64 : An open source implementation of SSH protocol versions 1 and 2
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X
openssh-clients.x86_64 : An open source SSH client applications
openssh-ldap.x86_64 : A LDAP support for open source SSH server daemon
openssh-server.x86_64 : An open source SSH server daemon
pam_ssh_agent_auth.i686 : PAM module for authentication with ssh-agent
pam_ssh_agent_auth.x86_64 : PAM module for authentication with ssh-agent
trilead-ssh2.noarch : SSH-2 protocol implementation in pure Java
trilead-ssh2-javadoc.noarch : Javadoc for trilead-ssh2
jsch.noarch : Pure Java implementation of SSH2
python-paramiko.noarch : A SSH2 protocol library for python
python-twisted-conch.x86_64 : SSH and SFTP protocol implementation together with
                            : clients and servers


  Name and summary matches only, use "search all" for everything.

然后通过yum install sshd来安装

配置ssh证书

[hadoop@Slave1 ~]$ ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
de:83:74:4f:0e:9d:f0:ce:9f:21:38:d2:ac:b1:85:02 hadoop@Slave1.Hadoop
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|          .      |
|           + .   |
|    E   S o =    |
|     . o B O     |
|      . * O * .  |
|       . * o o o |
|        o     o  |
+-----------------+
[hadoop@Slave1 ~]$ 

此时,在/home/hadoop/.ssh/下生成两个文件,公钥id_rsa.pub和私钥id_rsa,此时有两种方式将公钥复制到Slave1上

第一种:ssh-copy-id -i user@host

[hadoop@Master ~]$ ssh-copy-id -i hadoop@192.168.0.9
The authenticity of host '192.168.0.8 (192.168.0.8)' can't be established.
RSA key fingerprint is 1c:09:82:e7:05:28:04:fd:98:3b:53:eb:c1:6d:b2:36.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.9' (RSA) to the list of known hosts.
hadoop@192.168.0.9's password: 
Now try logging into the machine, with "ssh 'hadoop@192.168.0.9'", and check in:


  .ssh/authorized_keys


to make sure we haven't added extra keys that you weren't expecting.

此时登陆打开Slave1的/home/hadoop/.ssh/authorized_keys,查看是否已经有hadoop@Master.Hadoop的rsa


第二种:

[hadoop@Master .ssh]$ scp ~/.ssh/id_rsa.pub hadoop@192.168.0.9:~/

然后查看Slave1的/home/hadoop文件夹下是否有id_rsa.pub文件和.ssh文件夹,然后

[hadoop@Slave1 ~]$ cat id_rsa.pub ~/.ssh/authorized_keys

打开authorized_keys,查看是否复制成功


配置sshd_config文件

在Master和Slave1机器上,分别作以下操作:
1. 切换到root的权限:su root
2. vim /etc/ssh/sshd_config
取消这三行的注释
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile      .ssh/authorized_keys

保存后退出,然后重新启动ssh:service sshd restart


配置文件夹权限

这一步非常关键,如不配置正确无法实现免密码登陆

~/.ssh/authorized_keys文件的权限为644,
~/.ssh文件夹的权限为700,
/home/hadoop文件夹的权限为700

测试

在Master机器上输入:

[hadoop@Master .ssh]$ ssh hadoop@192.168.0.9
Last login: Sun Nov  8 04:55:32 2015 from master.hadoop

或者

[hadoop@Master .ssh]$ ssh 192.168.0.9
Last login: Sun Nov  8 05:09:52 2015 from master.hadoop

配置成功

可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版), 可以从 http://www.slproweb.com/products/Win32OpenSSL.html 下载 OpenSSL for Windows,直接安装。 P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:   在OpenSSL安装目录的下的include/bn.h文件中,将 #define BN_ULLONG unsigned long long #define BN_ULONG unsigned long long #define BN_LONG long long 分别修改为: #define BN_ULLONG ULONGLONG #define BN_ULONG ULONGLONG #define BN_LONG LONGLONG 否则,会出现编译错误。 二、使用OpenSSL 在VC中配置使用以上的函数库: 点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。 在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include"; "Library files"选择中新增目录"C:\openssl\lib"。 然后在需要链接OpenSSL函数库的工程中加入如下两句: #pragma comment(lib, "ssleay32.lib") #pragma comment(lib, "libeay32.lib") 其作用是将OpenSSL所需的库导入工程中。 三、问题 我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。 调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下: 编辑文件 ms\nt.mak,将该文件第19行 "CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE - D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 - DOPENSSL_NO_DYNAMIC_ENGINE" 中的"/MD"修改为"/MT"。然后重新编译安装OpenSSL即可。 四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明 《在VC中对C/C++ 运行时库不同版本编译指令说明》(http://blog.yesky.com/271/dgkang/1737771.shtml)一文中详细介绍了连接不同版本库的编译指令如下: C Runtime Library: /MD MSVCRT.LIB 多线程DLL的Release版本 /MDd MSVCRTD.LIB 多线程DLL的Debug版本 /MT LIBCMT.LIB 多线程静态链接的Release版本 /MTd LIBCMTD.LIB 多线程静态链接的Debug版本 /clr MSVCMRT.LIB 托管代码和非托管代码混合 /clr:pure MSVCURT.LIB 纯托管代码 C++ Standard Library: /MD MSVCPRT.LIB 多线程DLL的Release版本 /MDd MSVCPRTD.LIB 多线程DLL的Debug版本 /MT LIBCPMT.LIB 多线程静态链接的Release版本 /MTd LIBCPMTD.LIB 多线程静态链接的Debug版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值