dsh-ssh-logs
模型与 MCP 活跃维护

dsh-ssh-logs

452926826/dsh-ssh-logs

提供基于SSH协议读取会话白名单内远程日志的能力,可对接会话链路自动拉取合规日志,配置轻量无额外依赖,支持多格式输出,方便排查会话问题。

0
Stars 标星
0
Forks 分支
0
Watchers 关注
0
Open Issues
JavaScript
主要语言
MIT
开源协议
30 KB
仓库大小
26 天前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:452926826/dsh-ssh-logs
git clone https://github.com/452926826/dsh-ssh-logs.git
git clone git@github.com:452926826/dsh-ssh-logs.git
README.md main

dsh-ssh-logs

English | 简体中文

A read-only SSH log tool for DeepSeek Harness. It uses the built-in @deepseek-ai/dsh-mcp-client bridge to expose three MCP tools to the model:

  • mcp__ssh_logs__list_log_servers
  • mcp__ssh_logs__read_log
  • mcp__ssh_logs__search_log

Servers are configured under fixed aliases. The model cannot select arbitrary hosts, execute arbitrary commands, or modify remote files. Every requested file must remain under an allowlisted log root.

Installation

git clone https://github.com/452926826/dsh-ssh-logs.git
cd dsh-ssh-logs
npm install
dsh plugin --profile web add "$PWD"

It can also be installed directly from GitHub:

dsh plugin --profile web add github:452926826/dsh-ssh-logs

Create ~/.dsh/ssh-logs.yml using config.example.yml as a reference. Use a dedicated read-only account on each server and authenticate with an SSH key or ssh-agent. Do not store passwords or private key contents in the YAML file.

Restart dsh web and refresh the page after configuring the plugin. The Bundle registers an MCP client so agent presets can discover the log tools.

Conversation examples

Read the last 300 lines of service/api.log from the app log root on production.

Search logs/backend.log under staging/app for request-id=abc123 and include 3 lines of context.

If a request names a physical directory instead of a root alias, the model should call list_log_servers first, map the directory to a configured root, and then call the read or search tool.

Configuration

defaults:
  maxBytes: 131072
  connectTimeoutSeconds: 10
  commandTimeoutMs: 120000

servers:
  production:
    description: Production application server
    host: prod-app.example.com
    user: log-reader
    port: 22
    identityFile: ~/.ssh/prod_log_reader
    knownHostsFile: ~/.ssh/known_hosts
    proxyJump: bastion.example.com
    roots:
      app: /srv/myapp/logs
      nginx: /var/log/nginx

Each server supports description, host, user, port, identityFile, knownHostsFile, proxyJump, roots, maxBytes, connectTimeoutSeconds, and commandTimeoutMs.

Security boundaries

  • SSH always uses BatchMode=yes, StrictHostKeyChecking=yes, and an explicit known_hosts path.
  • Servers and log roots must be configured in advance. Absolute paths, backslashes, and .. traversal are rejected.
  • The plugin only generates fixed head, tail, sed, and grep -F commands. Dynamic values are shell-quoted.
  • A request can read at most 5,000 lines or return 1,000 search matches. Output defaults to 128 KiB and has a hard 4 MiB limit.
  • Password prompts, sudo, arbitrary commands, SFTP writes, deletion, and file modification are not supported.

Enforce least privilege on the server as well: use a dedicated log-reader account, read-only ACLs, restricted source IPs, and authorized_keys restrictions when appropriate.