管理服务器上的 ssh authorized keys 的 Nodejs 工具

管理服务器上的 ssh authorized keys 的 Nodejs 工具

俺们是一个5个人的小团队。俺任sa,有时候其他同学要临时上服务器上去看一些东西,然后,各个服务器服务器各个账户各台电脑一堆 key很麻烦,更不要说我本来就手忙脚乱的你还通过 email 把你的 key 发过来然后叫我帮你添加到 4 台服务器上每个 staging 账户下,然后我帮你添加完之后我却不记得自己本来在做什么事儿了。

所以这个工具应运而生,直接从 GitHub API 拉 keys,你可以将服务器的访问权限点一下就分配给 organization 里的公开成员们。

图:

http://ww3.sinaimg.cn/large/7a464815gw1eaxvuogu2vj212i0ridk6.jpg

这个工具使用 IcedCoffeeScript 编写,代码在: https://github.com/layerssss/sshkeyd


2 回复

管理服务器上的 ssh authorized keys 的 Node.js 工具

背景介绍

我们是一个5人的小团队,作为系统管理员(SA),我有时需要让其他团队成员临时访问服务器。然而,由于每个人都有一堆 SSH 密钥,而且这些密钥分布在不同的账户和电脑上,这使得管理和分发变得非常麻烦。此外,通过电子邮件发送密钥并手动将其添加到多台服务器的多个账户中也非常繁琐。

解决方案

为了解决这个问题,我开发了一个基于 Node.js 的工具,可以从 GitHub API 获取用户的公钥,并自动将这些公钥添加到指定的服务器账户中。这样,只需点击几下鼠标,就可以轻松地将服务器访问权限分配给组织中的公开成员。

示例代码

以下是该工具的核心逻辑,使用 IcedCoffeeScript 编写:

# 引入必要的模块
request = require 'request'
fs = require 'fs'

# GitHub API 地址
GITHUB_API = "https://api.github.com/users/"

# 用户名和服务器信息
username = "example_user"
serverInfo = {
  host: "example.com",
  user: "staging",
  port: 22
}

# 从 GitHub API 获取公钥
getPublicKey = (username, callback) ->
  url = "#{GITHUB_API}#{username}/keys"
  request.get(url, (error, response, body) ->
    if error
      console.error "Error fetching public keys:", error
      return
    keys = JSON.parse(body)
    callback(keys)
  )

# 将公钥添加到服务器的 authorized_keys 文件
addKeyToServer = (publicKey, serverInfo, callback) ->
  command = "echo '#{publicKey}' >> ~/.ssh/authorized_keys"
  options =
    host: serverInfo.host
    port: serverInfo.port
    username: serverInfo.user
    password: "your_password" # 这里可以替换成私钥或其它认证方式
  child_process.exec(command, options, (error, stdout, stderr) ->
    if error
      console.error "Error adding key to server:", error
      return
    callback()
  )

# 主函数
main = ->
  getPublicKey username, (keys) ->
    for key in keys
      addKeyToServer key.key, serverInfo, ->
        console.log "Key added successfully!"

# 执行主函数
main()

功能说明

  1. 获取公钥getPublicKey 函数从 GitHub API 获取指定用户名的公钥列表。
  2. 添加公钥到服务器addKeyToServer 函数将获取到的公钥添加到服务器的 ~/.ssh/authorized_keys 文件中。
  3. 主函数main 函数负责调用上述两个函数,并处理结果。

使用方法

  1. 安装必要的依赖包:
    npm install request
    
  2. 修改代码中的 usernameserverInfo 变量以匹配你的实际情况。
  3. 运行脚本:
    node script.coffee
    

通过这个工具,你可以轻松地将服务器访问权限分配给组织中的公开成员,大大简化了管理工作。


针对这个问题,我们可以设计一个简单的Node.js工具来管理服务器上的ssh authorized_keys文件。这个工具的主要功能是从GitHub API获取公钥,并将其自动添加到服务器的authorized_keys文件中。这将简化密钥管理和分发的过程,避免手动添加公钥带来的繁琐和错误。

以下是一个基本的实现思路:

实现步骤

  1. 获取GitHub公钥:通过GitHub API获取指定用户或组织的公钥。
  2. 解析公钥:将获取到的公钥数据进行解析。
  3. 更新授权文件:将解析后的公钥添加到服务器的authorized_keys文件中。

示例代码

这里提供一个简单的Node.js脚本示例,该脚本可以用于添加GitHub用户的公钥到指定的服务器中:

const fs = require('fs');
const fetch = require('node-fetch');

// 获取GitHub用户的公钥
async function getPublicKey(username) {
    const response = await fetch(`https://api.github.com/users/${username}/keys`);
    const data = await response.json();
    return data[0].key; // 假设只获取第一个公钥
}

// 更新服务器上的 authorized_keys 文件
function updateAuthorizedKeys(key, hostname = 'your.server.com', username = 'staging') {
    const filePath = `/home/${username}/.ssh/authorized_keys`;
    let content = '';

    if (fs.existsSync(filePath)) {
        content = fs.readFileSync(filePath, 'utf-8');
    }

    if (!content.includes(key)) {
        content += `\n${key}`;
        fs.writeFileSync(filePath, content);
        console.log(`Key added to ${filePath}`);
    } else {
        console.log('Key already exists.');
    }
}

(async () => {
    const publicKey = await getPublicKey('your-github-username');
    updateAuthorizedKeys(publicKey);
})();

注意事项

  • 需要安装node-fetch库来处理HTTP请求。可以通过运行npm install node-fetch来安装。
  • 确保脚本有足够的权限去修改服务器上的.ssh/authorized_keys文件。
  • 在实际部署时,建议对敏感操作(如SSH密钥管理)进行额外的安全检查和日志记录。

这个简单的脚本可以帮助自动化公钥管理过程,减少人为错误,提高效率。

回到顶部