shell(28) : java设置ssh免密


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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值