github.com/arunkumar7540/cli@v6.45.0+incompatible/command/v7/ssh_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/sharedaction" 5 "code.cloudfoundry.org/cli/actor/v7action" 6 "code.cloudfoundry.org/cli/command" 7 "code.cloudfoundry.org/cli/command/flag" 8 "code.cloudfoundry.org/cli/command/translatableerror" 9 "code.cloudfoundry.org/cli/command/v7/shared" 10 "code.cloudfoundry.org/cli/util/clissh" 11 ) 12 13 //go:generate counterfeiter . SharedSSHActor 14 15 type SharedSSHActor interface { 16 ExecuteSecureShell(sshClient sharedaction.SecureShellClient, sshOptions sharedaction.SSHOptions) error 17 } 18 19 //go:generate counterfeiter . SSHActor 20 21 type SSHActor interface { 22 GetSecureShellConfigurationByApplicationNameSpaceProcessTypeAndIndex(appName string, spaceGUID string, processType string, processIndex uint) (v7action.SSHAuthentication, v7action.Warnings, error) 23 } 24 25 type SSHCommand struct { 26 RequiredArgs flag.AppName `positional-args:"yes"` 27 ProcessIndex uint `long:"app-instance-index" short:"i" default:"0" description:"App process instance index"` 28 Commands []string `long:"command" short:"c" description:"Command to run"` 29 DisablePseudoTTY bool `long:"disable-pseudo-tty" short:"T" description:"Disable pseudo-tty allocation"` 30 ForcePseudoTTY bool `long:"force-pseudo-tty" description:"Force pseudo-tty allocation"` 31 LocalPortForwardSpecs []flag.SSHPortForwarding `short:"L" description:"Local port forward specification"` 32 ProcessType string `long:"process" default:"web" description:"App process name"` 33 RequestPseudoTTY bool `long:"request-pseudo-tty" short:"t" description:"Request pseudo-tty allocation"` 34 SkipHostValidation bool `long:"skip-host-validation" short:"k" description:"Skip host key validation. Not recommended!"` 35 SkipRemoteExecution bool `long:"skip-remote-execution" short:"N" description:"Do not execute a remote command"` 36 37 usage interface{} `usage:"CF_NAME ssh APP_NAME [--process PROCESS] [-i INDEX] [-c COMMAND]...\n [-L [BIND_ADDRESS:]LOCAL_PORT:REMOTE_HOST:REMOTE_PORT]... [--skip-remote-execution]\n [--disable-pseudo-tty | --force-pseudo-tty | --request-pseudo-tty] [--skip-host-validation]"` 38 relatedCommands interface{} `related_commands:"allow-space-ssh, enable-ssh, space-ssh-allowed, ssh-code, ssh-enabled"` 39 allproxy interface{} `environmentName:"all_proxy" environmentDescription:"Specify a proxy server to enable proxying for all requests"` 40 41 UI command.UI 42 Config command.Config 43 SharedActor command.SharedActor 44 Actor SSHActor 45 SSHActor SharedSSHActor 46 SSHClient *clissh.SecureShell 47 } 48 49 func (cmd *SSHCommand) Setup(config command.Config, ui command.UI) error { 50 cmd.UI = ui 51 cmd.Config = config 52 sharedActor := sharedaction.NewActor(config) 53 cmd.SharedActor = sharedActor 54 cmd.SSHActor = sharedActor 55 56 ccClient, uaaClient, err := shared.NewClients(config, ui, true, "") 57 if err != nil { 58 return err 59 } 60 61 cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient) 62 63 cmd.SSHClient = clissh.NewDefaultSecureShell() 64 65 return nil 66 } 67 68 func (cmd SSHCommand) Execute(args []string) error { 69 70 err := cmd.SharedActor.CheckTarget(true, true) 71 if err != nil { 72 return err 73 } 74 75 ttyOption, err := cmd.EvaluateTTYOption() 76 if err != nil { 77 return err 78 } 79 80 var forwardSpecs []sharedaction.LocalPortForward 81 for _, spec := range cmd.LocalPortForwardSpecs { 82 forwardSpecs = append(forwardSpecs, sharedaction.LocalPortForward(spec)) 83 } 84 85 sshAuth, warnings, err := cmd.Actor.GetSecureShellConfigurationByApplicationNameSpaceProcessTypeAndIndex( 86 cmd.RequiredArgs.AppName, 87 cmd.Config.TargetedSpace().GUID, 88 cmd.ProcessType, 89 cmd.ProcessIndex, 90 ) 91 cmd.UI.DisplayWarnings(warnings) 92 if err != nil { 93 return err 94 } 95 96 err = cmd.SSHActor.ExecuteSecureShell( 97 cmd.SSHClient, 98 sharedaction.SSHOptions{ 99 Commands: cmd.Commands, 100 Endpoint: sshAuth.Endpoint, 101 HostKeyFingerprint: sshAuth.HostKeyFingerprint, 102 LocalPortForwardSpecs: forwardSpecs, 103 Passcode: sshAuth.Passcode, 104 SkipHostValidation: cmd.SkipHostValidation, 105 SkipRemoteExecution: cmd.SkipRemoteExecution, 106 TTYOption: ttyOption, 107 Username: sshAuth.Username, 108 }) 109 if err != nil { 110 return err 111 } 112 113 return nil 114 } 115 116 // EvaluateTTYOption determines which TTY options are mutually exclusive and 117 // returns an error accordingly. 118 func (cmd SSHCommand) EvaluateTTYOption() (sharedaction.TTYOption, error) { 119 var count int 120 121 option := sharedaction.RequestTTYAuto 122 if cmd.DisablePseudoTTY { 123 option = sharedaction.RequestTTYNo 124 count++ 125 } 126 if cmd.ForcePseudoTTY { 127 option = sharedaction.RequestTTYForce 128 count++ 129 } 130 if cmd.RequestPseudoTTY { 131 option = sharedaction.RequestTTYYes 132 count++ 133 } 134 135 if count > 1 { 136 return option, translatableerror.ArgumentCombinationError{Args: []string{ 137 "--disable-pseudo-tty", "-T", "--force-pseudo-tty", "--request-pseudo-tty", "-t", 138 }} 139 } 140 141 return option, nil 142 }