fix: fix ssh bug (#99)

This commit is contained in:
naison
2023-11-28 20:21:11 +08:00
committed by GitHub
parent 5cc64d17c2
commit abf36b87a6
3 changed files with 77 additions and 15 deletions

View File

@@ -7,11 +7,70 @@ PREVIOUS_RELEASE=${PREVIOUS_RELEASE:-$1}
CHANGELOG=$(git log --no-merges --date=short --pretty=format:'- %h %an %ad %s' "${PREVIOUS_RELEASE}".."${RELEASE}") CHANGELOG=$(git log --no-merges --date=short --pretty=format:'- %h %an %ad %s' "${PREVIOUS_RELEASE}".."${RELEASE}")
cat <<EOF cat <<EOF
## ${RELEASE} # KubeVPN release ${RELEASE}
KubeVPN ${RELEASE} is available now ! 🎉 KubeVPN ${RELEASE} is available now ! 🎉
- fix known bugs 🛠
## Installation and Upgrading ## Download KubeVPN for your platform
wget -LO "https://github.com/KubeNetworks/kubevpn/releases/download/$(curl -L -s https://raw.githubusercontent.com/KubeNetworks/kubevpn/master/plugins/stable.txt)/kubevpn_$(curl -L -s https://raw.githubusercontent.com/KubeNetworks/kubevpn/master/plugins/stable.txt)_darwin_amd64.zip"
**Mac** (x86-64/Intel)
\`\`\`
curl -Lo kubevpn.zip https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_darwin_amd64.zip && unzip -d kubevpn kubevpn.zip
\`\`\`
**Mac** (AArch64/Apple M1 silicon)
\`\`\`
curl -Lo kubevpn.zip https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_darwin_arm64.zip && unzip -d kubevpn kubevpn.zip
\`\`\`
**Linux** (x86-64)
\`\`\`
curl -Lo kubevpn.zip https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_linux_amd64.zip && unzip -d kubevpn kubevpn.zip
\`\`\`
**Linux** (AArch64)
\`\`\`
curl -Lo kubevpn.zip https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_linux_arm64.zip && unzip -d kubevpn kubevpn.zip
\`\`\`
**Linux** (i386)
\`\`\`
curl -Lo kubevpn.zip https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_linux_386.zip && unzip -d kubevpn kubevpn.zip
\`\`\`
**Windows** (x86-64)
\`\`\`
curl -LO https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_windows_amd64.zip
\`\`\`
**Windows** (AArch64)
\`\`\`
curl -LO https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_windows_arm64.zip
\`\`\`
**Windows** (i386)
\`\`\`
curl -LO https://github.com/KubeNetworks/kubevpn/releases/download/${RELEASE}/kubevpn_${RELEASE}_windows_386.zip
\`\`\`
## Checksums
SHA256 checksums available for compiled binaries.
Run \`shasum -a 256 -c checksums.txt\` to verify.
## Upgrading
Run \`kubevpn upgrade\` to upgrade from a previous version.
## Changelog ## Changelog
${CHANGELOG} ${CHANGELOG}
EOF EOF

View File

@@ -1,11 +1,13 @@
package cmds package cmds
import ( import (
"fmt"
"io" "io"
"os" "os"
"strings" "strings"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"golang.org/x/crypto/ssh/terminal"
"golang.org/x/net/websocket" "golang.org/x/net/websocket"
cmdutil "k8s.io/kubectl/pkg/cmd/util" cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/util/i18n" "k8s.io/kubectl/pkg/util/i18n"
@@ -62,6 +64,15 @@ func CmdSSH(_ cmdutil.Factory) *cobra.Command {
if err != nil { if err != nil {
return err return err
} }
fd := int(os.Stdin.Fd())
if !terminal.IsTerminal(fd) {
return fmt.Errorf("stdin is not a terminal")
}
state, err := terminal.MakeRaw(fd)
if err != nil {
return fmt.Errorf("terminal make raw: %s", err)
}
defer terminal.Restore(fd, state)
go io.Copy(conn, os.Stdin) go io.Copy(conn, os.Stdin)
_, err = io.Copy(os.Stdout, conn) _, err = io.Copy(os.Stdout, conn)
return err return err

View File

@@ -196,19 +196,11 @@ func (w *wsHandler) terminal(conf *util.SshConfig, conn *websocket.Conn) error {
session.Stdin = conn session.Stdin = conn
fd := int(os.Stdin.Fd()) fd := int(os.Stdin.Fd())
if !terminal.IsTerminal(fd) {
state, err := terminal.MakeRaw(fd)
if err != nil {
w.Log("Terminal make raw: %s", err)
return fmt.Errorf("terminal make raw: %s", err)
}
defer terminal.Restore(fd, state)
}
width, height, err := terminal.GetSize(fd) width, height, err := terminal.GetSize(fd)
if err != nil { if err != nil {
w.Log("Terminal get size: %s", err) w.Log("Terminal get size: %s", err)
return fmt.Errorf("terminal get size: %s", err) width = 80
height = 40
} }
modes := ssh.TerminalModes{ modes := ssh.TerminalModes{
ssh.ECHO: 1, ssh.ECHO: 1,
@@ -302,7 +294,7 @@ func (w *wsHandler) Log(format string, a ...any) {
if len(a) != 0 { if len(a) != 0 {
str = fmt.Sprintf(format, a...) str = fmt.Sprintf(format, a...)
} }
w.conn.Write([]byte(str + "\n")) w.conn.Write([]byte(str + "\r\n"))
} }
func (w *wsHandler) PrintLine(msg string) { func (w *wsHandler) PrintLine(msg string) {