import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static com.alibaba.ai.asr.deploy.cdec.util.ShellUtil.exec;
/**
* @Author: liyue
* @Date: 2022/03/14/14:03
* @Description:
*/
public class SshSetNoPass {
private static Boolean sshSetNoPass() {
JSONArray servers = config.getJSONArray("servers");
Map<String, String> ecsNameIps = new HashMap<>();
List<String> serverIps = new LinkedList<>();
for (int i = 0; i < servers.size(); i++) {
JSONObject server = servers.getJSONObject(i);
ecsNameIps.put(server.getString("name"), server.getString("ip"));
serverIps.add(server.getString("ip"));
}
// ssh初次需要输入yes修改
String sshConfigStatus = exec("cat /etc/ssh/ssh_config |grep StrictHostKeyChecking | grep no | wc -l");
if (Integer.parseInt(sshConfigStatus) == 0) {
info("ssh初次需要输入yes修改");
info("执行<去除ssh初次连接其他机器需要输入yes>...");
String oldSshConfig = "tmp_" + System.currentTimeMillis() + ".txt";
exec("cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > " + oldSshConfig);
exec("cat " + oldSshConfig + " > shell_config");
exec("cat >> /etc/ssh/ssh_config << 'EOF'\n" +
"StrictHostKeyChecking no\n" +
"EOF");
exec("rm -rf " + oldSshConfig);
exec("systemctl restart sshd");
sleep(3);
success("<去除ssh初次连接其他机器需要输入yes>完成");
}
// 设置免密
String localIp = exec("ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\\/(.*)/, \"\\\\1\", \"g\", $2)}'");
List<String> complete = new LinkedList<>();
for (int i = 0; i < servers.size(); i++) {
JSONObject server = servers.getJSONObject(i);
String ip = server.getString("ip");
String port = server.getString("port");
String username = server.getString("username");
String res = exec("ssh " + username + "@" + ip + " -p " + port + " -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no \"date\" |wc -l");
if (res.equals("1")) {
complete.add(ip);
}
}
if (complete.size() < servers.size()) {
info("设置ssh免密...");
StringBuffer sb = new StringBuffer();
// 修改 /etc/hosts 文件
/// 第一次备份
if (!exists("/etc/hosts.bak")) {
exec("cp /etc/hosts /etc/hosts.bak");
}
exec("cat /etc/hosts.bak > /etc/hosts");
sb.append("cat >> /etc/hosts << 'EOF'\n");
for (int i = 0; i < servers.size(); i++) {
JSONObject server = servers.getJSONObject(i);
if (localIp.contains(server.getString("ip"))) {
sb.append(server.getString("ip")).append(" localhost\n");
sb.append(server.getString("ip")).append(" master\n");
} else {
sb.append(server.getString("ip")).append(" salve").append(i + 1).append("\n");
}
}
sb.append("EOF");
info(exec(sb.toString()));
// 生成公钥
exec("mkdir -p /root/.ssh");
info(exec("ssh-keygen -t rsa -N '' <<EOF\n" +
"/root/.ssh/id_rsa\n" +
"yes\n" +
"\n" +
"\n" +
"EOF"));
// 发送公钥
String pub = exec("cat /root/.ssh/id_rsa.pub");
for (int i = 0; i < servers.size(); i++) {
JSONObject server = servers.getJSONObject(i);
String ip = server.getString("ip");
sb.append(ip).append(" ").append(server.getString("port"))
.append(" ").append(server.getString("password") + "\n");
RemoteShell.run(server.getString("ip"), server.getInteger("port"),
server.getString("username"), server.getString("password"),
"cat >> /root/.ssh/authorized_keys <<'EOF'\n" +
pub + "\n" +
"EOF");
}
// 检测
sleep(3);
List<String> cmds = new LinkedList<>();
List<String> cmds2 = new LinkedList<>();
for (int i = 0; i < servers.size(); i++) {
JSONObject server = servers.getJSONObject(i);
String ip = server.getString("ip");
String port = server.getString("port");
String username = server.getString("username");
String res = exec("ssh " + username + "@" + ip + " -p " + port + " -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no \"date\" |wc -l");
if (res.equals("0")) {
cmds.add("ssh-copy-id -i /root/.ssh/id_rsa.pub " + username + "@" + ip + " -p " + port);
cmds2.add("cat /root/.ssh/id_rsa.pub | ssh -p " + port + " " + username + "@" + ip + " 'cat >> .ssh/authorized_keys'");
}
}
if (cmds.size() > 0) {
String str = "ssh免密配置失败,请依次执行以下命令完成ssh免密配置:\n";
for (String cmd : cmds) {
str += cmd + "\n";
}
str += "\n或者执行以下命令完成ssh免密配置:\n";
for (String cmd : cmds2) {
str += cmd + "\n";
}
error(str);
return Boolean.FALSE;
} else {
success("<ssh免密配置>完成");
}
} else {
warning("已完成<ssh免密配置>");
}
return Boolean.TRUE;
}
}
config.json
{
"servers":[
{
"name":"ecs1",
"ip":"192.168.1.1",
"port":22,
"username":"root",
"password":"123456"
},
{
"name":"ecs2",
"ip":"192.168.1.2",
"port":22,
"username":"root",
"password":"123456"
}
]
}
ShellUtil : shell(11) : java调用shell_Lxinccode的博客-CSDN博客
日志打印: shell(37) : java控制台运行打印颜色字体_Lxinccode的博客-CSDN博客
fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>

6365

被折叠的 条评论
为什么被折叠?



