UNPKG

hivessh

Version:

HiveSsh is an innovative library designed to streamline SSH2 connections and simplify task execution on Linux servers.

91 lines 14.3 kB
import { filterEmpty, trimAll } from "../utils/base.js"; export async function isSudoer(sshHost, user) { if (!user) { user = sshHost.settings.user; } if (!(await sshHost.cmdExists("sudo"))) { throw new Error("Cant check if '" + user + "' is sudoer if sudo is not installed"); } if (user.includes(" ")) { throw new Error("User name '" + user + "' includes space"); } return sshHost.exec("sudo -l -U " + user).then(async (v) => { const lines = filterEmpty(v.out.split("\n")); for (const line of lines) { if (trimAll(line).startsWith("User " + user + " is not allowed to run sudo")) { return false; } } return true; }); } export async function listUsers(sshHost) { return sshHost.exec("getent passwd").then((v) => { return filterEmpty(v.out.split("\n") .map((v) => v.split(":")[0])); }); } export async function listUserInGroups(sshHost, user) { if (!user) { user = sshHost.settings.user; } if (user.includes(" ")) { throw new Error("User name '" + user + "' includes space"); } return sshHost.exec("groups " + user).then((v) => { let raw = trimAll(v.out); return filterEmpty(raw.split(":")[1] .split(" ")); }); } export async function isUserInGroup(sshHost, group, user) { const groups = await listUserInGroups(sshHost, user); return groups.includes(group); } export async function addUserToGroup(sshHost, group, user) { if (!user) { user = sshHost.settings.user; } if (user.includes(" ")) { throw new Error("User name '" + user + "' includes space"); } if (group.includes(" ")) { throw new Error("Group name '" + group + "' includes space"); } return sshHost.exec("gpasswd -a " + user + " " + group).then(); } export async function removeUserFromGroup(sshHost, group, user) { if (!user) { user = sshHost.settings.user; } if (user.includes(" ")) { throw new Error("User name '" + user + "' includes space"); } if (group.includes(" ")) { throw new Error("Group name '" + group + "' includes space"); } return sshHost.exec("gpasswd -d " + user + " " + group).then(); } export async function createGroup(sshHost, group, gid) { if (group.includes(" ")) { throw new Error("Group name '" + group + "' includes space"); } return sshHost.exec("groupadd" + (typeof gid == "number" ? " -g " + gid : "") + " " + group).then(); } export async function renameGroup(sshHost, group, newName) { if (group.includes(" ")) { throw new Error("Group name '" + group + "' includes space"); } if (newName.includes(" ")) { throw new Error("New group name '" + newName + "' includes space"); } return sshHost.exec("groupmod -n " + newName + " " + group).then(); } export async function deleteGroup(sshHost, group) { if (group.includes(" ")) { throw new Error("Group name '" + group + "' includes space"); } return sshHost.exec("groupdel " + group).then(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lc3NlbnRpYWxzL1VzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2RCxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FDMUIsT0FBZ0IsRUFDaEIsSUFBYTtJQUViLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNSLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLGlCQUFpQixHQUFHLElBQUksR0FBRyxzQ0FBc0MsQ0FDcEUsQ0FBQTtJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUNmLGFBQWEsR0FBRyxJQUFJLENBQ3ZCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNmLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQ3BCLENBQUE7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQ0ksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FDcEIsT0FBTyxHQUFHLElBQUksR0FBRyw2QkFBNkIsQ0FDakQsRUFDSCxDQUFDO2dCQUNDLE9BQU8sS0FBSyxDQUFBO1lB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eEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUNmLGNBQWMsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FDekMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUNaLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDN0IsT0FBZ0IsRUFDaEIsS0FBYTtJQUViLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2YsV0FBVyxHQUFHLEtBQUssQ0FDdEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTc2hIb3N0IH0gZnJvbSBcIi4uL1NzaEhvc3QuanNcIlxuaW1wb3J0IHsgZmlsdGVyRW1wdHksIHRyaW1BbGwgfSBmcm9tIFwiLi4vdXRpbHMvYmFzZS5qc1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1N1ZG9lcihcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIHVzZXI/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdXNlcikge1xuICAgICAgICB1c2VyID0gc3NoSG9zdC5zZXR0aW5ncy51c2VyXG4gICAgfVxuXG4gICAgaWYgKCEoYXdhaXQgc3NoSG9zdC5jbWRFeGlzdHMoXCJzdWRvXCIpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNhbnQgY2hlY2sgaWYgJ1wiICsgdXNlciArIFwiJyBpcyBzdWRvZXIgaWYgc3VkbyBpcyBub3QgaW5zdGFsbGVkXCJcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGlmICh1c2VyLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2VyIG5hbWUgJ1wiICsgdXNlciArIFwiJyBpbmNsdWRlcyBzcGFjZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBzc2hIb3N0LmV4ZWMoXG4gICAgICAgIFwic3VkbyAtbCAtVSBcIiArIHVzZXIsXG4gICAgKS50aGVuKGFzeW5jICh2KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZmlsdGVyRW1wdHkoXG4gICAgICAgICAgICB2Lm91dC5zcGxpdChcIlxcblwiKVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRyaW1BbGwobGluZSkuc3RhcnRzV2l0aChcbiAgICAgICAgICAgICAgICAgICAgXCJVc2VyIFwiICsgdXNlciArIFwiIGlzIG5vdCBhbGxvd2VkIHRvIHJ1biBzdWRvXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VXNlcnMoXG4gICAgc3NoSG9zdDogU3NoSG9zdCxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gc3NoSG9zdC5leGVjKFxuICAgICAgICBcImdldGVudCBwYXNzd2RcIixcbiAgICApLnRoZW4oKHYpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckVtcHR5KFxuICAgICAgICAgICAgdi5vdXQuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAodikgPT4gdi5zcGxpdChcIjpcIilbMF1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgIClcbiAgICB9KVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFVzZXJJbkdyb3VwcyhcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIHVzZXI/OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgdXNlciA9IHNzaEhvc3Quc2V0dGluZ3MudXNlclxuICAgIH1cblxuICAgIGlmICh1c2VyLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2VyIG5hbWUgJ1wiICsgdXNlciArIFwiJyBpbmNsdWRlcyBzcGFjZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBzc2hIb3N0LmV4ZWMoXG4gICAgICAgIFwiZ3JvdXBzIFwiICsgdXNlcixcbiAgICApLnRoZW4oKHYpID0+IHtcbiAgICAgICAgbGV0IHJhdyA9IHRyaW1BbGwodi5vdXQpXG5cbiAgICAgICAgcmV0dXJuIGZpbHRlckVtcHR5KFxuICAgICAgICAgICAgcmF3LnNwbGl0KFwiOlwiKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgKVxuICAgIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1VzZXJJbkdyb3VwKFxuICAgIHNzaEhvc3Q6IFNzaEhvc3QsXG4gICAgZ3JvdXA6IHN0cmluZyxcbiAgICB1c2VyPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBncm91cHMgPSBhd2FpdCBsaXN0VXNlckluR3JvdXBzKFxuICAgICAgICBzc2hIb3N0LFxuICAgICAgICB1c2VyLFxuICAgIClcblxuICAgIHJldHVybiBncm91cHMuaW5jbHVkZXMoZ3JvdXApXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVc2VyVG9Hcm91cChcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIGdyb3VwOiBzdHJpbmcsXG4gICAgdXNlcj86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHVzZXIgPSBzc2hIb3N0LnNldHRpbmdzLnVzZXJcbiAgICB9XG5cbiAgICBpZiAodXNlci5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlciBuYW1lICdcIiArIHVzZXIgKyBcIicgaW5jbHVkZXMgc3BhY2VcIilcbiAgICB9XG4gICAgaWYgKGdyb3VwLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcm91cCBuYW1lICdcIiArIGdyb3VwICsgXCInIGluY2x1ZGVzIHNwYWNlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgXCJncGFzc3dkIC1hIFwiICsgdXNlciArIFwiIFwiICsgZ3JvdXAsXG4gICAgKS50aGVuKClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVzZXJGcm9tR3JvdXAoXG4gICAgc3NoSG9zdDogU3NoSG9zdCxcbiAgICBncm91cDogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXNlcikge1xuICAgICAgICB1c2VyID0gc3NoSG9zdC5zZXR0aW5ncy51c2VyXG4gICAgfVxuXG4gICAgaWYgKHVzZXIuaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZXIgbmFtZSAnXCIgKyB1c2VyICsgXCInIGluY2x1ZGVzIHNwYWNlXCIpXG4gICAgfVxuICAgIGlmIChncm91cC5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JvdXAgbmFtZSAnXCIgKyBncm91cCArIFwiJyBpbmNsdWRlcyBzcGFjZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBzc2hIb3N0LmV4ZWMoXG4gICAgICAgIFwiZ3Bhc3N3ZCAtZCBcIiArIHVzZXIgKyBcIiBcIiArIGdyb3VwLFxuICAgICkudGhlbigpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVHcm91cChcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIGdyb3VwOiBzdHJpbmcsXG4gICAgZ2lkPzogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGdyb3VwLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcm91cCBuYW1lICdcIiArIGdyb3VwICsgXCInIGluY2x1ZGVzIHNwYWNlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgXCJncm91cGFkZFwiICsgKHR5cGVvZiBnaWQgPT0gXCJudW1iZXJcIiA/IFwiIC1nIFwiICsgZ2lkIDogXCJcIikgK1xuICAgICAgICBcIiBcIiArIGdyb3VwLFxuICAgICkudGhlbigpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVHcm91cChcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIGdyb3VwOiBzdHJpbmcsXG4gICAgbmV3TmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGdyb3VwLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcm91cCBuYW1lICdcIiArIGdyb3VwICsgXCInIGluY2x1ZGVzIHNwYWNlXCIpXG4gICAgfVxuICAgIGlmIChuZXdOYW1lLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZXcgZ3JvdXAgbmFtZSAnXCIgKyBuZXdOYW1lICsgXCInIGluY2x1ZGVzIHNwYWNlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgXCJncm91cG1vZCAtbiBcIiArIG5ld05hbWUgKyBcIiBcIiArIGdyb3VwLFxuICAgICkudGhlbigpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVHcm91cChcbiAgICBzc2hIb3N0OiBTc2hIb3N0LFxuICAgIGdyb3VwOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZ3JvdXAuaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdyb3VwIG5hbWUgJ1wiICsgZ3JvdXAgKyBcIicgaW5jbHVkZXMgc3BhY2VcIilcbiAgICB9XG5cbiAgICByZXR1cm4gc3NoSG9zdC5leGVjKFxuICAgICAgICBcImdyb3VwZGVsIFwiICsgZ3JvdXAsXG4gICAgKS50aGVuKClcbn1cbiJdfQ==