如何实现两台服务器间无密码的传输数据和操作

  我们知道如果要向远程服务器传输数据和操作必须输入用户名和密码远程登录服务器 ,或用FTP等协议,都需要权限控制。

  然而如果是两台服务器间的软件需要通讯和数据传输,如hadoop集群中机器互访,是不是每次也要输入用户名和密码?那是不是很麻烦?下面介绍SSH来解决这个问题(不是JAVA中的SSH概念)

SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY

 

Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。
这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。

  下面就安装总结一下网友和自己的经验。

环境

  CentOS7.0

安装 

yum install ssh 安装SSH协议
yum install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件)
service sshd restart 启动服务

查看安装

rpm –qa | grep openssh
rpm –qa | grep rsync

  为避免麻烦,每个服务器上都要装。

配置Master无密码登录所有Salve

  1)SSH无密码原理
  Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。
  2)Master机器上生成密码对
   在Master节点上执行以下命令:

ssh-keygen –t rsa –P ''

  这条命是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下(每台服务器看各自的生成路径信息 因为hadoop为用户名,所以生成在当前用户名下)。

  查看"/home/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。

  接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

  在验证前,需要做两件事儿。第一件事儿是修改文件"authorized_keys"权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能),另一件事儿是用root用户设置"/etc/ssh/sshd_config"的内容。使其无密码登录有效。
  1)修改文件"authorized_keys"

chmod 600 ~/.ssh/authorized_keys

  备注:如果不进行设置,在验证时,扔提示你输入密码,在这里花费了将近半天时间来查找原因。

  2)设置SSH配置
  用root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。

RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

  设置完之后记得重启SSH服务,才能使刚才设置有效。

service sshd restart

  退出root登录,使用hadoop普通用户验证是否成功。

ssh localhost

  从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把公钥复制所有的Slave机器上。使用下面的命令格式进行复制公钥:

scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/

  例如:

scp ~/.ssh/id_rsa.pub hadoop@192.168.1.3:~/

  上面的命令是复制文件"id_rsa.pub"到服务器IP为"192.168.1.3"的用户为"hadoop"的"/home/hadoop/"下面。

  下面就针对IP为"192.168.1.3"的Slave1.Hadoop的节点进行配置。
  1)把Master.Hadoop上的公钥复制到Slave1.Hadoop上

  从上图中我们得知,已经把文件"id_rsa.pub"传过去了,因为并没有建立起无密码连接,所以在连接时,仍然要提示输入输入Slave1.Hadoop服务器用户hadoop的密码。为了确保确实已经把文件传过去了,用SecureCRT登录Slave1.Hadoop:192.168.1.3服务器,查看"/home/hadoop/"下是否存在这个文件。

  从上面得知我们已经成功把公钥复制过去了。
  2)在"/home/hadoop/"下创建".ssh"文件夹
  这一步并不是必须的,如果在Slave1.Hadoop的"/home/hadoop"已经存在就不需要创建了,因为我们之前并没有对Slave机器做过无密码登录配置,所以该文件是不存在的。用下面命令进行创建。(备注:用hadoop登录系统,如果不涉及系统文件修改,一般情况下都是用我们之前建立的普通用户hadoop进行执行命令。)

mkdir ~/.ssh

  然后是修改文件夹".ssh"的用户权限,把他的权限修改为"700",用下面命令执行:

chmod 700 ~/.ssh

  备注:如果不进行,即使你按照前面的操作设置了"authorized_keys"权限,并配置了"/etc/ssh/sshd_config",还重启了sshd服务,在Master能用"ssh localhost"进行无密码登录,但是对Slave1.Hadoop进行登录仍然需要输入密码,就是因为".ssh"文件夹的权限设置不对。这个文件夹".ssh"在配置SSH无密码登录时系统自动生成时,权限自动为"700",如果是自己手动创建,它的组权限和其他权限都有,这样就会导致RSA无密码远程登录失败。

  对比上面两张图,发现文件夹".ssh"权限已经变了。
  3)追加到授权文件"authorized_keys"
  到目前为止Master.Hadoop的公钥也有了,文件夹".ssh"也有了,且权限也修改了。这一步就是把Master.Hadoop的公钥追加到Slave1.Hadoop的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限:

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

  4)用root用户修改"/etc/ssh/sshd_config"
  具体步骤参考前面Master.Hadoop的"设置SSH配置",具体分为两步:第1是修改配置文件;第2是重启SSH服务。
  5)用Master.Hadoop使用SSH无密码登录Slave1.Hadoop
  当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。

  ssh 远程服务器IP

  从上图我们主要3个地方,第1个就是SSH无密码登录命令,第2、3个就是登录前后"@"后面的机器名变了,由"Master"变为了"Slave1",这就说明我们已经成功实现了SSH无密码登录了。
  最后记得把"/home/hadoop/"目录下的"id_rsa.pub"文件删除掉。

