猜测这已经做了很多次了,但我找不到一个干净的答案,所以我很想吸引你的专业知识以获得更好的解决方案:
目标:我正在设置一个中等规模的RHEL Hadoop集群,并希望在所有节点之间自动配置SSH连接。在第一个节点上,我有一个文件'remote_ips'中所有IP的列表,我在文件'hduser_pw'(chmod 600)中有hduser密码。
步骤1)在每个主机上创建“hduser_pw”密码文件
for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x "echo $(cat hduser_pw) > hduser_pw; chmod 600 hduser_pw"; done
步骤2)为集群中的每个节点生成RSA密钥:
for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x "echo -e 'y'| ssh-keygen -t rsa -N \"\"
"; done
步骤3)将文件'remote_ips'复制到集群中的每个节点:
for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) scp -o StrictHostKeyChecking=no remote_ips hduser@$x:~; done
步骤4)对于每个节点,将RSA公钥复制到每个其他节点中的“authorized_keys”:
for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x 'for y in $(cat remote_ips); do cat /home/hduser/.ssh/id_rsa.pub | sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$y '\''cat >> .ssh/authorized_keys'\'' ; done '; done
有更好的方法吗?真的很感谢你的帮助。
我收录了@janos和@likewhoa的反馈 - >我通过重定向处理UUOC,在每个IP上循环,从变量等的shell历史中删除任何pwds。非常感谢!
hduser_pw=$(< hduser_pw)
remote_ips=$(< remote_ips)
for x in $remote_ips; do
echo "Create hduser_pw password file on node: ${x}"
sshpass -p$hduser_pw scp -o StrictHostKeyChecking=no hduser_pw hduser@$x:~
echo "chmod 600 hduser_pw on node: ${x}"
sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "chmod 600 hduser_pw"
echo "Generate RSA keys for: ${x}"
sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "echo y | ssh-keygen -f ~/.ssh/id_rsa -t rsa -N \"\""
echo "SCP the file remote_ips to node: ${x}"
sshpass -p$hduser_pw scp -o StrictHostKeyChecking=no remote_ips hduser@$x:~
done
for x in $remote_ips; do
for y in $remote_ips; do
echo "ssh-copy-id from node ${x} to node ${y}:"
sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "sshpass -p${hduser_pw} ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@${y} -o StrictHostKeyChecking=no";
done
done
答案 0 :(得分:1)
而不是多次运行$(cat hduser_pw)
和$(cat remote_ips)
,
最好只运行一次,并保存变量和重用。
例如:
hduser_pw=$(cat hduser_pw)
remote_ips=$(cat remote_ips)
# Step 1) Create "hduser_pw" password file on each host
for x in $remote_ips; do
sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "echo $hduser_pw > hduser_pw; chmod 600 hduser_pw"
done
你能发现安全问题吗? echo $hduser_pw
将保存在shell历史记录中,也可能在ps
打印中可见。最好避免它。而不是:
ssh server "echo $hduser_pw > hduser_pw; chmod 600 hduser_pw"
你可以这样做:
ssh server "cat > hduser_pw; chmod 600 hduser_pw" < hduser_pw
这有点hacky,可能会令人困惑。
一个更简单的选择是scp
然后ssh
(chmod
):
scp hduser_pw server:
ssh server "chmod 600 hduser_pw"
其他简化:
echo -e 'y' | ...
,您可以简化为echo y | ...
ssh-copy-id
而不是凌乱的第4步。答案 1 :(得分:0)
首先关闭UUOC,你真的应该使用while循环和重定向而不是CAT。
使用此代替以下步骤,将所有步骤合并为一个大循环。
while read ips; do sshpass -p$(<hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$ips "echo $(<hduser_pw) > hduser_pw; chmod 600 hduser_pw"; sshpass -p$(<hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$ips ssh-keygen -f ~/.ssh/id_rsa -t rsa -N \"\"";sshpass -p$(<hduser_pw) scp -o StrictHostKeyChecking=no remote_ips hduser@$ips:;done <remote_ips
我会让你自己解决第4步。 GL!
指点很少。