feat: 加固 Agent CLI 执行边界并更新模型目录
收紧 SSH 命令护栏、权限校验与远程执行会话,并同步主流大模型供应商列表。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
67660ae1d6
commit
2fd1624bec
18 files changed
+480
-49
No files matched your search
@@ -19,6 +19,8 @@ type SSHExecuteTool struct {
|
||||
timeout time.Duration // 默认命令超时
|
||||
}
|
||||
|
||||
const maxSSHCommandTimeout = 300 * time.Second
|
||||
|
||||
// NewSSHExecuteTool 创建远程执行工具(内部建立 SSH 长连接) // Logan.Li
|
||||
func NewSSHExecuteTool(cfg remoteexec.SSHConfig, timeout time.Duration) (*SSHExecuteTool, error) {
|
||||
if timeout <= 0 {
|
||||
@@ -82,12 +84,12 @@ func (t *SSHExecuteTool) Execute(ctx context.Context, args map[string]interface{
|
||||
return &Result{Success: false, Error: "参数 command 不能为空"}, nil
|
||||
}
|
||||
|
||||
timeout := t.timeout
|
||||
timeout := boundedSSHTimeout(t.timeout)
|
||||
if sec := IntParam(args, "timeout"); sec > 0 {
|
||||
timeout = time.Duration(sec) * time.Second
|
||||
timeout = boundedSSHTimeout(time.Duration(sec) * time.Second)
|
||||
}
|
||||
|
||||
res, err := t.client.Exec(command, timeout)
|
||||
res, err := t.client.ExecContext(ctx, command, timeout)
|
||||
if err != nil {
|
||||
return &Result{Success: false, Error: fmt.Sprintf("SSH 连接失败: %v", err)}, nil
|
||||
}
|
||||
@@ -103,4 +105,15 @@ func (t *SSHExecuteTool) Execute(ctx context.Context, args map[string]interface{
|
||||
Output: output,
|
||||
Error: res.Error,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// boundedSSHTimeout 将模型提供的超时限制在平台允许范围内。 // Logan.Li
|
||||
func boundedSSHTimeout(timeout time.Duration) time.Duration {
|
||||
if timeout <= 0 {
|
||||
return time.Second
|
||||
}
|
||||
if timeout > maxSSHCommandTimeout {
|
||||
return maxSSHCommandTimeout
|
||||
}
|
||||
return timeout
|
||||
}
|
||||
Reference in new issue
Block a user