![避免在伪分布式模式下启动 Hadoop 时输入密码](https://linux22.com/image/1143682/%E9%81%BF%E5%85%8D%E5%9C%A8%E4%BC%AA%E5%88%86%E5%B8%83%E5%BC%8F%E6%A8%A1%E5%BC%8F%E4%B8%8B%E5%90%AF%E5%8A%A8%20Hadoop%20%E6%97%B6%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81.png)
因此,我在笔记本电脑上以伪分布式模式运行 Hadoop,以了解这些事情。
我正在按照手动的。
我可以启动 Hadoop,没有问题,但是启动过程不方便。看,要启动它,需要执行以下操作:
start-dfs.sh
然后,系统会提示输入密码3次(在我的情况下,三次都是相同的):
Starting namenodes on [localhost]
me@localhost's password:
localhost: starting namenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-namenode-me-HP-ENVY-15-Notebook-PC.out
me@localhost's password:
localhost: starting datanode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-datanode-me-HP-ENVY-15-Notebook-PC.out
Starting secondary namenodes [0.0.0.0]
[email protected]'s password:
0.0.0.0: starting secondarynamenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-secondarynamenode-me-HP-ENVY-15-Notebook-PC.out
(当一个人这样做时也是一样stop-dfs.sh
)。
这很麻烦。有没有办法让 ubuntu 记住密码,这样就不用输入密码了?
答案1
使用描述的步骤解决了我的问题这个答案基本上,这样做:
ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh localhost
然后
start-dfs.sh
不会要求输入密码。
答案2
我还会尝试以下操作(如果您有 hdfs 用户):
sudo -u hdfs start-dfs.sh service-name
这样,您只需输入一次密码,但后续调用应该被缓存。
答案3
一个想法是在后台启动进程,将其 stdout(stderr?)重定向到一个文件,并让脚本等待并循环监视该文件。每当进程打印密码提示时,脚本都会通过其 stdin 将密码输入到进程中。
实现这一点其实很棘手。您可以使用两个脚本,一个用于监视输出并输入密码,另一个用于首先启动它们,应用必要的重定向。
因此启动器脚本是:
#!/bin/bash
TEMP_FILE=/tmp/hapboon.stdout
start-dfs.sh <(./feed-passwords.py "$TEMP_FILE") > "$TEMP_FILE"
无论出于什么原因,我将使用 Python 来完成另一个:
#!/usr/bin/python3
PASSWORD="""TYPE_YOUR_PASSWORD_HERE"""
from sys import argv
temp_file = argv[1] # Raises exception if argument is missing
counter = 0
maximum = 3
previous_length = 0
while True:
with open(temp_file) as f:
output = f.read()
if len(output) == previous_length:
continue
previous_length = len(output)
last_line = output.strip().split('\n')[-1]
if last_line.endswith(' password:'):
print(PASSWORD) # Our stdout goes to `start-dfs.sh`
counter += 1
if counter == maximum:
break
我没有测试过这些。这种方法依赖的一个假设是,通过其标准输入接收密码的人是start-dfs.sh
它自己,这很可能是不真实的。启动脚本通常只是调用其他进程,因此密码可能需要发送到其他进程的标准输入。
您可能需要修改start-dfs.sh
脚本本身,并让其重定向接收密码的进程的标准输入。这也意味着我们的feed-passwords.py
脚本必须每次将密码打印到相应的文件中,这可能意味着整个方法的架构将发生变化。
此外,虽然我们还没有做到这一点,但这个脚本还有一点不灵活;它只适用于预设数量的密码(由变量定义maximum
)。可能需要对其进行修改,使其持续监视密码提示,直到经过一定的超时时间(例如 15 秒),从而适应任意数量的密码提示,而无需每次都更改数字。(如果需要,我可以帮你。)
另一个注意事项:如果您不想存储密码,只需将该PASSWORD=...
行替换为:PASSWORD=input("Type your password: ")
。这样,您每次启动脚本时只需输入一次密码,并且不会在任何地方存储您的密码。