@@ -3,7 +3,6 @@ package scanner
3
3
import (
4
4
"fmt"
5
5
"math/rand"
6
- "net"
7
6
"net/http"
8
7
"os"
9
8
ex "os/exec"
@@ -335,7 +334,7 @@ func (s Scanner) detectServerOSes() (servers, errServers []osTypeInterface) {
335
334
}
336
335
337
336
func validateSSHConfig (c * config.ServerInfo ) error {
338
- if isLocalExec (c .Port , c .Host ) {
337
+ if isLocalExec (c .Port , c .Host ) || c . Type == constant . ServerTypePseudo {
339
338
return nil
340
339
}
341
340
@@ -360,6 +359,9 @@ func validateSSHConfig(c *config.ServerInfo) error {
360
359
if c .User != "" {
361
360
sshConfigCmd = append (sshConfigCmd , "-l" , c .User )
362
361
}
362
+ if len (c .JumpServer ) > 0 {
363
+ sshConfigCmd = append (sshConfigCmd , "-J" , strings .Join (c .JumpServer , "," ))
364
+ }
363
365
sshConfigCmd = append (sshConfigCmd , c .Host )
364
366
cmd := strings .Join (sshConfigCmd , " " )
365
367
logging .Log .Debugf ("Executing... %s" , strings .Replace (cmd , "\n " , "" , - 1 ))
@@ -369,41 +371,49 @@ func validateSSHConfig(c *config.ServerInfo) error {
369
371
}
370
372
371
373
var (
372
- hostname string
373
- globalKnownHosts string
374
- userKnownHosts string
374
+ hostname string
375
+ strictHostKeyChecking string
376
+ globalKnownHosts string
377
+ userKnownHosts string
378
+ proxyCommand string
379
+ proxyJump string
375
380
)
376
381
for _ , line := range strings .Split (r .Stdout , "\n " ) {
377
- if strings .HasPrefix (line , "user " ) {
382
+ switch {
383
+ case strings .HasPrefix (line , "user " ):
378
384
user := strings .TrimPrefix (line , "user " )
379
385
logging .Log .Debugf ("Setting SSH User:%s for Server:%s ..." , user , c .GetServerName ())
380
386
c .User = user
381
- } else if strings .HasPrefix (line , "hostname " ) {
387
+ case strings .HasPrefix (line , "hostname " ):
382
388
hostname = strings .TrimPrefix (line , "hostname " )
383
- logging .Log .Debugf ("Validating SSH HostName:%s for Server:%s ..." , hostname , c .GetServerName ())
384
- if _ , err := net .LookupHost (hostname ); err != nil {
385
- return xerrors .New ("Failed to name resolution. Please check the HostName settings for SSH" )
386
- }
387
- } else if strings .HasPrefix (line , "port " ) {
389
+ case strings .HasPrefix (line , "port " ):
388
390
port := strings .TrimPrefix (line , "port " )
389
391
logging .Log .Debugf ("Setting SSH Port:%s for Server:%s ..." , port , c .GetServerName ())
390
392
c .Port = port
391
- } else if strings .HasPrefix (line , "globalknownhostsfile " ) {
393
+ case strings .HasPrefix (line , "stricthostkeychecking " ):
394
+ strictHostKeyChecking = strings .TrimPrefix (line , "stricthostkeychecking " )
395
+ case strings .HasPrefix (line , "globalknownhostsfile " ):
392
396
globalKnownHosts = strings .TrimPrefix (line , "globalknownhostsfile " )
393
- } else if strings .HasPrefix (line , "userknownhostsfile " ) {
397
+ case strings .HasPrefix (line , "userknownhostsfile " ):
394
398
userKnownHosts = strings .TrimPrefix (line , "userknownhostsfile " )
399
+ case strings .HasPrefix (line , "proxycommand " ):
400
+ proxyCommand = strings .TrimPrefix (line , "proxycommand " )
401
+ case strings .HasPrefix (line , "proxyjump " ):
402
+ proxyJump = strings .TrimPrefix (line , "proxyjump " )
395
403
}
396
404
}
397
405
if c .User == "" || c .Port == "" {
398
406
return xerrors .New ("Failed to find User or Port setting. Please check the User or Port settings for SSH" )
399
407
}
408
+ if strictHostKeyChecking == "false" || proxyCommand != "" || proxyJump != "" {
409
+ return nil
410
+ }
400
411
401
412
logging .Log .Debugf ("Checking if the host's public key is in known_hosts..." )
402
-
403
413
knownHostsPaths := []string {}
404
414
for _ , knownHosts := range []string {userKnownHosts , globalKnownHosts } {
405
415
for _ , knownHost := range strings .Split (knownHosts , " " ) {
406
- if knownHost != "" {
416
+ if knownHost != "" && knownHost != "/dev/null" {
407
417
knownHostsPaths = append (knownHostsPaths , knownHost )
408
418
}
409
419
}
0 commit comments