rm –r ~/id_rsa.pub

  到此为止,我们经过前5步已经实现了从"Master.Hadoop"到"Slave1.Hadoop"SSH无密码登录,下面就是重复上面的步骤把剩余的Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。

扩展

如果实现Slave服务器无密码登录Master?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Java 中的 FTPClient 类来实现两台 FTP 服务器的文件传输。具体实现方式可以参考以下步骤: 1. 创建 FTPClient 对象,并连接到源 FTP 服务器和目标 FTP 服务器。 2. 登录源 FTP 服务器和目标 FTP 服务器。 3. 切换到源 FTP 服务器的指定目录,并获取需要传输的文件列表。 4. 遍历文件列表,依次下载文件并上传到目标 FTP 服务器的指定目录。 5. 关闭 FTP 连接。 需要注意的是,传输过程中可能会出现网络异常等问题,需要进行异常处理和重试机制,以确保文件传输的稳定性和可靠性。 ### 回答2: 在Java中,可以使用相关的类和方法实现两台FTP服务器的文件传输。Java提供了一些FTP客户端库,例如Apache Commons Net库,可以方便地连接和操作FTP服务器。 首先,需要连接到两台不同的FTP服务器。可以使用FTPClient类的connect()方法分别连接到两个服务器。通过设置服务器的地址、端口号、用户名和密码来建立连接。连接成功后,可以使用FTPClient类的各种方法来操作服务器,例如上传文件、下载文件、删除文件等。 要从一个FTP服务器下载文件并上传到另一个FTP服务器,可以按照以下步骤进行操作: 1. 连接到第一个FTP服务器:使用FTPClient的connect()方法连接到第一个FTP服务器。 2. 登录第一个FTP服务器:使用FTPClient的login()方法登录到第一个FTP服务器,提供用户名和密码。 3. 设置被动模式:使用FTPClient的enterLocalPassiveMode()方法设置被动模式,以便与第一个FTP服务器进行数据传输。 4. 下载文件:使用FTPClient的retrieveFile()方法从第一个FTP服务器下载文件到本地。 5. 连接到第二个FTP服务器:使用FTPClient的connect()方法连接到第二个FTP服务器。 6. 登录第二个FTP服务器:使用FTPClient的login()方法登录到第二个FTP服务器,提供用户名和密码。 7. 设置被动模式:使用FTPClient的enterLocalPassiveMode()方法设置被动模式,以便与第二个FTP服务器进行数据传输。 8. 上传文件:使用FTPClient的storeFile()方法将文件上传到第二个FTP服务器。 9. 关闭连接:使用FTPClient的disconnect()方法关闭与两个FTP服务器的连接。 以上是简要的步骤,你可以根据具体情况进行调整和扩展。需要注意的是,传输过程中可能会出现一些异常情况,可以通过捕获和处理相关的异常来处理这些情况。 ### 回答3: 在Java中使用FTP(文件传输协议)进行文件传输需要以下步骤: 1. 导入必要的FTP库。 在Java中,可以使用Apache Commons Net库来处理FTP操作。需要将相关的jar文件导入到项目中。 2. 连接到FTP服务器。 使用FTPClient类对象连接到FTP服务器。通过设置服务器IP地址、端口号、用户名和密码,然后调用connect()方法建立连接。 3. 登录到FTP服务器。 使用登录凭据调用login()方法登录到FTP服务器。 4. 设置传输模式。 根据需要,可以设置FTP的传输模式为二进制传输或ASCII传输模式。可以使用setFileType()方法设置传输类型。 5. 进入指定目录。 如果需要进入服务器上的特定目录,可以使用changeWorkingDirectory()方法切换到相应的目录。 6. 开始上传或下载文件。 可以使用storeFile()方法上传文件到服务器,或使用retrieveFile()方法从服务器下载文件。在调用这些方法之前需要先打开本地文件流和服务器文件流。 7. 关闭FTP连接。 在文件传输完成后,应该关闭FTP连接。可以使用disconnect()方法关闭FTP连接。 总结: 以上是使用Java进行两台FTP服务器文件传输的基本步骤。通过使用FTPClient类的各种方法,可以实现与FTP服务器的文件上传和下载操作。在实际应用中,还需要考虑异常处理和错误处理,以确保文件传输的准确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值