如何在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配置:
- 进入目标容器,编辑
/etc/ssh/sshd_config,添加或修改以下配置:
ForceCommand /usr/bin/pwsh
或者修改目标用户的默认Shell(以root用户为例):
chsh -s /usr/bin/pwsh root
- 重启容器内的SSHD服务(根据容器内的初始化方式选择命令,例如
systemctl restart sshd或直接重启sshd进程)
注意事项
- 确认目标容器已正确安装pwsh,可通过
which pwsh命令获取其实际路径 - 非交互执行脚本时,可省略
RequestPty伪终端请求步骤 - 生产环境禁止使用
InsecureIgnoreHostKey(),需配置合法的主机密钥验证逻辑
内容的提问来源于stack exchange,提问作者mieliespoor
相关产品推荐
相关产品推荐

