You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在x/crypto/ssh会话中将默认Shell设置为pwsh

如何在x/crypto/ssh会话中默认使用pwsh替代bash?

针对Docker容器间SSH会话需要默认用pwsh执行PowerShell脚本的场景,可通过以下两种方式实现:

方法一:客户端连接时指定启动pwsh

无需依赖远程容器的默认Shell配置,直接在创建SSH会话后指定启动pwsh,适用于仅需当前会话使用pwsh的场景。

示例Go代码:

package main

import (
	"io"
	"log"
	"os"

	"golang.org/x/crypto/ssh"
)

func main() {
	// 配置SSH客户端参数
	config := &ssh.ClientConfig{
		User: "your-username",
		Auth: []ssh.AuthMethod{
			ssh.Password("your-password"),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境请替换为安全的主机密钥验证逻辑
	}

	// 建立与目标容器的SSH连接
	client, err := ssh.Dial("tcp", "target-container-ip:22", config)
	if err != nil {
		log.Fatalf("连接失败: %v", err)
	}
	defer client.Close()

	// 创建SSH会话
	session, err := client.NewSession()
	if err != nil {
		log.Fatalf("创建会话失败: %v", err)
	}
	defer session.Close()

	// 绑定本地输入输出到会话(如需交互模式)
	session.Stdout = os.Stdout
	session.Stderr = os.Stderr
	session.Stdin = os.Stdin

	// 请求伪终端(仅交互模式需要)
	err = session.RequestPty("xterm", 80, 40, ssh.TerminalModes{})
	if err != nil {
		log.Fatalf("请求伪终端失败: %v", err)
	}

	// 启动pwsh作为会话的初始Shell(替换为容器内pwsh的实际路径)
	err = session.Run("/usr/bin/pwsh")
	if err != nil {
		log.Fatalf("启动pwsh失败: %v", err)
	}
}

若需直接执行指定PowerShell脚本,可将session.Run的参数改为:

err = session.Run("/usr/bin/pwsh -File /path/to/your/script.ps1")

方法二:修改目标容器的SSH服务配置

若希望所有SSH连接到该容器都默认使用pwsh,可修改容器内的SSHD配置:

  1. 进入目标容器,编辑/etc/ssh/sshd_config,添加或修改以下配置:
ForceCommand /usr/bin/pwsh

或者修改目标用户的默认Shell(以root用户为例):

chsh -s /usr/bin/pwsh root
  1. 重启容器内的SSHD服务(根据容器内的初始化方式选择命令,例如systemctl restart sshd或直接重启sshd进程)

注意事项

  • 确认目标容器已正确安装pwsh,可通过which pwsh命令获取其实际路径
  • 非交互执行脚本时,可省略RequestPty伪终端请求步骤
  • 生产环境禁止使用InsecureIgnoreHostKey(),需配置合法的主机密钥验证逻辑

内容的提问来源于stack exchange,提问作者mieliespoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:55:11